{"record":{"id":"07d974f634d9f4b2","repo":"jaegertracing/jaeger","slug":"errunsupported-07d974","errorCode":"ErrUnsupported","errorMessage":"remote storage does not report its capabilities: %w","messagePattern":"remote storage does not report its capabilities: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"warning","filePath":"internal/storage/v2/grpc/tracereader.go","lineNumber":61,"sourceCode":"\treturn &TraceReader{\n\t\tclient:       storage.NewTraceReaderClient(conn),\n\t\tcapabilities: storage.NewCapabilitiesClient(conn),\n\t}\n}\n\n// SearchCapabilities asks the remote backend what it supports and remembers the answer. A\n// backend that does not serve the Capabilities service answers UNIMPLEMENTED, which becomes\n// ErrUnsupported, so the caller assumes the least capable backend and a backend predating the\n// service keeps working (RFC 0013 §3.6).\nfunc (tr *TraceReader) SearchCapabilities(ctx context.Context) (tracestore.SearchCapabilities, error) {\n\tif caps := tr.cachedCaps.Load(); caps != nil {\n\t\treturn *caps, nil\n\t}\n\n\tresp, err := tr.capabilities.GetCapabilities(ctx, &storage.GetCapabilitiesRequest{})\n\tif err != nil {\n\t\tif status.Code(err) == codes.Unimplemented {\n\t\t\treturn tracestore.SearchCapabilities{}, fmt.Errorf(\n\t\t\t\t\"remote storage does not report its capabilities: %w\", errors.ErrUnsupported,\n\t\t\t)\n\t\t}\n\t\treturn tracestore.SearchCapabilities{}, err\n\t}\n\tcaps := tracestore.SearchCapabilities{\n\t\tWithoutServiceName:  resp.GetSearch().GetWithoutServiceName(),\n\t\tSameSpanConjunction: resp.GetSearch().GetSameSpanConjunction(),\n\t\tFilter:              fromProtoFilterCapabilities(resp.GetSearch().GetFilter()),\n\t}\n\ttr.cachedCaps.Store(&caps)\n\treturn caps, nil\n}\n\nfunc (tr *TraceReader) GetTraces(\n\tctx context.Context,\n\ttraceIDs ...tracestore.GetTraceParams,\n) iter.Seq2[[]ptrace.Traces, error] {","sourceCodeStart":43,"sourceCodeEnd":79,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/internal/storage/v2/grpc/tracereader.go#L43-L79","documentation":"TraceReader.SearchCapabilities queries the remote storage for its search capabilities. If the server returns gRPC Unimplemented (older backend lacking the GetCapabilities RPC), the reader reports both search capabilities as unsupported by wrapping errors.ErrUnsupported.","triggerScenarios":"Calling SearchCapabilities against a remote storage server built from an older jaeger version or a plugin that does not implement storage/v2 GetCapabilities.","commonSituations":"Version skew: jaeger query component newer than the remote storage plugin; using v1-only remote storage backends; proxying to a backend without capability reporting.","solutions":["Upgrade the remote storage server to a jaeger version implementing GetCapabilities","Treat the ErrUnsupported result as 'no search capabilities' and degrade gracefully","Check status.Code(err) == codes.Unimplemented in callers to branch on unsupported","Remove the version-skewed proxy/adapter between query and storage"],"exampleFix":"// before\ncaps, err := reader.SearchCapabilities(ctx)\nif err != nil { return err }\n// after\ncaps, err := reader.SearchCapabilities(ctx)\nif errors.Is(err, errors.ErrUnsupported) {\n    caps = tracestore.SearchCapabilities{} // treat as unsupported\n}","handlingStrategy":"fallback","validationCode":null,"typeGuard":"func isUnsupported(err error) bool {\n    return errors.Is(err, errors.ErrUnsupported)\n}","tryCatchPattern":"caps, err := reader.SearchCapabilities(ctx)\nif err != nil {\n    if errors.Is(err, errors.ErrUnsupported) {\n        caps = tracestore.SearchCapabilities{}\n    } else {\n        return err\n    }\n}","preventionTips":["Align jaeger component versions across query and storage","Check remote storage version supports storage/v2 APIs","Document capability requirements for custom plugins"],"tags":["grpc","storage","capabilities","version-skew"],"backgroundTag":"grpc-unimplemented","analyzedSha":"806f4447841ecdb60519f408b004a599d515f437","analyzedAt":"2026-09-01T02:39:22.140Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}