{"record":{"id":"18021911dcb60fc6","repo":"jaegertracing/jaeger","slug":"at-least-one-storage-backend-is-required","errorCode":null,"errorMessage":"at least one storage backend is required","messagePattern":"at least one storage backend is required","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/internal/storageconfig/config.go","lineNumber":186,"sourceCode":"\tif cfg.Opensearch != nil {\n\t\tbackends = append(backends, \"opensearch\")\n\t}\n\tif cfg.ClickHouse != nil {\n\t\tbackends = append(backends, \"clickhouse\")\n\t}\n\tif len(backends) == 0 {\n\t\treturn errors.New(\"empty configuration\")\n\t}\n\tif len(backends) > 1 {\n\t\treturn fmt.Errorf(\"multiple backend types found for metric storage: %v\", backends)\n\t}\n\treturn nil\n}\n\n// Validate validates the storage configuration.\nfunc (c *Config) Validate() error {\n\tif len(c.TraceBackends) == 0 {\n\t\treturn errors.New(\"at least one storage backend is required\")\n\t}\n\tfor name, b := range c.TraceBackends {\n\t\tif err := b.Validate(); err != nil {\n\t\t\treturn fmt.Errorf(\"trace storage '%s': %w\", name, err)\n\t\t}\n\t}\n\tfor name, b := range c.MetricBackends {\n\t\tif err := b.Validate(); err != nil {\n\t\t\treturn fmt.Errorf(\"metric storage '%s': %w\", name, err)\n\t\t}\n\t}\n\treturn nil\n}\n","sourceCodeStart":168,"sourceCodeEnd":200,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/cmd/internal/storageconfig/config.go#L168-L200","documentation":"errUnsupportedField reports that the named built-in field of the given level (a reference like duration, service name, etc.) is not supported by this backend's filter engine. The filter is rejected with tracestore.ErrFilterUnsupported since the engine has no mapping from that built-in field to an indexed Elasticsearch field.","triggerScenarios":"Submitting a filter that dereferences a built-in field on a level where buildComparison/buildExists has no case for it — e.g. a built-in field name that exists in the expression model but is not mapped in this tracestore.","commonSituations":"Using a field added in a newer expression model than the deployed backend supports; typos or case differences in built-in field names; copying filters from backends with richer built-in field sets.","solutions":["Use a built-in field name the backend supports (verify against the tracestore's field list/capabilities).","Move the value into a span attribute and filter on the attribute instead of the unsupported built-in field.","Upgrade the backend if the field is supported in a newer version."],"exampleFix":"// before\n{\"field\": \"client.city\", \"op\": \"eq\", \"value\": \"NYC\"}\n// after\n{\"attr\": \"client.city\", \"op\": \"eq\", \"value\": \"NYC\"}","handlingStrategy":"validation","validationCode":"var builtinFields = map[string]bool{\"duration\": true, /* ...supported set... */ }\nfunc fieldSupported(name string) bool { return builtinFields[name] }","typeGuard":null,"tryCatchPattern":"q, err := buildComparison(ref, op, value)\nif errors.Is(err, tracestore.ErrFilterUnsupported) && strings.Contains(err.Error(), \"built-in field\") {\n    // use a supported field or an attribute instead\n}","preventionTips":["Verify built-in field names against the deployed backend version.","Prefer span attributes for fields outside the supported built-in set.","Add integration tests covering every filter field you emit."],"tags":["query-filter","field-mapping","elasticsearch"],"backgroundTag":"unsupported-query-field","analyzedSha":"806f4447841ecdb60519f408b004a599d515f437","analyzedAt":"2026-09-01T02:39:22.140Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}