{"record":{"id":"ac5fdbaab2ffd4fe","repo":"jaegertracing/jaeger","slug":"failed-to-execute-getservices-w","errorCode":null,"errorMessage":"failed to execute GetServices: %w","messagePattern":"failed to execute GetServices: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/v2/grpc/tracereader.go","lineNumber":111,"sourceCode":"\t\t\tyield(nil, fmt.Errorf(\"failed to execute GetTraces: %w\", err))\n\t\t\treturn\n\t\t}\n\t\tfor received, err := stream.Recv(); !errors.Is(err, io.EOF); received, err = stream.Recv() {\n\t\t\tif err != nil {\n\t\t\t\tyield(nil, fmt.Errorf(\"received error from grpc stream: %w\", err))\n\t\t\t\treturn\n\t\t\t}\n\t\t\tif !yield([]ptrace.Traces{received.ToTraces()}, nil) {\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunc (tr *TraceReader) GetServices(ctx context.Context) ([]string, error) {\n\tresp, err := tr.client.GetServices(ctx, &storage.GetServicesRequest{})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to execute GetServices: %w\", err)\n\t}\n\treturn resp.Services, nil\n}\n\nfunc (tr *TraceReader) GetOperations(\n\tctx context.Context,\n\tparams tracestore.OperationQueryParams,\n) ([]tracestore.Operation, error) {\n\tresp, err := tr.client.GetOperations(ctx, &storage.GetOperationsRequest{\n\t\tService:  params.ServiceName,\n\t\tSpanKind: params.SpanKind,\n\t})\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"failed to execute GetOperations: %w\", err)\n\t}\n\toperations := make([]tracestore.Operation, len(resp.Operations))\n\tfor i, op := range resp.Operations {\n\t\toperations[i] = tracestore.Operation{","sourceCodeStart":93,"sourceCodeEnd":129,"githubUrl":"https://github.com/jaegertracing/jaeger/blob/806f4447841ecdb60519f408b004a599d515f437/internal/storage/v2/grpc/tracereader.go#L93-L129","documentation":"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.","triggerScenarios":"Calling GetServices when the gRPC call fails: server unreachable, unimplemented method, deadline exceeded, or auth/tenancy rejection.","commonSituations":"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.","solutions":["Inspect the wrapped gRPC status code for the root cause","Verify remote storage connectivity and endpoint configuration","Ensure the storage plugin implements GetServices (upgrade if stale)","Retry on transient codes (Unavailable, DeadlineExceeded) with backoff"],"exampleFix":"// before\nservices, err := reader.GetServices(ctx)\nif err != nil { return err }\n// after\nservices, err := reader.GetServices(ctx)\nif err != nil {\n    if status.Code(err) == codes.Unavailable { return retry(...) }\n    return err\n}","handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":"services, err := reader.GetServices(ctx)\nif err != nil {\n    if status.Code(err) == codes.Unavailable {\n        // retry with backoff or serve cached service list\n    }\n    return err\n}","preventionTips":["Cache the service list with a short TTL to ride out transient failures","Health-check the remote storage endpoint","Verify plugin implements GetServices in your version"],"tags":["grpc","storage","services"],"backgroundTag":"grpc-call-failed","analyzedSha":"806f4447841ecdb60519f408b004a599d515f437","analyzedAt":"2026-09-01T02:39:22.140Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T05:18:18.240Z"}