{"record":{"id":"7287bb2b98da1f4d","repo":"jaegertracing/jaeger","slug":"multiple-backend-types-found-for-trace-storage-v","errorCode":null,"errorMessage":"multiple backend types found for trace storage: %v","messagePattern":"multiple backend types found for trace storage: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/internal/storageconfig/config.go","lineNumber":131,"sourceCode":"\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()\n\t\tcfg.Elasticsearch = &v\n\t}\n\tif conf.IsSet(\"opensearch\") {","sourceCodeStart":113,"sourceCodeEnd":149,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/cmd/internal/storageconfig/config.go#L113-L149","documentation":"MetricBackend/TraceBackend Validate() collects every backend type present in a single storage definition (memory, badger, cassandra, elasticsearch/opensearch, grpc, clickhouse). A Jaeger storage backend must be exactly one type; if the same backend block sets more than one storage type, Validate returns this error listing the conflicting types.","triggerScenarios":"Calling Config.Validate() (invoked when Jaeger loads the storage configuration) with one TraceBackends entry that populates more than one of the backend fields, e.g. both `memory:` and `cassandra:` set under the same named backend.","commonSituations":"Merging YAML fragments (e.g. Helm values or env overlays) that each set a different storage type on the same named backend; copy-pasting an example backend block and forgetting to delete the old fields; a default value left populated alongside an explicitly configured backend.","solutions":["Edit the named trace backend in your config so exactly one storage type field is set (delete the others)","If you need two storage types, define them as two separate named backends under jaeger.storage.trace_backends and use jaeger.storage.backends to pick per-role","Inspect the error's %v list — it names the conflicting types found (e.g. [cassandra elasticsearch]) so you know which fields to remove","Check any config-merge tooling (Helm/Kustomize) for values that add fields to an existing backend entry"],"exampleFix":"// before (config.yaml)\njaeger:\n  storage:\n    trace_backends:\n      main:\n        memory: {}\n        cassandra:\n          servers: cassandra:9042\n// after\njaeger:\n  storage:\n    trace_backends:\n      main:\n        cassandra:\n          servers: cassandra:9042","handlingStrategy":"validation","validationCode":"import \"github.com/jaegertracing/jaeger/cmd/internal/storageconfig\"\nvar cfg storageconfig.Config\nif err := v.Unmarshal(&cfg); err != nil { return err }\nfor name, b := range cfg.TraceBackends {\n    types := 0\n    for _, set := range []interface{}{b.Memory, b.Badger, b.Cassandra, b.Elasticsearch, b.GRPC, b.ClickHouse} {\n        if !reflect.ValueOf(set).IsNil() { types++ }\n    }\n    if types > 1 {\n        return fmt.Errorf(\"trace backend %q sets %d storage types; keep exactly one\", name, types)\n    }\n}","typeGuard":null,"tryCatchPattern":"if err := cfg.Validate(); err != nil {\n    if strings.Contains(err.Error(), \"multiple backend types found for trace storage\") {\n        // parse the listed types from the message and fix that named entry\n    }\n    return err\n}","preventionTips":["Never set two storage-type fields in one named trace backend","When merging configs (Helm/Kustomize), ensure overlays don't add types to existing entries","One storage type per named backend; use multiple named backends for multiple types","Render the final merged YAML and eyeball each backend entry before deploy"],"tags":["config","storage","validation"],"backgroundTag":"invalid-config-value","analyzedSha":"806f4447841ecdb60519f408b004a599d515f437","analyzedAt":"2026-09-01T02:39:22.140Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}