{"record":{"id":"ac0c954d42e872c4","repo":"jaegertracing/jaeger","slug":"cannot-find-query-interceptor-extension-q-make-s","errorCode":null,"errorMessage":"cannot find query interceptor extension %q (make sure it is defined under extensions: and enabled in service.extensions)","messagePattern":"cannot find query interceptor extension %q \\(make sure it is defined under extensions: and enabled in service\\.extensions\\)","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/jaeger/internal/extension/jaegerquery/queryinterceptor/resolver.go","lineNumber":40,"sourceCode":")\n\n// Resolve looks up the extensions named by ids on the collector host and asserts\n// that each implements the public Interceptor contract, returning them in order.\n// An empty ids slice yields no interceptors (and no error).\n//\n// This mirrors the OpenTelemetry Collector's auth-extension mechanism: a\n// component references an extension by component.ID in its config and resolves\n// it from host.GetExtensions() at start time.\nfunc Resolve(host component.Host, ids []component.ID) ([]pub.Interceptor, error) {\n\tif len(ids) == 0 {\n\t\treturn nil, nil\n\t}\n\textensions := host.GetExtensions()\n\tinterceptors := make([]pub.Interceptor, 0, len(ids))\n\tfor _, id := range ids {\n\t\tcomp, ok := extensions[id]\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\n\t\t\t\t\"cannot find query interceptor extension %q (make sure it is defined under extensions: and enabled in service.extensions)\",\n\t\t\t\tid,\n\t\t\t)\n\t\t}\n\t\tinterceptor, ok := comp.(pub.Interceptor)\n\t\tif !ok {\n\t\t\treturn nil, fmt.Errorf(\"extension %q does not implement queryinterceptor.Interceptor\", id)\n\t\t}\n\t\tinterceptors = append(interceptors, interceptor)\n\t}\n\treturn interceptors, nil\n}\n","sourceCodeStart":22,"sourceCodeEnd":53,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/cmd/jaeger/internal/extension/jaegerquery/queryinterceptor/resolver.go#L22-L53","documentation":"Resolve looks up each requested query interceptor by component ID in the OpenTelemetry collector host's extension map. The ID was configured for the query service but no extension with that ID exists (or it exists but was not enabled in service.extensions), so the lookup fails. Jaeger tells you exactly which YAML keys to fix.","triggerScenarios":"queryinterceptor.Resolve is called during extension Start with a list of interceptor IDs (from the jaeger_query extension config) where extensions[id] is missing from host.GetExtensions() — either the extension is not defined under `extensions:` or not listed under `service.extensions`.","commonSituations":"Typo between the ID under `extensions:` and the jaeger_query interceptor list; forgetting to add the new extension to `service.extensions` so it is defined but never instantiated; renaming an extension config key; copy-pasting config between deployments where the extension was removed.","solutions":["Add the extension under the `extensions:` section of the collector config with the exact ID referenced by jaeger_query.","Enable it by listing the same ID under `service.extensions`.","Fix typos so the interceptor ID in jaeger_query config matches the defined extension ID exactly.","Validate the full config with the collector's config validation before starting."],"exampleFix":"// before\nextensions:\n  jaeger_query/xyz: {}\nservice:\n  extensions: []\n// after\nextensions:\n  jaeger_query/xyz: {}\nservice:\n  extensions: [jaeger_query/xyz]","handlingStrategy":"validation","validationCode":"// preflight: every interceptor id must be both defined and enabled\ndefined := set(config.Extensions)\nenabled := set(config.Service.Extensions)\nfor _, id := range config.JaegerQuery.Interceptors {\n    if !defined[id] || !enabled[id] {\n        return fmt.Errorf(\"interceptor %q not defined/enabled\", id)\n    }\n}","typeGuard":null,"tryCatchPattern":"interceptors, err := resolver.Resolve(host, ids)\nif err != nil {\n    return fmt.Errorf(\"starting jaeger_query: %w\", err) // fatal at startup by design\n}","preventionTips":["Keep interceptor IDs and extension IDs in one shared config variable.","Always add new extensions to service.extensions, not just extensions:.","Validate collector config (otelcol validate) in CI."],"tags":["config","otel-collector","extensions","startup"],"backgroundTag":"missing-extension-definition","analyzedSha":"806f4447841ecdb60519f408b004a599d515f437","analyzedAt":"2026-09-01T02:39:22.140Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}