{"record":{"id":"b3a48b33d657d8f3","repo":"jaegertracing/jaeger","slug":"trace-storage-s-w","errorCode":null,"errorMessage":"trace storage '%s': %w","messagePattern":"trace storage '(.+?)': %w","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/internal/storageconfig/config.go","lineNumber":190,"sourceCode":"\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":172,"sourceCodeEnd":200,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/cmd/internal/storageconfig/config.go#L172-L200","documentation":"This is the wrapper the top-level storage Config.Validate() adds when one named trace backend fails its own validation. The `%s` is the backend's name from jaeger.storage.trace_backends and the `%w` is the underlying error (e.g. `empty configuration` or `multiple backend types found for trace storage: ...`). It exists to tell you WHICH named backend is invalid.","triggerScenarios":"Calling Config.Validate() (during Jaeger config load) where any entry in TraceBackends returns an error from TraceBackend.Validate — zero backends configured entirely also fails earlier with 'at least one storage backend is required'.","commonSituations":"A named backend left empty after removing its type field; typos in the backend type key so nothing unmarshals; merged configs that blank out a backend's body.","solutions":["Look at the backend name in the error (`trace storage 'NAME'`) and fix that entry in jaeger.storage.trace_backends under your config","Ensure the named backend has exactly one populated storage type (memory, badger, cassandra, elasticsearch, grpc, or clickhouse)","If the whole trace_backends map is empty, add at least one backend and reference it via jaeger.storage.backends","Inspect the wrapped cause after '%w' — it states the precise validation failure"],"exampleFix":"// before (config.yaml)\njaeger:\n  storage:\n    trace_backends:\n      main: {}   # empty\n// after\njaeger:\n  storage:\n    trace_backends:\n      main:\n        memory:\n          max_traces: 100000","handlingStrategy":"validation","validationCode":"var cfg storageconfig.Config\nif err := v.Unmarshal(&cfg); err != nil { return err }\nif len(cfg.TraceBackends) == 0 {\n    return errors.New(\"configure at least one entry under jaeger.storage.trace_backends\")\n}\nfor name, b := range cfg.TraceBackends {\n    if err := b.Validate(); err != nil {\n        return fmt.Errorf(\"pre-check trace backend %q: %w\", name, err)\n    }\n}","typeGuard":null,"tryCatchPattern":"if err := cfg.Validate(); err != nil {\n    var name string\n    if m := regexp.MustCompile(`trace storage '([^']+)'`).FindStringSubmatch(err.Error()); m != nil {\n        name = m[1] // jump straight to the offending backend entry\n    }\n    return fmt.Errorf(\"fix jaeger.storage.trace_backends entry %q: %w\", name, err)\n}","preventionTips":["Run Config.Validate() on the effective config before starting the service","Every named trace backend must have exactly one populated type field","Don't ship an empty trace_backends map — at least one backend is mandatory","Extract the backend name from the error message to locate the bad YAML block fast"],"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"}