jaegertracing/jaeger · error

cannot create trace reader: %w

Error message

cannot create trace reader: %w

What it means

After finding the trace store factory, Start calls tf.CreateTraceReader() to build the reader the query service will use. If the storage backend cannot construct its reader (connection, schema, or driver failure surfaced by the backend), the error is wrapped as 'cannot create trace reader'.

Source

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

	deps = append(deps, s.config.QueryInterceptors...)
	return deps
}

func (s *server) Start(ctx context.Context, host component.Host) error {
	telset := telemetry.FromOtelComponent(s.telset, host)
	if !s.config.EnableTracing {
		telset.TracerProvider = nooptrace.NewTracerProvider()
	}
	telset.Metrics = telset.Metrics.
		Namespace(metrics.NSOptions{Name: "jaeger"}).
		Namespace(metrics.NSOptions{Name: "query"})
	tf, err := jaegerstorage.GetTraceStoreFactory(s.config.Storage.TracesPrimary, host)
	if err != nil {
		return fmt.Errorf("cannot find factory for trace storage %s: %w", s.config.Storage.TracesPrimary, err)
	}
	traceReader, err := tf.CreateTraceReader()
	if err != nil {
		return fmt.Errorf("cannot create trace reader: %w", err)
	}

	interceptors, err := queryinterceptor.Resolve(host, s.config.QueryInterceptors)
	if err != nil {
		return fmt.Errorf("cannot resolve query interceptors: %w", err)
	}

	df, ok := tf.(depstore.Factory)
	if !ok {
		return fmt.Errorf("cannot find factory for dependency storage %s: %w", s.config.Storage.TracesPrimary, err)
	}
	depReader, err := df.CreateDependencyReader()
	if err != nil {
		return fmt.Errorf("cannot create dependencies reader: %w", err)
	}

	opts := querysvc.QueryServiceOptions{
		MaxClockSkewAdjust: s.config.MaxClockSkewAdjust,

View on GitHub (pinned to 806f444784)

Solutions

  1. Read the wrapped cause from the log — it names the failing backend and reason
  2. Verify the storage backend is reachable and credentials in the jaeger_storage config are valid
  3. Run the backend's schema/init tool (e.g. ES index cleaner/rollover init, Cassandra schema) if the error mentions missing schema
  4. Test connectivity from the jaeger-query host to the storage endpoint

Example fix

// before
jaeger_storage:
  backends:
    es:
      elasticsearch:
        server_urls: http://es:9200  # ES down / auth missing
// after
jaeger_storage:
  backends:
    es:
      elasticsearch:
        server_urls: https://es:9200
        index_prefix: jaeger-main
        tls:
          insecure_skip_verify: false
Defensive patterns

Strategy: try-catch

Validate before calling

// Pre-check backend reachability before starting jaeger-query
for _, u := range serverURLs {
	resp, err := http.Get(u + "/_cluster/health")
	if err != nil || resp.StatusCode != 200 {
		return fmt.Errorf("storage backend %s unreachable", u)
	}
}

Try / catch

if err := ext.Start(ctx, host); err != nil {
	if strings.Contains(err.Error(), "cannot create trace reader") {
		log.Fatalf("trace reader init failed: %v — check backend reachability/credentials/schema", err)
	}
	return err
}

Prevention

When it happens

Trigger: The named storage factory exists but CreateTraceReader fails — e.g. the backend is unreachable, credentials are wrong, the schema is missing/outdated, or the backend driver returns an initialization error.

Common situations: Cassandra/Elasticsearch/ClickHouse down or credentials rotated; remote storage schema never initialized (e.g. missing ES index templates); Badger memory/permission problems; network/firewall blocking the storage endpoint.

Related errors


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