jaegertracing/jaeger · error

failed to get dependencies: %w

Error message

failed to get dependencies: %w

What it means

The gRPC remote storage DependencyReader wraps any error from the remote GetDependencies call and re-raises it as 'failed to get dependencies'. It means the downstream remote-storage plugin failed to return dependency links for the given time range.

Source

Thrown at internal/storage/v2/grpc/depreader.go:41

// NewDependencyReader creates a DependencyReader that communicates with a remote gRPC storage server.
// The provided gRPC connection is used exclusively for reading dependencies, meaning it is safe
// to enable instrumentation on the connection.
func NewDependencyReader(conn *grpc.ClientConn) *DependencyReader {
	return &DependencyReader{
		client: storage.NewDependencyReaderClient(conn),
	}
}

func (dr *DependencyReader) GetDependencies(
	ctx context.Context,
	query depstore.QueryParameters,
) ([]model.DependencyLink, error) {
	resp, err := dr.client.GetDependencies(ctx, &storage.GetDependenciesRequest{
		StartTime: query.StartTime,
		EndTime:   query.EndTime,
	})
	if err != nil {
		return nil, fmt.Errorf("failed to get dependencies: %w", err)
	}
	dependencies := make([]model.DependencyLink, len(resp.Dependencies))
	for i, dep := range resp.Dependencies {
		dependencies[i] = model.DependencyLink{
			Parent:    dep.Parent,
			Child:     dep.Child,
			CallCount: dep.CallCount,
			Source:    dep.Source,
		}
	}
	return dependencies, nil
}

View on GitHub (pinned to 806f444784)

Solutions

  1. Check the error's wrapped cause to identify the underlying gRPC status (unavailable, deadline, unimplemented)
  2. Verify the remote-storage server address/ports in the storage config
  3. Ensure the remote storage plugin supports dependency links and is running
  4. Retry with backoff if the cause is transient unavailability

Example fix

// before
deps, err := depReader.GetDependencies(ctx, query)
// after - inspect wrapped cause
deps, err := depReader.GetDependencies(ctx, query)
if err != nil {
    if status.Code(err) == codes.Unavailable { /* retry */ }
    return err
}
Defensive patterns

Strategy: retry

Validate before calling

// verify connectivity before calling
conn, err := grpc.NewClient(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil { /* endpoint misconfigured */ }

Try / catch

deps, err := depReader.GetDependencies(ctx, query)
if err != nil {
    if status.Code(errors.Unwrap(err)) == codes.Unavailable {
        // retry with backoff
    }
    return err
}

Prevention

When it happens

Trigger: Calling DependencyReader.GetDependencies(ctx, query) when the remote storage server is unreachable, returns a gRPC error, or the request is rejected (auth/tenancy, deadline exceeded).

Common situations: Remote storage service down or wrong host:port configured; network/firewall blocking the gRPC port; server not implementing the dependencies API; authentication token missing.

Related errors


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