From 2602dd87c585c0e8839e2d1772c49916eb140ace Mon Sep 17 00:00:00 2001 From: yifeizhuang Date: Wed, 6 Nov 2024 17:57:56 -0800 Subject: [PATCH 1/3] add interop test open telemetry tracing flags --- .../integration/TestServiceClient.java | 49 ++++++++++++++++++- .../io/grpc/opentelemetry/MetadataSetter.java | 5 ++ 2 files changed, 53 insertions(+), 1 deletion(-) diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java index e6829be11cb..b218aa6a8e7 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java @@ -57,6 +57,9 @@ import io.grpc.netty.NettyChannelBuilder; import io.grpc.okhttp.InternalOkHttpChannelBuilder; import io.grpc.okhttp.OkHttpChannelBuilder; +import io.grpc.opentelemetry.GrpcOpenTelemetry; +import io.grpc.opentelemetry.GrpcTraceBinContextPropagator; +import io.grpc.opentelemetry.InternalGrpcOpenTelemetry; import io.grpc.stub.ClientCalls; import io.grpc.stub.MetadataUtils; import io.grpc.stub.StreamObserver; @@ -68,6 +71,12 @@ import io.grpc.testing.integration.Messages.StreamingOutputCallRequest; import io.grpc.testing.integration.Messages.StreamingOutputCallResponse; import io.grpc.testing.integration.Messages.TestOrcaReport; +import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; +import io.opentelemetry.context.propagation.ContextPropagators; +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.trace.SdkTracerProvider; +import io.opentelemetry.sdk.trace.samplers.Sampler; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; @@ -136,7 +145,8 @@ public static void main(String[] args) throws Exception { private int soakResponseSize = 314159; private String additionalMetadata = ""; private static LoadBalancerProvider customBackendMetricsLoadBalancerProvider; - + private boolean useOpenTelemetryTracing; + private TextMapPropagator textMapPropagator = GrpcTraceBinContextPropagator.defaultInstance(); private Tester tester = new Tester(); @VisibleForTesting @@ -216,6 +226,18 @@ void parseArgs(String[] args) throws Exception { soakResponseSize = Integer.parseInt(value); } else if ("additional_metadata".equals(key)) { additionalMetadata = value; + } else if ("use_open_telemetry_tracing".equals(key)) { + useOpenTelemetryTracing = Boolean.parseBoolean(value); + } else if ("open_telemetry_propagator".equals(key)) { + if (value.toLowerCase().contains("w3c")) { + textMapPropagator = W3CTraceContextPropagator.getInstance(); + } else if (value.toLowerCase().contains("grpc-trace-bin")) { + textMapPropagator = GrpcTraceBinContextPropagator.defaultInstance(); + } else { + System.err.println("Unsupported text map propagator, use 'w3c' or 'grpc-trace-bin'"); + usage = true; + break; + } } else { System.err.println("Unknown argument: " + key); usage = true; @@ -294,6 +316,12 @@ void parseArgs(String[] args) throws Exception { + "\n Additional metadata to send in each request, as a " + "\n semicolon-separated list of key:value pairs. Default " + c.additionalMetadata + + "\n --use_open_telemetry_tracing Whether to use open telemetry tracing. Default " + + c.useOpenTelemetryTracing + + "\n --text_map_propagator w3c|grpc-trace-bin " + + "\n The TextMapPropagator for openTelemetry. Default " + + "grpc-trace-bin " + ); System.exit(1); } @@ -678,6 +706,25 @@ protected ManagedChannelBuilder createChannelBuilder() { if (addMdInterceptor != null) { nettyBuilder.intercept(addMdInterceptor); } + if (useOpenTelemetryTracing) { + OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder() + .setTracerProvider(SdkTracerProvider.builder() + .setSampler(Sampler.alwaysOn()) + .build()) + .setPropagators(ContextPropagators.create(TextMapPropagator.composite( + textMapPropagator + ))) + .build(); + GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder() + .sdk(openTelemetrySdk); + InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true); + GrpcOpenTelemetry grpcOpenTelemetry = grpcOpentelemetryBuilder.build(); + // Disabling census-tracing is necessary to avoid trace ID mismatches. + // This is because census-tracing overrides the grpc-trace-bin header with + // OpenTelemetry's GrpcTraceBinPropagator. + InternalNettyChannelBuilder.setTracingEnabled(nettyBuilder, false); + grpcOpenTelemetry.configureChannelBuilder(nettyBuilder); + } return nettyBuilder.intercept(createCensusStatsClientInterceptor()); } diff --git a/opentelemetry/src/main/java/io/grpc/opentelemetry/MetadataSetter.java b/opentelemetry/src/main/java/io/grpc/opentelemetry/MetadataSetter.java index 5892c7accfe..553e13e56f1 100644 --- a/opentelemetry/src/main/java/io/grpc/opentelemetry/MetadataSetter.java +++ b/opentelemetry/src/main/java/io/grpc/opentelemetry/MetadataSetter.java @@ -20,6 +20,7 @@ import com.google.common.io.BaseEncoding; import io.grpc.Metadata; import io.opentelemetry.context.propagation.TextMapSetter; +import java.util.Arrays; import java.util.logging.Level; import java.util.logging.Logger; import javax.annotation.Nullable; @@ -40,6 +41,8 @@ public static MetadataSetter getInstance() { @Override public void set(@Nullable Metadata carrier, String key, String value) { + logger.log(Level.FINE, "Setting text trace header key={0} value={1}", + new Object[]{key, value}); if (carrier == null) { logger.log(Level.FINE, "Carrier is null, setting no data"); return; @@ -57,6 +60,8 @@ public void set(@Nullable Metadata carrier, String key, String value) { } void set(@Nullable Metadata carrier, String key, byte[] value) { + logger.log(Level.FINE, "Setting binary trace header key={0} value={1}", + new Object[]{key, Arrays.toString(value)}); if (carrier == null) { logger.log(Level.FINE, "Carrier is null, setting no data"); return; From 87724dee0255a81f9884c0d201ab7173569a9bc4 Mon Sep 17 00:00:00 2001 From: yifeizhuang Date: Thu, 7 Nov 2024 11:32:37 -0800 Subject: [PATCH 2/3] style --- .../java/io/grpc/testing/integration/TestServiceClient.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java index b218aa6a8e7..1f43aa4467e 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java @@ -82,6 +82,7 @@ import java.io.InputStream; import java.nio.charset.Charset; import java.util.Arrays; +import java.util.Locale; import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; @@ -229,9 +230,9 @@ void parseArgs(String[] args) throws Exception { } else if ("use_open_telemetry_tracing".equals(key)) { useOpenTelemetryTracing = Boolean.parseBoolean(value); } else if ("open_telemetry_propagator".equals(key)) { - if (value.toLowerCase().contains("w3c")) { + if (value.toLowerCase(Locale.ROOT).contains("w3c")) { textMapPropagator = W3CTraceContextPropagator.getInstance(); - } else if (value.toLowerCase().contains("grpc-trace-bin")) { + } else if (value.toLowerCase(Locale.ROOT).contains("grpc-trace-bin")) { textMapPropagator = GrpcTraceBinContextPropagator.defaultInstance(); } else { System.err.println("Unsupported text map propagator, use 'w3c' or 'grpc-trace-bin'"); From cd8c7d91c94881ab0da4734d3024595ea333e3fd Mon Sep 17 00:00:00 2001 From: yifeizhuang Date: Tue, 12 Nov 2024 17:11:33 -0800 Subject: [PATCH 3/3] use otel auto config sdk --- .../integration/TestServiceClient.java | 52 ++++++++----------- 1 file changed, 23 insertions(+), 29 deletions(-) diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java index 1f43aa4467e..244d1a6d910 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java @@ -28,6 +28,7 @@ import com.google.auth.oauth2.OAuth2Credentials; import com.google.auth.oauth2.ServiceAccountCredentials; import com.google.common.annotations.VisibleForTesting; +import com.google.common.collect.ImmutableMap; import com.google.common.io.Files; import com.google.protobuf.ByteString; import io.grpc.CallOptions; @@ -71,18 +72,13 @@ import io.grpc.testing.integration.Messages.StreamingOutputCallRequest; import io.grpc.testing.integration.Messages.StreamingOutputCallResponse; import io.grpc.testing.integration.Messages.TestOrcaReport; -import io.opentelemetry.api.trace.propagation.W3CTraceContextPropagator; -import io.opentelemetry.context.propagation.ContextPropagators; -import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.trace.SdkTracerProvider; -import io.opentelemetry.sdk.trace.samplers.Sampler; +import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.nio.charset.Charset; import java.util.Arrays; -import java.util.Locale; import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; @@ -147,7 +143,6 @@ public static void main(String[] args) throws Exception { private String additionalMetadata = ""; private static LoadBalancerProvider customBackendMetricsLoadBalancerProvider; private boolean useOpenTelemetryTracing; - private TextMapPropagator textMapPropagator = GrpcTraceBinContextPropagator.defaultInstance(); private Tester tester = new Tester(); @VisibleForTesting @@ -229,16 +224,6 @@ void parseArgs(String[] args) throws Exception { additionalMetadata = value; } else if ("use_open_telemetry_tracing".equals(key)) { useOpenTelemetryTracing = Boolean.parseBoolean(value); - } else if ("open_telemetry_propagator".equals(key)) { - if (value.toLowerCase(Locale.ROOT).contains("w3c")) { - textMapPropagator = W3CTraceContextPropagator.getInstance(); - } else if (value.toLowerCase(Locale.ROOT).contains("grpc-trace-bin")) { - textMapPropagator = GrpcTraceBinContextPropagator.defaultInstance(); - } else { - System.err.println("Unsupported text map propagator, use 'w3c' or 'grpc-trace-bin'"); - usage = true; - break; - } } else { System.err.println("Unknown argument: " + key); usage = true; @@ -317,11 +302,13 @@ void parseArgs(String[] args) throws Exception { + "\n Additional metadata to send in each request, as a " + "\n semicolon-separated list of key:value pairs. Default " + c.additionalMetadata - + "\n --use_open_telemetry_tracing Whether to use open telemetry tracing. Default " + + "\n --use_open_telemetry_tracing " + + "\n Whether to use open telemetry tracing. Use otel " + + "\n AutoConfig to configure sdk. To use w3c, use" + + "\n '-Dotel.propagators=tracecontext'. If you do not " + + "\n specify otel.propagators system property, default " + + "\n propagator is grpc-trace-bin. Default " + c.useOpenTelemetryTracing - + "\n --text_map_propagator w3c|grpc-trace-bin " - + "\n The TextMapPropagator for openTelemetry. Default " - + "grpc-trace-bin " ); System.exit(1); @@ -708,14 +695,21 @@ protected ManagedChannelBuilder createChannelBuilder() { nettyBuilder.intercept(addMdInterceptor); } if (useOpenTelemetryTracing) { - OpenTelemetrySdk openTelemetrySdk = OpenTelemetrySdk.builder() - .setTracerProvider(SdkTracerProvider.builder() - .setSampler(Sampler.alwaysOn()) - .build()) - .setPropagators(ContextPropagators.create(TextMapPropagator.composite( - textMapPropagator - ))) - .build(); + OpenTelemetrySdk openTelemetrySdk = AutoConfiguredOpenTelemetrySdk.builder() + .addPropagatorCustomizer((reader, config) -> { + if (config.getString("otel.propagators") == null) { + return GrpcTraceBinContextPropagator.defaultInstance(); + } else { + return reader; + } + }) + .addPropertiesSupplier(() -> ImmutableMap.of( + "otel.logs.exporter", "none", + "otel.traces.exporter", "none", + "otel.metrics.exporter", "none")) + .build() + .getOpenTelemetrySdk(); + GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder() .sdk(openTelemetrySdk); InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true);