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

View on GitHub (pinned to 806f444784)

Solutions

  1. Inspect the concatenated inner error text for the real cause and fix the metric backend configuration under the named storage entry
  2. Verify the backend named in query.storage.metrics is declared under jaegerstorage.metric_backends and uses a supported type (prometheus/elasticsearch/opensearch/clickhouse)
  3. Test backend connectivity/credentials from the jaeger host; ensure version compatibility with the configured metric store
  4. 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

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


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