MCPcopy
hub / github.com/grpc/grpc-go / TestRelayContextCollisionTracing

Method TestRelayContextCollisionTracing

stats/opentelemetry/e2e_test.go:2406–2471  ·  view source on GitHub ↗

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)

Source from the content-addressed store, hash-verified

2404// the client span accidentally adopting the server's identity or breaking the
2405// trace chain.
2406func (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 }

Callers

nothing calls this directly

Calls 15

EmptyCallMethod · 0.95
StartMethod · 0.95
StopMethod · 0.95
ErrorFunction · 0.92
NewClientFunction · 0.92
WithTransportCredentialsFunction · 0.92
NewCredentialsFunction · 0.92
DialOptionFunction · 0.92
CodeFunction · 0.92
ServerOptionFunction · 0.92
defaultTraceOptionsFunction · 0.85
setupStubServerFunction · 0.85

Tested by

no test coverage detected