jaegertracing/jaeger · error

cannot find metrics storage factory: %w

Error message

cannot find metrics storage factory: %w

What it means

createMetricReader runs only when metrics storage is configured; it fetches the metric storage factory via jaegerstorage.GetMetricStorageFactory using the Storage.Metrics name. If no such factory is registered in the host, the error 'cannot find metrics storage factory' is returned and Start aborts.

Source

Thrown at cmd/jaeger/internal/extension/jaegerquery/server.go:239

		return nil, nil
	}
	writer, err := f.CreateTraceWriter()
	if err != nil {
		s.telset.Logger.Error("Cannot init traces archive storage writer", zap.Error(err))
		return nil, nil
	}
	return reader, writer
}

func (s *server) createMetricReader(host component.Host) (metricstore.Reader, error) {
	if s.config.Storage.Metrics == "" {
		s.telset.Logger.Info("Metric storage not configured")
		return disabled.NewMetricsReader()
	}

	msf, err := jaegerstorage.GetMetricStorageFactory(s.config.Storage.Metrics, host)
	if err != nil {
		return nil, fmt.Errorf("cannot find metrics storage factory: %w", err)
	}

	metricsReader, err := msf.CreateMetricsReader()
	if err != nil {
		return nil, fmt.Errorf("cannot create metrics reader %w", err)
	}

	return metricsReader, nil
}

func (s *server) Shutdown(_ context.Context) error {
	if s.aiHealth != nil {
		s.aiHealth.Stop()
	}
	if s.server != nil {
		return s.server.Close()
	}
	return nil

View on GitHub (pinned to 806f444784)

Solutions

  1. Configure a jaeger_storage backend that implements metric storage (e.g. prometheus) with the exact name referenced by storage.metrics
  2. Fix the storage.metrics name in the query extension config
  3. If metrics query is not needed, clear storage.metrics so the disabled metrics reader is used
  4. Verify the backend implements CreateMetricsReader for your jaeger version

Example fix

// before
jaeger_query:
  storage:
    metrics: prom  # undefined backend
// after
jaeger_storage:
  backends:
    prom: {prometheus: {endpoint: "http://prom:9090"}}
jaeger_query:
  storage:
    metrics: prom
Defensive patterns

Strategy: validation

Validate before calling

// Only enable metrics if a metric-capable backend is defined
if cfg.Storage.Metrics != "" {
	if _, ok := storageBackends[cfg.Storage.Metrics]; !ok {
		return fmt.Errorf("metrics backend %q not defined", cfg.Storage.Metrics)
	}
}

Try / catch

if err := ext.Start(ctx, host); err != nil {
	if strings.Contains(err.Error(), "cannot find metrics storage factory") {
		log.Fatalf("metrics backend %q missing — define a prometheus/clickhouse backend or unset storage.metrics", metricsName)
	}
	return err
}

Prevention

When it happens

Trigger: config.Storage.Metrics is set but no jaeger_storage backend providing a metric storage factory (GetMetricStorageFactory) exists under that name.

Common situations: Enabling metrics query (SPM) but forgetting to configure a metrics backend (e.g. Prometheus/ClickHouse) in jaeger_storage; name mismatch between storage.metrics and the backend key; using a backend that only implements trace storage, not metric storage.

Related errors


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