jaegertracing/jaeger · error

invalid configuration for metric storage '%s': %w

Error message

invalid configuration for metric storage '%s': %w

What it means

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'.

Source

Thrown at cmd/jaeger/internal/extension/jaegerstorage/extension.go:152

		factories:        make(map[string]tracestore.Factory),
		metricsFactories: make(map[string]storage.MetricStoreFactory),
	}
}

func (s *storageExt) Start(_ context.Context, host component.Host) error {
	// Set host in telset for use in lazy factory initialization
	s.telset.Host = host
	s.telset.Metrics = otelmetrics.NewFactory(s.telset.MeterProvider).Namespace(metrics.NSOptions{Name: "jaeger"})

	// Validate configurations early to catch errors at startup
	for name, cfg := range s.config.TraceBackends {
		if err := cfg.Validate(); err != nil {
			return fmt.Errorf("invalid configuration for trace storage '%s': %w", name, err)
		}
	}
	for name, cfg := range s.config.MetricBackends {
		if err := cfg.Validate(); err != nil {
			return fmt.Errorf("invalid configuration for metric storage '%s': %w", name, err)
		}
	}

	return nil
}

func (s *storageExt) Shutdown(context.Context) error {
	var errs []error
	for _, factory := range s.factories {
		if closer, ok := factory.(io.Closer); ok {
			err := closer.Close()
			if err != nil {
				errs = append(errs, err)
			}
		}
	}
	for _, metricfactory := range s.metricsFactories {
		if closer, ok := metricfactory.(io.Closer); ok {

View on GitHub (pinned to 806f444784)

Solutions

  1. Fix the named metric backend entry per the inner validation error
  2. Configure exactly one backend type per metric storage entry with valid fields
  3. Validate the collector config with `otelcol validate --config=...` before startup

Example fix

// before: empty metric backend entry
metric_backends:
  metrics-store: {}
// after
metric_backends:
  metrics-store:
    prometheus:
      endpoint: http://prometheus:9090
Defensive patterns

Strategy: validation

Validate before calling

for name, cfg := range extConfig.MetricBackends {
    if err := cfg.Validate(); err != nil {
        return fmt.Errorf("metric storage '%s' invalid: %w", name, err)
    }
}

Try / catch

if err := ext.Start(ctx, host); err != nil {
    if strings.Contains(err.Error(), "invalid configuration for metric storage") {
        return fmt.Errorf("fix jaegerstorage metric backend config: %w", err)
    }
    return err
}

Prevention

When it happens

Trigger: 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.

Common situations: A metric_backends entry with an empty body, prometheus plus elasticsearch both set, or invalid Prometheus endpoint/server settings.

Understand the failure class

Background: "Invalid value" and "allowed values are" config errors: what your library rejected and how to fix it — this error's family across 41 libraries.

Related errors


AI-assisted analysis of jaegertracing/jaeger@806f444784 (2026-09-01). Data as JSON: /api/errors/b30e475b287afc47. Report an issue: GitHub.