TestRelayContextCollisionMetrics verifies that when an application acts as both a server and a client using the same context, the client metrics do not inherit or overwrite the server's telemetry metadata (e.g., grpc.method).
(t *testing.T)
| 2347 | // both a server and a client using the same context, the client metrics do not |
| 2348 | // inherit or overwrite the server's telemetry metadata (e.g., grpc.method). |
| 2349 | func (s) TestRelayContextCollisionMetrics(t *testing.T) { |
| 2350 | backendMetricsOpts, _ := defaultMetricsOptions(t, nil) |
| 2351 | backendServer := setupStubServer(t, backendMetricsOpts, nil) |
| 2352 | backendServer.EmptyCallF = func(_ context.Context, _ *testpb.Empty) (*testpb.Empty, error) { |
| 2353 | return nil, status.Error(codes.Unimplemented, "EmptyCall not implemented") |
| 2354 | } |
| 2355 | defer backendServer.Stop() |
| 2356 | |
| 2357 | relayMetricsOpts, relayMetricsReader := defaultMetricsOptions(t, nil) |
| 2358 | otelOpts := opentelemetry.Options{MetricsOptions: *relayMetricsOpts} |
| 2359 | |
| 2360 | relayServer := &stubserver.StubServer{ |
| 2361 | UnaryCallF: func(ctx context.Context, _ *testpb.SimpleRequest) (*testpb.SimpleResponse, error) { |
| 2362 | relayCC, err := grpc.NewClient( |
| 2363 | backendServer.Address, |
| 2364 | grpc.WithTransportCredentials(insecure.NewCredentials()), |
| 2365 | opentelemetry.DialOption(otelOpts), |
| 2366 | ) |
| 2367 | if err != nil { |
| 2368 | return nil, fmt.Errorf("failed to create relay client: %v", err) |
| 2369 | } |
| 2370 | defer relayCC.Close() |
| 2371 | client := testgrpc.NewTestServiceClient(relayCC) |
| 2372 | _, err = client.EmptyCall(ctx, &testpb.Empty{}) |
| 2373 | if status.Code(err) != codes.Unimplemented { |
| 2374 | t.Errorf("Expected Unimplemented error, got: %v", err) |
| 2375 | } |
| 2376 | return &testpb.SimpleResponse{}, nil |
| 2377 | }, |
| 2378 | } |
| 2379 | if err := relayServer.Start([]grpc.ServerOption{opentelemetry.ServerOption(otelOpts)}, opentelemetry.DialOption(otelOpts)); err != nil { |
| 2380 | t.Fatalf("Failed to start relay server: %v", err) |
| 2381 | } |
| 2382 | defer relayServer.Stop() |
| 2383 | |
| 2384 | ctx, cancel := context.WithTimeout(context.Background(), defaultTestTimeout) |
| 2385 | defer cancel() |
| 2386 | |
| 2387 | if _, err := relayServer.Client.UnaryCall(ctx, &testpb.SimpleRequest{}); err != nil { |
| 2388 | t.Fatalf("Unexpected UnaryCall error: %v", err) |
| 2389 | } |
| 2390 | |
| 2391 | // Verify Server Metric Identity is retained. |
| 2392 | if err := checkMetricWithMethod(ctx, relayMetricsReader, "grpc.server.call.started", "grpc.testing.TestService/UnaryCall"); err != nil { |
| 2393 | t.Fatal(err) |
| 2394 | } |
| 2395 | |
| 2396 | // Verify Client Metric Identity correctly resolved to "grpc.testing.TestService/EmptyCall". |
| 2397 | if err := checkMetricWithMethod(ctx, relayMetricsReader, "grpc.client.attempt.started", "grpc.testing.TestService/EmptyCall"); err != nil { |
| 2398 | t.Fatal(err) |
| 2399 | } |
| 2400 | } |
| 2401 | |
| 2402 | // TestRelayContextCollisionTracing verifies that span context is correctly |
| 2403 | // propagated from incoming server requests to outgoing client requests without |
nothing calls this directly
no test coverage detected