jaegertracing/jaeger · error

failed to execute GetServices: %w

Error message

failed to execute GetServices: %w

What it means

TraceReader.GetServices wraps any error from the remote GetServices RPC with 'failed to execute GetServices'. It means the list of service names could not be fetched from the remote storage backend.

Source

Thrown at internal/storage/v2/grpc/tracereader.go:111

			yield(nil, fmt.Errorf("failed to execute GetTraces: %w", err))
			return
		}
		for received, err := stream.Recv(); !errors.Is(err, io.EOF); received, err = stream.Recv() {
			if err != nil {
				yield(nil, fmt.Errorf("received error from grpc stream: %w", err))
				return
			}
			if !yield([]ptrace.Traces{received.ToTraces()}, nil) {
				return
			}
		}
	}
}

func (tr *TraceReader) GetServices(ctx context.Context) ([]string, error) {
	resp, err := tr.client.GetServices(ctx, &storage.GetServicesRequest{})
	if err != nil {
		return nil, fmt.Errorf("failed to execute GetServices: %w", err)
	}
	return resp.Services, nil
}

func (tr *TraceReader) GetOperations(
	ctx context.Context,
	params tracestore.OperationQueryParams,
) ([]tracestore.Operation, error) {
	resp, err := tr.client.GetOperations(ctx, &storage.GetOperationsRequest{
		Service:  params.ServiceName,
		SpanKind: params.SpanKind,
	})
	if err != nil {
		return nil, fmt.Errorf("failed to execute GetOperations: %w", err)
	}
	operations := make([]tracestore.Operation, len(resp.Operations))
	for i, op := range resp.Operations {
		operations[i] = tracestore.Operation{

View on GitHub (pinned to 806f444784)

Solutions

  1. Inspect the wrapped gRPC status code for the root cause
  2. Verify remote storage connectivity and endpoint configuration
  3. Ensure the storage plugin implements GetServices (upgrade if stale)
  4. Retry on transient codes (Unavailable, DeadlineExceeded) with backoff

Example fix

// before
services, err := reader.GetServices(ctx)
if err != nil { return err }
// after
services, err := reader.GetServices(ctx)
if err != nil {
    if status.Code(err) == codes.Unavailable { return retry(...) }
    return err
}
Defensive patterns

Strategy: retry

Try / catch

services, err := reader.GetServices(ctx)
if err != nil {
    if status.Code(err) == codes.Unavailable {
        // retry with backoff or serve cached service list
    }
    return err
}

Prevention

When it happens

Trigger: Calling GetServices when the gRPC call fails: server unreachable, unimplemented method, deadline exceeded, or auth/tenancy rejection.

Common situations: Remote storage not running or endpoint misconfigured; server built from an older version lacking GetServices; query UI's service dropdown failing on page load due to network issues.

Related errors


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