{"record":{"id":"95350ce96af9e99b","repo":"jaegertracing/jaeger","slug":"w-it-does-not-index-the-q-level","errorCode":null,"errorMessage":"%w: it does not index the %q level","messagePattern":"%w: it does not index the %q level","errorType":"validation","errorClass":"ErrFilterUnsupported","httpStatus":null,"severity":"error","filePath":"internal/storage/v2/api/tracestore/admission.go","lineNumber":95,"sourceCode":"\t\tvar level expression.Level\n\t\tswitch term := arg.(type) {\n\t\tcase *expression.Call:\n\t\t\tif err := c.EnsureSupported(term); err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tcontinue\n\t\tcase *expression.AttributeRef:\n\t\t\tlevel = term.Level\n\t\tcase *expression.FieldRef:\n\t\t\tlevel = term.Level\n\t\tcase *expression.NestedRef:\n\t\t\tlevel = term.Level\n\t\tdefault:\n\t\t\t// A constant carries nothing a Reader has to support.\n\t\t\tcontinue\n\t\t}\n\t\tif !c.SupportsLevel(level) {\n\t\t\treturn fmt.Errorf(\"%w: it does not index the %q level\", ErrFilterUnsupported, level)\n\t\t}\n\t}\n\treturn nil\n}\n","sourceCodeStart":77,"sourceCodeEnd":100,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/internal/storage/v2/api/tracestore/admission.go#L77-L100","documentation":"EnsureSupported also checks that the Reader indexes the data level (trace, span, or span attribute) referenced by each AttributeRef in the filter. If the Reader's capability set excludes that level, it returns ErrFilterUnsupported with the level name.","triggerScenarios":"Passing a filter that references, say, a trace-level attribute to a Reader that only supports span-level or span-attribute-level predicates (SupportsLevel false for that Level), at any nesting depth of the expression.","commonSituations":"Filters authored for one storage backend (which indexes a level) run against another (which does not, e.g. some v2 adapters over legacy stores); programmatic filter builders that emit attributes at levels the user never chose.","solutions":["Rewrite the predicate to a level the Reader supports (e.g. match as a span attribute instead of trace level).","Drop predicates on non-indexed levels.","Pre-validate with legacy/reader capabilities via EnsureSupported before querying."],"exampleFix":"// before\nexpr := expression.Eq(expression.TraceAttribute(\"x\"), \"y\") // reader lacks trace level\n// after\nexpr := expression.Eq(expression.SpanAttribute(\"x\"), \"y\") // indexed level","handlingStrategy":"validation","validationCode":"caps := reader.FilterCapabilities()\nexpression.WalkRefs(filter, func(ref *expression.AttributeRef) {\n  if !caps.SupportsLevel(ref.Level) {\n    panic(fmt.Sprintf(\"level %q not indexed by reader\", ref.Level))\n  }\n})","typeGuard":null,"tryCatchPattern":"if err := reader.FindTraces(ctx, traces, q); err != nil {\n  if errors.Is(err, tracestore.ErrFilterUnsupported) && strings.Contains(err.Error(), \"level\") {\n    filter = lowerToSpanLevel(filter)\n  }\n}","preventionTips":["Express predicates at span-attribute level by default.","Check SupportsLevel for every AttributeRef when building filters dynamically.","Keep per-backend level support documented next to filter builders."],"tags":["filter","validation","tracestore"],"backgroundTag":"unsupported-filter-level","analyzedSha":"806f4447841ecdb60519f408b004a599d515f437","analyzedAt":"2026-09-01T02:39:22.140Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}