jaegertracing/jaeger · error
cannot create metrics reader %w
Error message
cannot create metrics reader %w
What it means
The jaegerquery extension calls createMetricReader to build the metrics reader that backs /metrics-queries endpoints. When storage.Metrics is configured, it fetches a MetricStoreFactory from the jaegerstorage extension and calls CreateMetricsReader(); any error from that call (failed backend client construction, bad config, unsupported backend) is wrapped with 'cannot create metrics reader %w'. Note the format string lacks ':w' separation, so the wrapped error is concatenated directly to the message text.
Source
Thrown at cmd/jaeger/internal/extension/jaegerquery/server.go:244
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
}
// QueryService returns the v2 query service instance.
func (s *server) QueryService() *querysvc.QueryService {
return s.qsView on GitHub (pinned to 806f444784)
Solutions
- Inspect the concatenated inner error text for the real cause and fix the metric backend configuration under the named storage entry
- Verify the backend named in query.storage.metrics is declared under jaegerstorage.metric_backends and uses a supported type (prometheus/elasticsearch/opensearch/clickhouse)
- Test backend connectivity/credentials from the jaeger host; ensure version compatibility with the configured metric store
- Enable debug logging on the jaegerstorage extension to see 'Initializing metrics storage' context before the failure
Example fix
// before (confusing concatenated message)
fmt.Errorf("cannot create metrics reader %w", err)
// after (properly separated wrap)
fmt.Errorf("cannot create metrics reader: %w", err) Defensive patterns
Strategy: try-catch
Validate before calling
// verify metric storage is declared before starting query
if _, err := jaegerstorage.GetMetricStorageFactory(cfg.Storage.Metrics, host); err != nil {
return fmt.Errorf("metrics storage misconfigured: %w", err)
} Try / catch
if err := srv.Start(ctx, host); err != nil {
var inner error
if errors.Unwrap(err) != nil {
inner = errors.Unwrap(err)
}
telset.Logger.Error("query start failed creating metrics reader",
zap.Error(err), zap.NamedError("cause", inner))
return err
} Prevention
- Declare the metric backend under jaegerstorage.metric_backends before wiring query.storage.metrics
- Validate the full collector config (otelcol validate) before startup
- Check backend connectivity and credentials in the deploy environment
When it happens
Trigger: server.Start -> createMetricReader when config.Storage.Metrics names a declared metric backend but msf.CreateMetricsReader() fails — e.g. the Prometheus/Elasticsearch/OpenSearch/ClickHouse factory cannot build its client or its configuration is invalid at reader construction time.
Common situations: Misconfigured metric storage section (bad endpoint URL, unreachable Elasticsearch/Prometheus settings validated late), referencing a metric backend whose config passed Validate() but fails at factory level, or typo'd backend fields that only surface when the reader is instantiated.
Related errors
- no metric backend configuration provided for '%s'
- unknown metrics backend specified
- invalid parameters
- cannot create metrics factory: %w
- cannot create trace reader: %w
AI-assisted analysis of jaegertracing/jaeger@806f444784 (2026-09-01).
Data as JSON: /api/errors/7fd7169b2fc2c7c5.
Report an issue: GitHub.