{"record":{"id":"8bf228b6fb0a6a66","repo":"jaegertracing/jaeger","slug":"empty-configuration","errorCode":null,"errorMessage":"empty configuration","messagePattern":"empty configuration","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/internal/storageconfig/config.go","lineNumber":128,"sourceCode":"\t\tbackends = append(backends, \"badger\")\n\t}\n\tif cfg.GRPC != nil {\n\t\tbackends = append(backends, \"grpc\")\n\t}\n\tif cfg.Cassandra != nil {\n\t\tbackends = append(backends, \"cassandra\")\n\t}\n\tif cfg.Elasticsearch != nil {\n\t\tbackends = append(backends, \"elasticsearch\")\n\t}\n\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 trace storage: %v\", backends)\n\t}\n\treturn nil\n}\n\n// Unmarshal implements confmap.Unmarshaler for MetricBackend.\nfunc (cfg *MetricBackend) Unmarshal(conf *confmap.Conf) error {\n\t// apply defaults\n\tif conf.IsSet(\"prometheus\") {\n\t\tv := prometheus.DefaultConfig()\n\t\tcfg.Prometheus = &PrometheusConfiguration{\n\t\t\tConfiguration: v,\n\t\t}\n\t}\n\tif conf.IsSet(\"elasticsearch\") {\n\t\tv := es.DefaultConfig()","sourceCodeStart":110,"sourceCodeEnd":146,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/cmd/internal/storageconfig/config.go#L110-L146","documentation":"errRefAgainstConstant refuses an operand shape where both sides of a comparison read values off the span (reference vs reference) or otherwise cannot be evaluated against a constant. Matching span-to-span would require a per-span script, which this Elasticsearch backend deliberately does not run for cost reasons, so the predicate is rejected with tracestore.ErrFilterUnsupported.","triggerScenarios":"Submitting a filter comparing two span fields/attributes to each other (e.g. tag.a == tag.b) or a comparison whose right side is another reference rather than a constant, hitting refAndConstantArgs or refAndListArgs.","commonSituations":"Trying to find spans where one attribute equals another; porting SQL-style column-to-column comparisons into a Jaeger filter; a generic query translator emitting ref-vs-ref comparisons.","solutions":["Compare the span field against a literal constant instead of another span field.","Split the query: fetch candidates with one constant comparison and post-filter reference-vs-reference matches in application code.","Consider typed attribute indexing (RFC 0015) or a scripting-capable backend if ref-vs-ref is a hard requirement."],"exampleFix":"// before\ntag.http.status_code == tag.expected_status\n// after\ntag.http.status_code == 200","handlingStrategy":"fallback","validationCode":"func refVsRef(c *expression.Call) bool {\n    return len(c.Args) == 2 && isReference(c.Args[0]) && isReference(c.Args[1])\n} // rewrite to constant comparison before submitting","typeGuard":null,"tryCatchPattern":"q, err := buildFilterQuery(...)\nif errors.Is(err, tracestore.ErrFilterUnsupported) {\n    // split into constant comparison + client-side post-filter\n}","preventionTips":["Compare span fields only against literal constants.","Post-filter field-to-field equality in application code.","Avoid SQL-style column-to-column translations in query builders."],"tags":["query-filter","unsupported-feature","elasticsearch"],"backgroundTag":"reference-comparison-unsupported","analyzedSha":"806f4447841ecdb60519f408b004a599d515f437","analyzedAt":"2026-09-01T02:39:22.140Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}