jaegertracing/jaeger · error

failed to execute GetOperations: %w

Error message

failed to execute GetOperations: %w

What it means

TraceReader.GetOperations wraps any error returned by the remote storage gRPC client's GetOperations RPC with this message. It means the call to list service operations (name + span kind pairs) failed at the transport, serialization, or remote-server level. The library re-wraps rather than returns the raw error so callers can tell which storage operation failed.

Source

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

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{
			Name:     op.Name,
			SpanKind: op.SpanKind,
		}
	}
	return operations, nil
}

func (tr *TraceReader) FindTraces(
	ctx context.Context,
	params tracestore.TraceQueryParams,
) iter.Seq2[[]ptrace.Traces, error] {
	return func(yield func([]ptrace.Traces, error) bool) {
		query, err := toProtoQueryParameters(params)
		if err != nil {

View on GitHub (pinned to 806f444784)

Solutions

  1. Check connectivity to the remote storage server (address, port, DNS) with grpc health/healthz probe
  2. Inspect the wrapped %w error for its gRPC status code and fix the specific cause (timeout, auth, unimplemented)
  3. Increase context deadline or client timeout if DeadlineExceeded
  4. Verify client credentials/TLS configuration match the server
  5. Ensure the remote server runs a version supporting the v2 GetOperations API

Example fix

// before
ops, err := reader.GetOperations(ctx, params) // err: failed to execute GetOperations: rpc error: DeadlineExceeded
// after
ctx, cancel := context.WithTimeout(ctx, 10*time.Second)
defer cancel()
ops, err := reader.GetOperations(ctx, params)
if err != nil {
    if status.Code(errors.Unwrap(err)) == codes.Unimplemented { /* upgrade server or fallback */ }
}
Defensive patterns

Strategy: try-catch

Validate before calling

if params.ServiceName == "" { return errors.New("ServiceName is required for GetOperations") }
if err := grpcHealthCheck(ctx, conn); err != nil { return fmt.Errorf("storage server unreachable: %w", err) }

Try / catch

ops, err := reader.GetOperations(ctx, params)
if err != nil {
    if status.Code(err) == codes.Unimplemented { /* older server: fallback */ }
    return fmt.Errorf("GetOperations failed: %w", err)
}

Prevention

When it happens

Trigger: Calling traceReader.GetOperations(ctx, tracestore.OperationQueryParams{...}) when the remote gRPC server is unreachable, returns a non-OK status (Unavailable, DeadlineExceeded, PermissionDenied, Unimplemented for older servers), or the context is cancelled/times out.

Common situations: Remote storage adapter address misconfigured; server restarted or network partition; per-RPC deadline too short; remote Jaeger version predates the v2 storage API and returns Unimplemented; TLS/mTLS credentials mismatch.

Related errors


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