TestRelayContextCollisionTracing verifies that span context is correctly propagated from incoming server requests to outgoing client requests without the client span accidentally adopting the server's identity or breaking the trace chain.
(t *testing.T)
| 2404 | // the client span accidentally adopting the server's identity or breaking the |
| 2405 | // trace chain. |
| 2406 | func (s) TestRelayContextCollisionTracing(t *testing.T) { |
| 2407 | backendTraceOpts, _ := defaultTraceOptions(t) |
| 2408 | backendServer := setupStubServer(t, nil, backendTraceOpts) |
| 2409 | backendServer.EmptyCallF = func(_ context.Context, _ *testpb.Empty) (*testpb.Empty, error) { |
| 2410 | return nil, status.Error(codes.Unimplemented, "EmptyCall not implemented") |
| 2411 | } |
| 2412 | defer backendServer.Stop() |
| 2413 | |
| 2414 | relayTraceOpts, relayTraceExporter := defaultTraceOptions(t) |
| 2415 | otelOpts := opentelemetry.Options{TraceOptions: *relayTraceOpts} |
| 2416 | |
| 2417 | relayServer := &stubserver.StubServer{ |
| 2418 | UnaryCallF: func(ctx context.Context, _ *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { |
| 2419 | relayCC, err := grpc.NewClient( |
| 2420 | backendServer.Address, |
| 2421 | grpc.WithTransportCredentials(insecure.NewCredentials()), |
| 2422 | opentelemetry.DialOption(otelOpts), |
| 2423 | ) |
| 2424 | if err != nil { |
| 2425 | return nil, fmt.Errorf("failed to create relay client: %v", err) |
| 2426 | } |
| 2427 | defer relayCC.Close() |
| 2428 | client := testgrpc.NewTestServiceClient(relayCC) |
| 2429 | _, err = client.EmptyCall(ctx, &testpb.Empty{}) |
| 2430 | if status.Code(err) != codes.Unimplemented { |
| 2431 | t.Errorf("Expected Unimplemented error, got: %v", err) |
| 2432 | } |
| 2433 | return &testpb.SimpleResponse{}, nil |
| 2434 | }, |
| 2435 | } |
| 2436 | if err := relayServer.Start([]grpc.ServerOption{opentelemetry.ServerOption(otelOpts)}, opentelemetry.DialOption(otelOpts)); err != nil { |
| 2437 | t.Fatalf("Failed to start relay server: %v", err) |
| 2438 | } |
| 2439 | defer relayServer.Stop() |
| 2440 | |
| 2441 | ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout) |
| 2442 | defer cancel() |
| 2443 | |
| 2444 | _, _ = relayServer.Client.UnaryCall(ctx, &testpb.SimpleRequest{}) |
| 2445 | |
| 2446 | wantSpans := []traceSpanInfo{ |
| 2447 | {name: "Recv.", spanKind: "server"}, |
| 2448 | {name: "Sent.grpc.testing.TestService.EmptyCall", spanKind: "client"}, |
| 2449 | } |
| 2450 | spans, err := waitForTraceSpans(ctx, relayTraceExporter, wantSpans) |
| 2451 | if err != nil { |
| 2452 | t.Fatalf("Failed to wait for spans: %v", err) |
| 2453 | } |
| 2454 | |
| 2455 | var srvTraceID, cliTraceID oteltrace.TraceID |
| 2456 | for _, span := range spans { |
| 2457 | if span.Name == "Recv." && span.SpanKind == oteltrace.SpanKindServer { |
| 2458 | srvTraceID = span.SpanContext.TraceID() |
| 2459 | } |
| 2460 | if span.Name == "Sent.grpc.testing.TestService.EmptyCall" && span.SpanKind == oteltrace.SpanKindClient { |
| 2461 | cliTraceID = span.SpanContext.TraceID() |
| 2462 | } |
| 2463 | } |
nothing calls this directly
no test coverage detected