jaegertracing/jaeger · error

failed to get dependencies: %w

Error message

failed to get dependencies: %w

What it means

After validating the time range, the handler calls queryService.GetDependencies(ctx, endTime, lookback). If the Jaeger query service or its storage backend returns an error, it is wrapped with "failed to get dependencies". Unlike the *_time errors this is a backend/infrastructure failure, not input validation.

Source

Thrown at cmd/jaeger/internal/extension/jaegerquery/internal/mcptools/internal/handlers/get_dependencies.go:63

	endTime, err := parseDependencyTime(input.EndTime, time.Now())
	if err != nil {
		return nil, types.GetDependenciesOutput{}, fmt.Errorf("invalid end_time: %w", err)
	}

	defaultStart := endTime.Add(-24 * time.Hour)
	startTime, err := parseDependencyTime(input.StartTime, defaultStart)
	if err != nil {
		return nil, types.GetDependenciesOutput{}, fmt.Errorf("invalid start_time: %w", err)
	}

	if !startTime.Before(endTime) {
		return nil, types.GetDependenciesOutput{}, errors.New("start_time must be before end_time")
	}

	lookback := endTime.Sub(startTime)
	deps, err := h.queryService.GetDependencies(ctx, endTime, lookback)
	if err != nil {
		return nil, types.GetDependenciesOutput{}, fmt.Errorf("failed to get dependencies: %w", err)
	}

	links := make([]types.DependencyLink, 0, len(deps))
	for _, d := range deps {
		links = append(links, types.DependencyLink{
			Caller:    d.Parent,
			Callee:    d.Child,
			CallCount: d.CallCount,
		})
	}

	// Sort by caller then callee for consistent ordering
	slices.SortFunc(links, func(a, b types.DependencyLink) int {
		if c := cmp.Compare(a.Caller, b.Caller); c != 0 {
			return c
		}
		return cmp.Compare(a.Callee, b.Callee)
	})

View on GitHub (pinned to 806f444784)

Solutions

  1. Check the wrapped %w error and jaeger-query logs for the underlying storage error.
  2. Verify the storage backend is reachable and configured (STORAGE_* env vars).
  3. Ensure the dependencies derivation job runs and the queried window contains derived data.
  4. Retry with an earlier/valid time window or after restoring storage connectivity.

Example fix

// before
deps, err := handler.Handle(ctx, req, types.GetDependenciesInput{StartTime: tooEarly}) // storage row missing
// after
// query a window covered by the dependency job, e.g. last 24h
deps, err := handler.Handle(ctx, req, types.GetDependenciesInput{EndTime: nowRFC3339, StartTime: nowMinus24hRFC3339})
Defensive patterns

Strategy: try-catch

Try / catch

out, _, err := handler.Handle(ctx, req, input)
if err != nil {
	var wrapped *fmt.wrapError
	if errors.As(err, &wrapped) && strings.Contains(err.Error(), "failed to get dependencies") {
		log.Printf("dependency fetch failed: %v", err) // inspect %w cause
		// retry after checking storage health
	}
}

Prevention

When it happens

Trigger: Calling get_dependencies when the storage backend is down or unreachable, when dependencies are disabled in storage (e.g. Elasticsearch/Kafka without the dependency-derivation job), when the queried window precedes available dependency data, or when the context is canceled/times out.

Common situations: Storage (Cassandra/ES/opensearch) outage or wrong connection config; querying dependencies before the dependency processing job has produced rows; all-in-one image started with dependencies disabled; network partition between jaeger-query and storage.

Related errors


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