jaegertracing/jaeger · error

cannot find factory for dependency storage %s: %w

Error message

cannot find factory for dependency storage %s: %w

What it means

jaeger-query requires the primary trace storage factory to also implement depstore.Factory so it can read service dependencies. If the type assertion tf.(depstore.Factory) fails, Start returns 'cannot find factory for dependency storage'. Note the wrapped err is nil here because the message reflects a missing capability, not an underlying error.

Source

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

		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,
		MaxTraceSize:       s.config.MaxTraceSize,
		Interceptors:       interceptors,
	}
	if err := s.addArchiveStorage(&opts, host); err != nil {
		return err
	}
	qs := querysvc.NewQueryService(traceReader, depReader, opts)
	s.qs = qs

	mqs, err := s.createMetricReader(host)

View on GitHub (pinned to 806f444784)

Solutions

  1. Choose a traces_primary backend that implements depstore.Factory (Cassandra, Elasticsearch, etc.)
  2. If dependencies are not needed, confirm the deployment tolerates the query extension requiring dep support, or use a supported backend
  3. Check the backend's documentation for dependency-reader support before switching
  4. If the backend should support deps, verify you are on a jaeger version where that backend implements depstore.Factory

Example fix

// before
storage:
  traces_primary: memory-only-no-deps  # lacks depstore.Factory
// after
storage:
  traces_primary: cassandra-main  # implements depstore.Factory
Defensive patterns

Strategy: type-guard

Validate before calling

// Before relying on dependencies, confirm the factory supports them
import "github.com/jaegertracing/jaeger/plugin/storage/dependencystore"

func supportsDeps(tf interface{}) bool {
	_, ok := tf.(depstore.Factory)
	return ok
}

Type guard

func asDepstoreFactory(tf any) (depstore.Factory, bool) {
	df, ok := tf.(depstore.Factory)
	return df, ok
}
if _, ok := asDepstoreFactory(tf); !ok {
	// choose a backend that supports dependencies
}

Try / catch

if err := ext.Start(ctx, host); err != nil {
	if strings.Contains(err.Error(), "cannot find factory for dependency storage") {
		log.Fatalf("backend %q does not implement depstore.Factory — pick a supported backend", primaryName)
	}
	return err
}

Prevention

When it happens

Trigger: Storage.TracesPrimary points to a backend whose TraceStoreFactory does not implement CreateDependencyReader — e.g. certain remote-storage/metric-only backends that support traces but not dependency links.

Common situations: Using a storage backend that lacks dependency support (e.g. some OTLP-native or experimental backends) as traces_primary; switching backends without checking depstore support; expecting dependency links from a backend that never computes them.

Related errors


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