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 nilView on GitHub (pinned to 806f444784)
Solutions
- Configure a jaeger_storage backend that implements metric storage (e.g. prometheus) with the exact name referenced by storage.metrics
- Fix the storage.metrics name in the query extension config
- If metrics query is not needed, clear storage.metrics so the disabled metrics reader is used
- 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
- Define a metric-capable backend (e.g. prometheus) whenever storage.metrics is set
- Unset storage.metrics to run with the disabled metrics reader
- Keep backend names copy-paste identical between jaeger_storage and jaeger_query
- Verify the chosen backend implements CreateMetricsReader before enabling SPM
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
- cannot find factory for trace storage %s: %w
- cannot find traces archive storage factory: %w
- no metric backend configuration provided for '%s'
- no sampling strategy provider specified, expecting 'adaptive
- only one sampling strategy provider can be specified, 'adapt
AI-assisted analysis of jaegertracing/jaeger@806f444784 (2026-09-01).
Data as JSON: /api/errors/c9f0aca1beff99ac.
Report an issue: GitHub.