{"record":{"id":"4417419e30db3c58","repo":"nats-io/nats-server","slug":"bad-service-response-type","errorCode":null,"errorMessage":"bad service response type","messagePattern":"bad service response type","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"server/errors.go","lineNumber":117,"sourceCode":"\n\t// ErrAccountExists is returned when an account is attempted to be registered\n\t// but already exists.\n\tErrAccountExists = errors.New(\"account exists\")\n\n\t// ErrBadAccount represents a malformed or incorrect account.\n\tErrBadAccount = errors.New(\"bad account\")\n\n\t// ErrReservedAccount represents a reserved account that can not be created.\n\tErrReservedAccount = errors.New(\"reserved account\")\n\n\t// ErrMissingAccount is returned when an account does not exist.\n\tErrMissingAccount = errors.New(\"account missing\")\n\n\t// ErrMissingService is returned when an account does not have an exported service.\n\tErrMissingService = errors.New(\"service missing\")\n\n\t// ErrBadServiceType is returned when latency tracking is being applied to non-singleton response types.\n\tErrBadServiceType = errors.New(\"bad service response type\")\n\n\t// ErrBadSampling is returned when the sampling for latency tracking is not 1 >= sample <= 100.\n\tErrBadSampling = errors.New(\"bad sampling percentage, should be 1-100\")\n\n\t// ErrAccountValidation is returned when an account has failed validation.\n\tErrAccountValidation = errors.New(\"account validation failed\")\n\n\t// ErrAccountExpired is returned when an account has expired.\n\tErrAccountExpired = errors.New(\"account expired\")\n\n\t// ErrNoAccountResolver is returned when we attempt an update but do not have an account resolver.\n\tErrNoAccountResolver = errors.New(\"account resolver missing\")\n\n\t// ErrAccountResolverUpdateTooSoon is returned when we attempt an update too soon to last request.\n\tErrAccountResolverUpdateTooSoon = errors.New(\"account resolver update too soon\")\n\n\t// ErrAccountResolverSameClaims is returned when same claims have been fetched.\n\tErrAccountResolverSameClaims = errors.New(\"account resolver no new claims\")","sourceCodeStart":99,"sourceCodeEnd":135,"githubUrl":"https://github.com/nats-io/nats-server/blob/3a66a489d262bf89b71a71c955c94920394532f3/server/errors.go#L99-L135","documentation":"ErrBadServiceType is returned when service latency tracking is being applied to a service whose response type is not Singleton. Latency tracking in nats-server only supports request-reply services with singleton responses; attaching it to a service export with a different response type (e.g. Stream/Chunked) is rejected.","triggerScenarios":"Calling Account.TrackServiceExportWithSampling(service, respType, sampling) where the exported service's ea.respType is anything other than Singleton — e.g. a streaming response service — at server/accounts.go:1309.","commonSituations":"Developers enabling latency tracking on a service export that was configured for streaming/chunked responses; copy-pasting tracking setup between singleton and streaming services; upgrading code where a service changed response type but the tracking call was not updated.","solutions":["Only enable latency tracking on services whose response type is Singleton","Change the service export to Singleton if request-reply latency tracking is desired","Remove the tracking call for non-singleton (streaming) services; latency sampling is unsupported for them","Guard the call by checking the export's response type before enabling tracking"],"exampleFix":"// before\nacc.AddServiceImport(other, \"stream.svc\", \"\")\nacc.TrackServiceExportWithSampling(\"stream.svc\", \"results\", 50) // streaming respType\n// after\nacc.AddServiceImport(other, \"req.svc\", \"\") // Singleton response\nerr := acc.TrackServiceExportWithSampling(\"req.svc\", \"results\", 50)","handlingStrategy":"validation","validationCode":"// confirm the export is Singleton before enabling latency tracking\nif ea := acc.exports.services[svc]; ea == nil || ea.respType != Singleton {\n\treturn fmt.Errorf(\"latency tracking requires Singleton response type for %q\", svc)\n}","typeGuard":"func isSingletonService(acc *Account, svc string) bool {\n\tacc.mu.RLock(); defer acc.mu.RUnlock()\n\tif acc.exports == nil || acc.exports.services == nil { return false }\n\tea := acc.exports.services[svc]\n\treturn ea != nil && ea.respType == Singleton\n}","tryCatchPattern":"if err := acc.TrackServiceExportWithSampling(svc, resp, 100); err != nil {\n\tif errors.Is(err, ErrBadServiceType) { /* skip tracking for streaming services */ }\n}","preventionTips":["Only enable latency tracking on request-reply (Singleton) services","Re-check tracking setup whenever a service's response type changes","Document which exports support latency sampling"],"tags":["nats","server","service-latency","response-type"],"backgroundTag":"unsupported-service-response-type","analyzedSha":"3a66a489d262bf89b71a71c955c94920394532f3","analyzedAt":"2026-09-02T04:41:54.247Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}