{"record":{"id":"b30e475b287afc47","repo":"jaegertracing/jaeger","slug":"invalid-configuration-for-metric-storage-s-w","errorCode":null,"errorMessage":"invalid configuration for metric storage '%s': %w","messagePattern":"invalid configuration for metric storage '(.+?)': %w","errorType":"console","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/jaeger/internal/extension/jaegerstorage/extension.go","lineNumber":152,"sourceCode":"\t\tfactories:        make(map[string]tracestore.Factory),\n\t\tmetricsFactories: make(map[string]storage.MetricStoreFactory),\n\t}\n}\n\nfunc (s *storageExt) Start(_ context.Context, host component.Host) error {\n\t// Set host in telset for use in lazy factory initialization\n\ts.telset.Host = host\n\ts.telset.Metrics = otelmetrics.NewFactory(s.telset.MeterProvider).Namespace(metrics.NSOptions{Name: \"jaeger\"})\n\n\t// Validate configurations early to catch errors at startup\n\tfor name, cfg := range s.config.TraceBackends {\n\t\tif err := cfg.Validate(); err != nil {\n\t\t\treturn fmt.Errorf(\"invalid configuration for trace storage '%s': %w\", name, err)\n\t\t}\n\t}\n\tfor name, cfg := range s.config.MetricBackends {\n\t\tif err := cfg.Validate(); err != nil {\n\t\t\treturn fmt.Errorf(\"invalid configuration for metric storage '%s': %w\", name, err)\n\t\t}\n\t}\n\n\treturn nil\n}\n\nfunc (s *storageExt) Shutdown(context.Context) error {\n\tvar errs []error\n\tfor _, factory := range s.factories {\n\t\tif closer, ok := factory.(io.Closer); ok {\n\t\t\terr := closer.Close()\n\t\t\tif err != nil {\n\t\t\t\terrs = append(errs, err)\n\t\t\t}\n\t\t}\n\t}\n\tfor _, metricfactory := range s.metricsFactories {\n\t\tif closer, ok := metricfactory.(io.Closer); ok {","sourceCodeStart":134,"sourceCodeEnd":170,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/cmd/jaeger/internal/extension/jaegerstorage/extension.go#L134-L170","documentation":"Same fail-fast validation as the trace backends, but applied to s.config.MetricBackends in storageExt.Start: each metric storage entry's Validate() must pass or startup aborts with 'invalid configuration for metric storage %s'.","triggerScenarios":"storageExt.Start iterating s.config.MetricBackends; a metric backend entry (prometheus/elasticsearch/opensearch/clickhouse) fails Validate() — e.g. no backend selected, multiple selected, or invalid fields.","commonSituations":"A metric_backends entry with an empty body, prometheus plus elasticsearch both set, or invalid Prometheus endpoint/server settings.","solutions":["Fix the named metric backend entry per the inner validation error","Configure exactly one backend type per metric storage entry with valid fields","Validate the collector config with `otelcol validate --config=...` before startup"],"exampleFix":"// before: empty metric backend entry\nmetric_backends:\n  metrics-store: {}\n// after\nmetric_backends:\n  metrics-store:\n    prometheus:\n      endpoint: http://prometheus:9090","handlingStrategy":"validation","validationCode":"for name, cfg := range extConfig.MetricBackends {\n    if err := cfg.Validate(); err != nil {\n        return fmt.Errorf(\"metric storage '%s' invalid: %w\", name, err)\n    }\n}","typeGuard":null,"tryCatchPattern":"if err := ext.Start(ctx, host); err != nil {\n    if strings.Contains(err.Error(), \"invalid configuration for metric storage\") {\n        return fmt.Errorf(\"fix jaegerstorage metric backend config: %w\", err)\n    }\n    return err\n}","preventionTips":["Validate metric_backends entries with otelcol validate before deploy","Ensure each metric backend entry sets exactly one supported backend","Keep metric backend fields current with the jaeger config schema"],"tags":["go","jaeger","config","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"}