From cf6b68849fdd9a5169a2871031a47da68283efbd Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 14 Jul 2026 17:52:15 +0530 Subject: [PATCH 01/18] interop: enable OpenTelemetry tracing support in Java interop client and server --- gradle/libs.versions.toml | 1 + interop-testing/build.gradle | 1 + .../integration/TestServiceClient.java | 32 ++++++++++++++-- .../integration/TestServiceServer.java | 38 +++++++++++++++++-- 4 files changed, 64 insertions(+), 8 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 9bd4fe51358..2591908d218 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -122,6 +122,7 @@ opencensus-impl = { module = "io.opencensus:opencensus-impl", version.ref = "ope opentelemetry-api = "io.opentelemetry:opentelemetry-api:1.63.0" opentelemetry-exporter-prometheus = "io.opentelemetry:opentelemetry-exporter-prometheus:1.63.0-alpha" opentelemetry-gcp-resources = "io.opentelemetry.contrib:opentelemetry-gcp-resources:1.57.0-alpha" +opentelemetry-exporter-otlp = "io.opentelemetry:opentelemetry-exporter-otlp:1.63.0" opentelemetry-sdk-extension-autoconfigure = "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.63.0" opentelemetry-sdk-testing = "io.opentelemetry:opentelemetry-sdk-testing:1.63.0" perfmark-api = "io.perfmark:perfmark-api:0.27.0" diff --git a/interop-testing/build.gradle b/interop-testing/build.gradle index 5160759460c..eab52afff78 100644 --- a/interop-testing/build.gradle +++ b/interop-testing/build.gradle @@ -26,6 +26,7 @@ dependencies { libraries.opencensus.contrib.grpc.metrics, libraries.google.auth.oauth2Http, libraries.opentelemetry.sdk.extension.autoconfigure, + libraries.opentelemetry.exporter.otlp, libraries.guava.jre // Fix checkUpperBoundDeps using -android api project(':grpc-api'), project(':grpc-stub'), 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 8a5ca05da91..99de1aab822 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 @@ -54,6 +54,12 @@ import io.grpc.internal.JsonParser; import io.grpc.netty.InsecureFromHttp1ChannelCredentials; import io.grpc.netty.InternalNettyChannelBuilder; +import io.grpc.opentelemetry.GrpcOpenTelemetry; +import io.grpc.opentelemetry.GrpcTraceBinContextPropagator; +import io.grpc.opentelemetry.InternalGrpcOpenTelemetry; +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.grpc.netty.NettyChannelBuilder; import io.grpc.okhttp.InternalOkHttpChannelBuilder; import io.grpc.okhttp.OkHttpChannelBuilder; @@ -118,6 +124,8 @@ public static void main(String[] args) throws Exception { private boolean useTls = true; private boolean useAlts = false; private boolean useH2cUpgrade = false; + private boolean enableOpentelemetry = false; + private OpenTelemetrySdk openTelemetrySdk; private String customCredentialsType; private boolean useTestCa; private boolean useOkHttp; @@ -219,6 +227,8 @@ void parseArgs(String[] args) throws Exception { numThreads = Integer.parseInt(value); } else if ("additional_metadata".equals(key)) { additionalMetadata = value; + } else if ("enable_opentelemetry".equals(key)) { + enableOpentelemetry = Boolean.parseBoolean(value); } else { System.err.println("Unknown argument: " + key); usage = true; @@ -307,20 +317,34 @@ void parseArgs(String[] args) throws Exception { @VisibleForTesting void setUp() { + if (enableOpentelemetry) { + AutoConfiguredOpenTelemetrySdk autoSdk = AutoConfiguredOpenTelemetrySdk.builder() + .addPropagatorCustomizer( + (previous, config) -> + TextMapPropagator.composite( + previous, GrpcTraceBinContextPropagator.defaultInstance())) + .build(); + this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk(); + GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder() + .sdk(openTelemetrySdk); + InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true); + GrpcOpenTelemetry grpcOpenTelemetry = grpcOpentelemetryBuilder.build(); + grpcOpenTelemetry.registerGlobal(); + } tester.setUp(); } private synchronized void tearDown() { try { tester.tearDown(); + } finally { if (customBackendMetricsLoadBalancerProvider != null) { LoadBalancerRegistry.getDefaultRegistry() .deregister(customBackendMetricsLoadBalancerProvider); } - } catch (RuntimeException ex) { - throw ex; - } catch (Exception ex) { - throw new RuntimeException(ex); + if (openTelemetrySdk != null) { + openTelemetrySdk.close(); + } } } diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java index ee0ecff3ce1..cf24fba723e 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java @@ -28,10 +28,16 @@ import io.grpc.TlsServerCredentials; import io.grpc.alts.AltsServerCredentials; import io.grpc.netty.NettyServerBuilder; +import io.grpc.opentelemetry.GrpcOpenTelemetry; +import io.grpc.opentelemetry.GrpcTraceBinContextPropagator; +import io.grpc.opentelemetry.InternalGrpcOpenTelemetry; import io.grpc.services.MetricRecorder; import io.grpc.testing.TlsTesting; import io.grpc.xds.orca.OrcaMetricReportingServerInterceptor; import io.grpc.xds.orca.OrcaServiceImpl; +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.util.List; @@ -76,6 +82,8 @@ public void run() { private boolean useTls = true; private boolean useAlts = false; private int mcsLimit = -1; + private boolean enableOpentelemetry = false; + private OpenTelemetrySdk openTelemetrySdk; private ScheduledExecutorService executor; private Server server; @@ -123,6 +131,8 @@ void parseArgs(String[] args) { mcsLimit = Integer.parseInt(value); // TODO: Make Netty server builder usable for IPV6 as well (not limited to MCS handling) addressType = Util.AddressType.IPV4; // To use NettyServerBuilder + } else if ("enable_opentelemetry".equals(key)) { + enableOpentelemetry = Boolean.parseBoolean(value); } else { System.err.println("Unknown argument: " + key); usage = true; @@ -156,6 +166,20 @@ void parseArgs(String[] args) { @SuppressWarnings("AddressSelection") @VisibleForTesting void start() throws Exception { + if (enableOpentelemetry) { + AutoConfiguredOpenTelemetrySdk autoSdk = AutoConfiguredOpenTelemetrySdk.builder() + .addPropagatorCustomizer( + (previous, config) -> + TextMapPropagator.composite( + previous, GrpcTraceBinContextPropagator.defaultInstance())) + .build(); + this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk(); + GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder() + .sdk(openTelemetrySdk); + InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true); + GrpcOpenTelemetry grpcOpenTelemetry = grpcOpentelemetryBuilder.build(); + grpcOpenTelemetry.registerGlobal(); + } executor = Executors.newSingleThreadScheduledExecutor(); ServerCredentials serverCreds; if (useAlts) { @@ -224,11 +248,17 @@ void start() throws Exception { @VisibleForTesting void stop() throws Exception { - server.shutdownNow(); - if (!server.awaitTermination(5, TimeUnit.SECONDS)) { - System.err.println("Timed out waiting for server shutdown"); + try { + server.shutdownNow(); + if (!server.awaitTermination(5, TimeUnit.SECONDS)) { + System.err.println("Timed out waiting for server shutdown"); + } + MoreExecutors.shutdownAndAwaitTermination(executor, 5, TimeUnit.SECONDS); + } finally { + if (openTelemetrySdk != null) { + openTelemetrySdk.close(); + } } - MoreExecutors.shutdownAndAwaitTermination(executor, 5, TimeUnit.SECONDS); } @VisibleForTesting From 299e536cfdc4eef555282a59335c3494f2df1669 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Tue, 14 Jul 2026 21:22:45 +0530 Subject: [PATCH 02/18] interop: add signal handling and try-with-resources cleanups --- .../integration/TestServiceClient.java | 43 +++-- .../integration/TestServiceServer.java | 163 +++++++++--------- 2 files changed, 112 insertions(+), 94 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 99de1aab822..dcea3e97eaf 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 @@ -54,15 +54,12 @@ import io.grpc.internal.JsonParser; import io.grpc.netty.InsecureFromHttp1ChannelCredentials; import io.grpc.netty.InternalNettyChannelBuilder; -import io.grpc.opentelemetry.GrpcOpenTelemetry; -import io.grpc.opentelemetry.GrpcTraceBinContextPropagator; -import io.grpc.opentelemetry.InternalGrpcOpenTelemetry; -import io.opentelemetry.context.propagation.TextMapPropagator; -import io.opentelemetry.sdk.OpenTelemetrySdk; -import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; 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; @@ -74,6 +71,9 @@ import io.grpc.testing.integration.Messages.StreamingOutputCallRequest; import io.grpc.testing.integration.Messages.StreamingOutputCallResponse; import io.grpc.testing.integration.Messages.TestOrcaReport; +import io.opentelemetry.context.propagation.TextMapPropagator; +import io.opentelemetry.sdk.OpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; @@ -448,28 +448,36 @@ private void runTest(TestCases testCase) throws Exception { case SERVICE_ACCOUNT_CREDS: { String jsonKey = Files.asCharSource(new File(serviceAccountKeyFile), UTF_8).read(); - FileInputStream credentialsStream = new FileInputStream(new File(serviceAccountKeyFile)); - tester.serviceAccountCreds(jsonKey, credentialsStream, oauthScope); + try (FileInputStream credentialsStream = + new FileInputStream(new File(serviceAccountKeyFile))) { + tester.serviceAccountCreds(jsonKey, credentialsStream, oauthScope); + } break; } case JWT_TOKEN_CREDS: { - FileInputStream credentialsStream = new FileInputStream(new File(serviceAccountKeyFile)); - tester.jwtTokenCreds(credentialsStream); + try (FileInputStream credentialsStream = + new FileInputStream(new File(serviceAccountKeyFile))) { + tester.jwtTokenCreds(credentialsStream); + } break; } case OAUTH2_AUTH_TOKEN: { String jsonKey = Files.asCharSource(new File(serviceAccountKeyFile), UTF_8).read(); - FileInputStream credentialsStream = new FileInputStream(new File(serviceAccountKeyFile)); - tester.oauth2AuthToken(jsonKey, credentialsStream, oauthScope); + try (FileInputStream credentialsStream = + new FileInputStream(new File(serviceAccountKeyFile))) { + tester.oauth2AuthToken(jsonKey, credentialsStream, oauthScope); + } break; } case PER_RPC_CREDS: { String jsonKey = Files.asCharSource(new File(serviceAccountKeyFile), UTF_8).read(); - FileInputStream credentialsStream = new FileInputStream(new File(serviceAccountKeyFile)); - tester.perRpcCreds(jsonKey, credentialsStream, oauthScope); + try (FileInputStream credentialsStream = + new FileInputStream(new File(serviceAccountKeyFile))) { + tester.perRpcCreds(jsonKey, credentialsStream, oauthScope); + } break; } @@ -701,7 +709,8 @@ protected ManagedChannelBuilder createChannelBuilder() { if (serverPort == 0) { nettyBuilder = NettyChannelBuilder.forTarget(serverHost, channelCredentials); } else { - nettyBuilder = NettyChannelBuilder.forAddress(serverHost, serverPort, channelCredentials); + nettyBuilder = + NettyChannelBuilder.forAddress(serverHost, serverPort, channelCredentials); } nettyBuilder.flowControlWindow(AbstractInteropTest.TEST_FLOW_CONTROL_WINDOW); if (serverHostOverride != null) { @@ -819,8 +828,8 @@ public void cacheableUnary() { } /** Sends a large unary rpc with service account credentials. */ - public void serviceAccountCreds(String jsonKey, InputStream credentialsStream, String authScope) - throws Exception { + public void serviceAccountCreds( + String jsonKey, InputStream credentialsStream, String authScope) throws Exception { // cast to ServiceAccountCredentials to double-check the right type of object was created. GoogleCredentials credentials = ServiceAccountCredentials.class.cast(GoogleCredentials.fromStream(credentialsStream)); diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java index cf24fba723e..e1ebab8a6fe 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java @@ -166,94 +166,103 @@ void parseArgs(String[] args) { @SuppressWarnings("AddressSelection") @VisibleForTesting void start() throws Exception { - if (enableOpentelemetry) { - AutoConfiguredOpenTelemetrySdk autoSdk = AutoConfiguredOpenTelemetrySdk.builder() - .addPropagatorCustomizer( - (previous, config) -> - TextMapPropagator.composite( - previous, GrpcTraceBinContextPropagator.defaultInstance())) - .build(); - this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk(); - GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder() - .sdk(openTelemetrySdk); - InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true); - GrpcOpenTelemetry grpcOpenTelemetry = grpcOpentelemetryBuilder.build(); - grpcOpenTelemetry.registerGlobal(); - } - executor = Executors.newSingleThreadScheduledExecutor(); - ServerCredentials serverCreds; - if (useAlts) { - if (localHandshakerPort > -1) { - serverCreds = AltsServerCredentials.newBuilder() - .enableUntrustedAltsForTesting() - .setHandshakerAddressForTesting("localhost:" + localHandshakerPort).build(); + try { + if (enableOpentelemetry) { + AutoConfiguredOpenTelemetrySdk autoSdk = AutoConfiguredOpenTelemetrySdk.builder() + .addPropagatorCustomizer( + (previous, config) -> + TextMapPropagator.composite( + previous, GrpcTraceBinContextPropagator.defaultInstance())) + .build(); + this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk(); + GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder() + .sdk(openTelemetrySdk); + InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true); + GrpcOpenTelemetry grpcOpenTelemetry = grpcOpentelemetryBuilder.build(); + grpcOpenTelemetry.registerGlobal(); + } + executor = Executors.newSingleThreadScheduledExecutor(); + ServerCredentials serverCreds; + if (useAlts) { + if (localHandshakerPort > -1) { + serverCreds = AltsServerCredentials.newBuilder() + .enableUntrustedAltsForTesting() + .setHandshakerAddressForTesting("localhost:" + localHandshakerPort).build(); + } else { + serverCreds = AltsServerCredentials.create(); + } + } else if (useTls) { + serverCreds = TlsServerCredentials.create( + TlsTesting.loadCert("server1.pem"), TlsTesting.loadCert("server1.key")); } else { - serverCreds = AltsServerCredentials.create(); + serverCreds = InsecureServerCredentials.create(); } - } else if (useTls) { - serverCreds = TlsServerCredentials.create( - TlsTesting.loadCert("server1.pem"), TlsTesting.loadCert("server1.key")); - } else { - serverCreds = InsecureServerCredentials.create(); - } - MetricRecorder metricRecorder = MetricRecorder.newInstance(); - BindableService orcaOobService = - OrcaServiceImpl.createService(executor, metricRecorder, 1, TimeUnit.SECONDS); + MetricRecorder metricRecorder = MetricRecorder.newInstance(); + BindableService orcaOobService = + OrcaServiceImpl.createService(executor, metricRecorder, 1, TimeUnit.SECONDS); - // Create ServerBuilder with appropriate addresses - // - IPV4_IPV6: bind to wildcard which covers all addresses on all interfaces of both families - // - IPV4: bind to v4 address for local hostname + v4 localhost - // - IPV6: bind to all v6 addresses for local hostname + v6 localhost - ServerBuilder serverBuilder; - switch (addressType) { - case IPV4_IPV6: - serverBuilder = Grpc.newServerBuilderForPort(port, serverCreds); - break; - case IPV4: - SocketAddress v4Address = Util.getV4Address(port); - InetSocketAddress localV4Address = new InetSocketAddress("127.0.0.1", port); - serverBuilder = - NettyServerBuilder.forAddress(localV4Address, serverCreds); - if (v4Address != null && !v4Address.equals(localV4Address)) { - ((NettyServerBuilder) serverBuilder).addListenAddress(v4Address); - } - if (mcsLimit != -1) { - ((NettyServerBuilder) serverBuilder).maxConcurrentCallsPerConnection(mcsLimit); - } - break; - case IPV6: - List v6Addresses = Util.getV6Addresses(port); - InetSocketAddress localV6Address = new InetSocketAddress("::1", port); - serverBuilder = - NettyServerBuilder.forAddress(localV6Address, serverCreds); - for (SocketAddress address : v6Addresses) { - if (!address.equals(localV6Address)) { - ((NettyServerBuilder) serverBuilder).addListenAddress(address); + // Create ServerBuilder with appropriate addresses + // - IPV4_IPV6: bind to wildcard which covers all addresses on all interfaces of both families + // - IPV4: bind to v4 address for local hostname + v4 localhost + // - IPV6: bind to all v6 addresses for local hostname + v6 localhost + ServerBuilder serverBuilder; + switch (addressType) { + case IPV4_IPV6: + serverBuilder = Grpc.newServerBuilderForPort(port, serverCreds); + break; + case IPV4: + SocketAddress v4Address = Util.getV4Address(port); + InetSocketAddress localV4Address = new InetSocketAddress("127.0.0.1", port); + serverBuilder = + NettyServerBuilder.forAddress(localV4Address, serverCreds); + if (v4Address != null && !v4Address.equals(localV4Address)) { + ((NettyServerBuilder) serverBuilder).addListenAddress(v4Address); } - } - break; - default: - throw new AssertionError("Unknown address type: " + addressType); + if (mcsLimit != -1) { + ((NettyServerBuilder) serverBuilder).maxConcurrentCallsPerConnection(mcsLimit); + } + break; + case IPV6: + List v6Addresses = Util.getV6Addresses(port); + InetSocketAddress localV6Address = new InetSocketAddress("::1", port); + serverBuilder = + NettyServerBuilder.forAddress(localV6Address, serverCreds); + for (SocketAddress address : v6Addresses) { + if (!address.equals(localV6Address)) { + ((NettyServerBuilder) serverBuilder).addListenAddress(address); + } + } + break; + default: + throw new AssertionError("Unknown address type: " + addressType); + } + server = serverBuilder + .maxInboundMessageSize(AbstractInteropTest.MAX_MESSAGE_SIZE) + .addService( + ServerInterceptors.intercept( + new TestServiceImpl(executor, metricRecorder), TestServiceImpl.interceptors())) + .addService(orcaOobService) + .intercept(OrcaMetricReportingServerInterceptor.create(metricRecorder)) + .build() + .start(); + } catch (Throwable t) { + stop(); + throw t; } - server = serverBuilder - .maxInboundMessageSize(AbstractInteropTest.MAX_MESSAGE_SIZE) - .addService( - ServerInterceptors.intercept( - new TestServiceImpl(executor, metricRecorder), TestServiceImpl.interceptors())) - .addService(orcaOobService) - .intercept(OrcaMetricReportingServerInterceptor.create(metricRecorder)) - .build() - .start(); } @VisibleForTesting void stop() throws Exception { try { - server.shutdownNow(); - if (!server.awaitTermination(5, TimeUnit.SECONDS)) { - System.err.println("Timed out waiting for server shutdown"); + if (server != null) { + server.shutdownNow(); + if (!server.awaitTermination(5, TimeUnit.SECONDS)) { + System.err.println("Timed out waiting for server shutdown"); + } + } + if (executor != null) { + MoreExecutors.shutdownAndAwaitTermination(executor, 5, TimeUnit.SECONDS); } - MoreExecutors.shutdownAndAwaitTermination(executor, 5, TimeUnit.SECONDS); } finally { if (openTelemetrySdk != null) { openTelemetrySdk.close(); From b0f13693b7071878e95548d376e9916240135803 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Mon, 20 Jul 2026 19:44:10 +0530 Subject: [PATCH 03/18] interop: guarantee OpenTelemetrySdk teardown and fix span double ending --- .../testing/integration/TestServiceClient.java | 2 +- .../OpenTelemetryContextPropagationTest.java | 18 +++++++++++++++++- 2 files changed, 18 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 dcea3e97eaf..9be2fd2cde6 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 @@ -107,9 +107,9 @@ public static void main(String[] args) throws Exception { client.parseArgs(args); customBackendMetricsLoadBalancerProvider = new CustomBackendMetricsLoadBalancerProvider(); LoadBalancerRegistry.getDefaultRegistry().register(customBackendMetricsLoadBalancerProvider); - client.setUp(); try { + client.setUp(); client.run(); } finally { client.tearDown(); diff --git a/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java b/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java index 3884d977a6e..5389420c01e 100644 --- a/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java +++ b/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java @@ -44,6 +44,7 @@ import io.opentelemetry.sdk.trace.SdkTracerProvider; import java.util.Arrays; import java.util.concurrent.atomic.AtomicReference; +import org.junit.After; import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; @@ -83,6 +84,18 @@ public OpenTelemetryContextPropagationTest(TextMapPropagator textMapPropagator, this.censusClient = isCensusClient; } + @Override + @After + public void tearDown() { + try { + super.tearDown(); + } finally { + if (openTelemetrySdk != null) { + openTelemetrySdk.close(); + } + } + } + @Override protected ServerBuilder getServerBuilder() { NettyServerBuilder builder = NettyServerBuilder.forPort(0, InsecureServerCredentials.create()) @@ -133,7 +146,7 @@ public void onComplete() { } private void maybeCloseSpan(AtomicReference applicationSpan) { - Span tmp = applicationSpan.get(); + Span tmp = applicationSpan.getAndSet(null); if (tmp != null) { tmp.end(); } @@ -165,6 +178,8 @@ public void otelSpanContextPropagation() { Span parentSpan = tracer.spanBuilder("Test.interopTest").startSpan(); try (Scope scope = Context.current().with(parentSpan).makeCurrent()) { blockingStub.unaryCall(SimpleRequest.getDefaultInstance()); + } finally { + parentSpan.end(); } assertEquals(parentSpan.getSpanContext().getTraceId(), applicationSpan.get().getSpanContext().getTraceId()); @@ -186,6 +201,7 @@ public void censusToOtelGrpcTraceBinPropagator() { applicationSpan.get().getSpanContext().getTraceId()); } finally { context.detach(previous); + parentSpan.end(); } } } From 85eb6a915b8a1dadaed813ea5b241e522ec02bc1 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Mon, 20 Jul 2026 20:04:51 +0530 Subject: [PATCH 04/18] interop: add @IgnoreJRERequirement for OpenTelemetry Java 8+ APIs to pass AnimalSniffer --- .../java/io/grpc/testing/integration/TestServiceClient.java | 2 ++ .../java/io/grpc/testing/integration/TestServiceServer.java | 2 ++ 2 files changed, 4 insertions(+) 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 9be2fd2cde6..4571835cd1f 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 @@ -85,6 +85,7 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import javax.annotation.Nullable; +import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; /** * Application that starts a client for the {@link TestServiceGrpc.TestServiceImplBase} and runs @@ -316,6 +317,7 @@ void parseArgs(String[] args) throws Exception { } @VisibleForTesting + @IgnoreJRERequirement void setUp() { if (enableOpentelemetry) { AutoConfiguredOpenTelemetrySdk autoSdk = AutoConfiguredOpenTelemetrySdk.builder() diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java index e1ebab8a6fe..3e87bda9fcb 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java @@ -45,6 +45,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; /** Server that manages startup/shutdown of a single {@code TestService}. */ public class TestServiceServer { @@ -165,6 +166,7 @@ void parseArgs(String[] args) { @SuppressWarnings("AddressSelection") @VisibleForTesting + @IgnoreJRERequirement void start() throws Exception { try { if (enableOpentelemetry) { From 365918116ac4d73424caa72ce6d30e6ede9ef535 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Mon, 20 Jul 2026 20:15:02 +0530 Subject: [PATCH 05/18] interop: add explanatory comment to @IgnoreJRERequirement for OpenTelemetry Java 8+ APIs --- .../java/io/grpc/testing/integration/TestServiceClient.java | 2 +- .../java/io/grpc/testing/integration/TestServiceServer.java | 2 +- 2 files changed, 2 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 4571835cd1f..39d14499030 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 @@ -317,7 +317,7 @@ void parseArgs(String[] args) throws Exception { } @VisibleForTesting - @IgnoreJRERequirement + @IgnoreJRERequirement // OpenTelemetry uses Java 8+ APIs void setUp() { if (enableOpentelemetry) { AutoConfiguredOpenTelemetrySdk autoSdk = AutoConfiguredOpenTelemetrySdk.builder() diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java index 3e87bda9fcb..f8d12871071 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java @@ -166,7 +166,7 @@ void parseArgs(String[] args) { @SuppressWarnings("AddressSelection") @VisibleForTesting - @IgnoreJRERequirement + @IgnoreJRERequirement // OpenTelemetry uses Java 8+ APIs void start() throws Exception { try { if (enableOpentelemetry) { From 7dbd4c36b99f7e9bcb6be995680baa1ad321f3a2 Mon Sep 17 00:00:00 2001 From: AgraVator Date: Mon, 20 Jul 2026 20:52:30 +0530 Subject: [PATCH 06/18] interop: fix maybeCloseSpan in OpenTelemetryContextPropagationTest to preserve applicationSpan reference --- .../integration/OpenTelemetryContextPropagationTest.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java b/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java index 5389420c01e..726453d4194 100644 --- a/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java +++ b/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java @@ -43,6 +43,7 @@ import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.trace.SdkTracerProvider; import java.util.Arrays; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; import org.junit.After; import org.junit.Assume; @@ -145,10 +146,12 @@ public void onComplete() { return builder; } + private final AtomicBoolean applicationSpanClosed = new AtomicBoolean(false); + private void maybeCloseSpan(AtomicReference applicationSpan) { - Span tmp = applicationSpan.getAndSet(null); - if (tmp != null) { - tmp.end(); + Span span = applicationSpan.get(); + if (span != null && applicationSpanClosed.compareAndSet(false, true)) { + span.end(); } } From 625ce3975c008638cae3ac9566c343443f2ac1df Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Mon, 10 Aug 2026 15:05:20 +0000 Subject: [PATCH 07/18] Upgrade to protobuf 3.25.9 / 25.6 - Synchronize buildscripts/make_dependencies.* to Protobuf 25.6 and Abseil 20230802.1 - Align Kokoro Windows CI batch scripts to Protobuf 25.6 - Update README.md and example project build files to Protobuf 3.25.9 - Exclude transitive protobuf 4.x dependencies to enforce strict 3.25.9 resolution --- README.md | 6 +++--- buildscripts/kokoro/windows32.bat | 2 +- buildscripts/kokoro/windows64.bat | 2 +- buildscripts/make_dependencies.bat | 4 ++-- buildscripts/make_dependencies.sh | 4 ++-- examples/example-alts/build.gradle | 2 +- examples/example-debug/build.gradle | 2 +- examples/example-debug/pom.xml | 2 +- examples/example-dualstack/build.gradle | 2 +- examples/example-dualstack/pom.xml | 2 +- examples/example-gauth/build.gradle | 2 +- examples/example-gauth/pom.xml | 2 +- examples/example-gcp-csm-observability/build.gradle | 2 +- examples/example-gcp-observability/build.gradle | 2 +- examples/example-hostname/build.gradle | 2 +- examples/example-hostname/pom.xml | 2 +- examples/example-jwt-auth/build.gradle | 2 +- examples/example-jwt-auth/pom.xml | 4 ++-- examples/example-oauth/build.gradle | 2 +- examples/example-oauth/pom.xml | 4 ++-- examples/example-opentelemetry/build.gradle | 2 +- examples/example-orca/build.gradle | 2 +- examples/example-reflection/build.gradle | 2 +- examples/example-servlet/build.gradle | 2 +- examples/example-tls/build.gradle | 2 +- examples/example-tls/pom.xml | 2 +- examples/example-xds/build.gradle | 2 +- interop-testing/build.gradle | 4 +++- xds/build.gradle | 4 +++- 29 files changed, 39 insertions(+), 35 deletions(-) diff --git a/README.md b/README.md index f12fa0e1986..b9abfe10ae1 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ For protobuf-based codegen integrated with the Maven build system, you can use protobuf-maven-plugin 0.6.1 - com.google.protobuf:protoc:3.25.8:exe:${os.detected.classifier} + com.google.protobuf:protoc:3.25.9:exe:${os.detected.classifier} grpc-java io.grpc:protoc-gen-grpc-java:1.82.1:exe:${os.detected.classifier} @@ -149,7 +149,7 @@ plugins { protobuf { protoc { - artifact = "com.google.protobuf:protoc:3.25.8" + artifact = "com.google.protobuf:protoc:3.25.9" } plugins { grpc { @@ -182,7 +182,7 @@ plugins { protobuf { protoc { - artifact = "com.google.protobuf:protoc:3.25.8" + artifact = "com.google.protobuf:protoc:3.25.9" } plugins { grpc { diff --git a/buildscripts/kokoro/windows32.bat b/buildscripts/kokoro/windows32.bat index 90c74a57f1a..c79b1f25f04 100644 --- a/buildscripts/kokoro/windows32.bat +++ b/buildscripts/kokoro/windows32.bat @@ -25,7 +25,7 @@ cd "%WORKSPACE%" SET TARGET_ARCH=x86_32 SET FAIL_ON_WARNINGS=true -SET PROTOBUF_VER=35.1 +SET PROTOBUF_VER=25.6 SET PKG_CONFIG_PATH=%ESCWORKSPACE%\\grpc-java-helper32\\protobuf-%PROTOBUF_VER%\\build\\protobuf-%PROTOBUF_VER%\\lib\\pkgconfig SET VC_PROTOBUF_LIBS=/LIBPATH:%ESCWORKSPACE%\\grpc-java-helper32\\protobuf-%PROTOBUF_VER%\\build\\protobuf-%PROTOBUF_VER%\\lib SET VC_PROTOBUF_INCLUDE=%ESCWORKSPACE%\\grpc-java-helper32\\protobuf-%PROTOBUF_VER%\\build\\protobuf-%PROTOBUF_VER%\\include diff --git a/buildscripts/kokoro/windows64.bat b/buildscripts/kokoro/windows64.bat index dba07807d03..cab87a03c4d 100644 --- a/buildscripts/kokoro/windows64.bat +++ b/buildscripts/kokoro/windows64.bat @@ -24,7 +24,7 @@ cd "%WORKSPACE%" SET TARGET_ARCH=x86_64 SET FAIL_ON_WARNINGS=true -SET PROTOBUF_VER=35.1 +SET PROTOBUF_VER=25.6 SET PKG_CONFIG_PATH=%ESCWORKSPACE%\\grpc-java-helper64\\protobuf-%PROTOBUF_VER%\\build\\protobuf-%PROTOBUF_VER%\\lib\\pkgconfig SET VC_PROTOBUF_LIBS=/LIBPATH:%ESCWORKSPACE%\\grpc-java-helper64\\protobuf-%PROTOBUF_VER%\\build\\protobuf-%PROTOBUF_VER%\\lib SET VC_PROTOBUF_INCLUDE=%ESCWORKSPACE%\\grpc-java-helper64\\protobuf-%PROTOBUF_VER%\\build\\protobuf-%PROTOBUF_VER%\\include diff --git a/buildscripts/make_dependencies.bat b/buildscripts/make_dependencies.bat index 4ff775347a5..cec5b3e71b2 100644 --- a/buildscripts/make_dependencies.bat +++ b/buildscripts/make_dependencies.bat @@ -1,8 +1,8 @@ choco install -y pkgconfiglite choco install -y openjdk --version=17.0 set PATH=%PATH%;"c:\Program Files\OpenJDK\jdk-17\bin" -set PROTOBUF_VER=35.1 -set ABSL_VERSION=20250127.1 +set PROTOBUF_VER=25.6 +set ABSL_VERSION=20230802.1 set CMAKE_NAME=cmake-3.26.3-windows-x86_64 if not exist "protobuf-%PROTOBUF_VER%\build\Release\" ( diff --git a/buildscripts/make_dependencies.sh b/buildscripts/make_dependencies.sh index 600e2d40a1b..bd003918b59 100755 --- a/buildscripts/make_dependencies.sh +++ b/buildscripts/make_dependencies.sh @@ -3,8 +3,8 @@ # Build protoc set -evux -o pipefail -PROTOBUF_VERSION=35.1 -ABSL_VERSION=20250127.1 +PROTOBUF_VERSION=25.6 +ABSL_VERSION=20230802.1 # ARCH is x86_64 bit unless otherwise specified. ARCH="${ARCH:-x86_64}" diff --git a/examples/example-alts/build.gradle b/examples/example-alts/build.gradle index 59963c7ca5f..2da10b0bb5d 100644 --- a/examples/example-alts/build.gradle +++ b/examples/example-alts/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.8' +def protocVersion = '3.25.9' dependencies { // grpc-alts transitively depends on grpc-netty-shaded, grpc-protobuf, and grpc-stub diff --git a/examples/example-debug/build.gradle b/examples/example-debug/build.gradle index 5df4432c518..141da213e5e 100644 --- a/examples/example-debug/build.gradle +++ b/examples/example-debug/build.gradle @@ -24,7 +24,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protobufVersion = '3.25.8' +def protobufVersion = '3.25.9' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/examples/example-debug/pom.xml b/examples/example-debug/pom.xml index 9b4a24dcbc8..0690e59cd91 100644 --- a/examples/example-debug/pom.xml +++ b/examples/example-debug/pom.xml @@ -13,7 +13,7 @@ UTF-8 1.84.0-SNAPSHOT - 3.25.8 + 3.25.9 1.8 1.8 diff --git a/examples/example-dualstack/build.gradle b/examples/example-dualstack/build.gradle index f9ed301ad67..3f744f12077 100644 --- a/examples/example-dualstack/build.gradle +++ b/examples/example-dualstack/build.gradle @@ -24,7 +24,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protobufVersion = '3.25.8' +def protobufVersion = '3.25.9' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/examples/example-dualstack/pom.xml b/examples/example-dualstack/pom.xml index 6c05aff9759..c40421c1c39 100644 --- a/examples/example-dualstack/pom.xml +++ b/examples/example-dualstack/pom.xml @@ -13,7 +13,7 @@ UTF-8 1.84.0-SNAPSHOT - 3.25.8 + 3.25.9 1.8 1.8 diff --git a/examples/example-gauth/build.gradle b/examples/example-gauth/build.gradle index 6106f30a981..5287819728d 100644 --- a/examples/example-gauth/build.gradle +++ b/examples/example-gauth/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protobufVersion = '3.25.8' +def protobufVersion = '3.25.9' def protocVersion = protobufVersion diff --git a/examples/example-gauth/pom.xml b/examples/example-gauth/pom.xml index cd0a395cdde..ebde5e22ca7 100644 --- a/examples/example-gauth/pom.xml +++ b/examples/example-gauth/pom.xml @@ -13,7 +13,7 @@ UTF-8 1.84.0-SNAPSHOT - 3.25.8 + 3.25.9 1.8 1.8 diff --git a/examples/example-gcp-csm-observability/build.gradle b/examples/example-gcp-csm-observability/build.gradle index 3e9051acd09..0084464d4f2 100644 --- a/examples/example-gcp-csm-observability/build.gradle +++ b/examples/example-gcp-csm-observability/build.gradle @@ -23,7 +23,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.8' +def protocVersion = '3.25.9' def openTelemetryVersion = '1.63.0' def openTelemetryPrometheusVersion = '1.63.0-alpha' diff --git a/examples/example-gcp-observability/build.gradle b/examples/example-gcp-observability/build.gradle index b81bcb6b762..ab73b99f891 100644 --- a/examples/example-gcp-observability/build.gradle +++ b/examples/example-gcp-observability/build.gradle @@ -23,7 +23,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.8' +def protocVersion = '3.25.9' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/examples/example-hostname/build.gradle b/examples/example-hostname/build.gradle index 5926ac1ee08..cd11db311ef 100644 --- a/examples/example-hostname/build.gradle +++ b/examples/example-hostname/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protobufVersion = '3.25.8' +def protobufVersion = '3.25.9' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/examples/example-hostname/pom.xml b/examples/example-hostname/pom.xml index 5f65084692a..c0156044153 100644 --- a/examples/example-hostname/pom.xml +++ b/examples/example-hostname/pom.xml @@ -13,7 +13,7 @@ UTF-8 1.84.0-SNAPSHOT - 3.25.8 + 3.25.9 1.8 1.8 diff --git a/examples/example-jwt-auth/build.gradle b/examples/example-jwt-auth/build.gradle index 436a17bb079..82ffd7c8add 100644 --- a/examples/example-jwt-auth/build.gradle +++ b/examples/example-jwt-auth/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protobufVersion = '3.25.8' +def protobufVersion = '3.25.9' def protocVersion = protobufVersion dependencies { diff --git a/examples/example-jwt-auth/pom.xml b/examples/example-jwt-auth/pom.xml index e198cbaf816..1d0ac563a9a 100644 --- a/examples/example-jwt-auth/pom.xml +++ b/examples/example-jwt-auth/pom.xml @@ -14,8 +14,8 @@ UTF-8 1.84.0-SNAPSHOT - 3.25.8 - 3.25.8 + 3.25.9 + 3.25.9 1.8 1.8 diff --git a/examples/example-oauth/build.gradle b/examples/example-oauth/build.gradle index 5232e0ace32..db5d043ec2f 100644 --- a/examples/example-oauth/build.gradle +++ b/examples/example-oauth/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protobufVersion = '3.25.8' +def protobufVersion = '3.25.9' def protocVersion = protobufVersion dependencies { diff --git a/examples/example-oauth/pom.xml b/examples/example-oauth/pom.xml index 0401fb38df7..d21f66a5dc6 100644 --- a/examples/example-oauth/pom.xml +++ b/examples/example-oauth/pom.xml @@ -14,8 +14,8 @@ UTF-8 1.84.0-SNAPSHOT - 3.25.8 - 3.25.8 + 3.25.9 + 3.25.9 1.8 1.8 diff --git a/examples/example-opentelemetry/build.gradle b/examples/example-opentelemetry/build.gradle index 842c9cafe7f..1173aa27a81 100644 --- a/examples/example-opentelemetry/build.gradle +++ b/examples/example-opentelemetry/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.8' +def protocVersion = '3.25.9' def openTelemetryVersion = '1.63.0' def openTelemetryPrometheusVersion = '1.63.0-alpha' diff --git a/examples/example-orca/build.gradle b/examples/example-orca/build.gradle index ffcd8dd3e99..0f9fd2d385f 100644 --- a/examples/example-orca/build.gradle +++ b/examples/example-orca/build.gradle @@ -17,7 +17,7 @@ java { } def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.8' +def protocVersion = '3.25.9' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/examples/example-reflection/build.gradle b/examples/example-reflection/build.gradle index 5f729f534ed..450ba681046 100644 --- a/examples/example-reflection/build.gradle +++ b/examples/example-reflection/build.gradle @@ -17,7 +17,7 @@ java { } def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.8' +def protocVersion = '3.25.9' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/examples/example-servlet/build.gradle b/examples/example-servlet/build.gradle index ce786c8f21e..3f7733015a2 100644 --- a/examples/example-servlet/build.gradle +++ b/examples/example-servlet/build.gradle @@ -16,7 +16,7 @@ java { } def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.8' +def protocVersion = '3.25.9' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}", diff --git a/examples/example-tls/build.gradle b/examples/example-tls/build.gradle index 57e9923e9ee..a9bc492832e 100644 --- a/examples/example-tls/build.gradle +++ b/examples/example-tls/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.8' +def protocVersion = '3.25.9' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/examples/example-tls/pom.xml b/examples/example-tls/pom.xml index 74129e43b0b..5015e4037c7 100644 --- a/examples/example-tls/pom.xml +++ b/examples/example-tls/pom.xml @@ -13,7 +13,7 @@ UTF-8 1.84.0-SNAPSHOT - 3.25.8 + 3.25.9 1.8 1.8 diff --git a/examples/example-xds/build.gradle b/examples/example-xds/build.gradle index 2b894562204..30a8042ed29 100644 --- a/examples/example-xds/build.gradle +++ b/examples/example-xds/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.8' +def protocVersion = '3.25.9' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/interop-testing/build.gradle b/interop-testing/build.gradle index eab52afff78..3f12e0e2c6d 100644 --- a/interop-testing/build.gradle +++ b/interop-testing/build.gradle @@ -42,10 +42,12 @@ dependencies { runtimeOnly libraries.opencensus.impl, libraries.netty.tcnative, libraries.netty.tcnative.classes, - libraries.opentelemetry.exporter.prometheus, // For xds interop client project(':grpc-googleapis'), project(':grpc-grpclb'), project(':grpc-rls') + runtimeOnly(libraries.opentelemetry.exporter.prometheus) { // For xds interop client + exclude group: 'com.google.protobuf', module: 'protobuf-java' + } testImplementation testFixtures(project(':grpc-api')), testFixtures(project(':grpc-core')), project(':grpc-inprocess'), diff --git a/xds/build.gradle b/xds/build.gradle index c6325f7fc2d..65d340bd123 100644 --- a/xds/build.gradle +++ b/xds/build.gradle @@ -70,7 +70,9 @@ dependencies { testImplementation project(':grpc-inprocess') testImplementation libraries.opentelemetry.api testImplementation libraries.opentelemetry.sdk.testing - testImplementation libraries.cel.compiler + testImplementation(libraries.cel.compiler) { + exclude group: 'com.google.protobuf', module: 'protobuf-java' + } testImplementation testFixtures(project(':grpc-core')), testFixtures(project(':grpc-api')), testFixtures(project(':grpc-util')) From 696df7d9f085ca2fb419828fcbecdd10dcd12bb8 Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Mon, 10 Aug 2026 15:09:08 +0000 Subject: [PATCH 08/18] Revert "Upgrade to protobuf 3.25.9 / 25.6" This reverts commit 625ce3975c008638cae3ac9566c343443f2ac1df. --- README.md | 6 +++--- buildscripts/kokoro/windows32.bat | 2 +- buildscripts/kokoro/windows64.bat | 2 +- buildscripts/make_dependencies.bat | 4 ++-- buildscripts/make_dependencies.sh | 4 ++-- examples/example-alts/build.gradle | 2 +- examples/example-debug/build.gradle | 2 +- examples/example-debug/pom.xml | 2 +- examples/example-dualstack/build.gradle | 2 +- examples/example-dualstack/pom.xml | 2 +- examples/example-gauth/build.gradle | 2 +- examples/example-gauth/pom.xml | 2 +- examples/example-gcp-csm-observability/build.gradle | 2 +- examples/example-gcp-observability/build.gradle | 2 +- examples/example-hostname/build.gradle | 2 +- examples/example-hostname/pom.xml | 2 +- examples/example-jwt-auth/build.gradle | 2 +- examples/example-jwt-auth/pom.xml | 4 ++-- examples/example-oauth/build.gradle | 2 +- examples/example-oauth/pom.xml | 4 ++-- examples/example-opentelemetry/build.gradle | 2 +- examples/example-orca/build.gradle | 2 +- examples/example-reflection/build.gradle | 2 +- examples/example-servlet/build.gradle | 2 +- examples/example-tls/build.gradle | 2 +- examples/example-tls/pom.xml | 2 +- examples/example-xds/build.gradle | 2 +- interop-testing/build.gradle | 4 +--- xds/build.gradle | 4 +--- 29 files changed, 35 insertions(+), 39 deletions(-) diff --git a/README.md b/README.md index b9abfe10ae1..f12fa0e1986 100644 --- a/README.md +++ b/README.md @@ -121,7 +121,7 @@ For protobuf-based codegen integrated with the Maven build system, you can use protobuf-maven-plugin 0.6.1 - com.google.protobuf:protoc:3.25.9:exe:${os.detected.classifier} + com.google.protobuf:protoc:3.25.8:exe:${os.detected.classifier} grpc-java io.grpc:protoc-gen-grpc-java:1.82.1:exe:${os.detected.classifier} @@ -149,7 +149,7 @@ plugins { protobuf { protoc { - artifact = "com.google.protobuf:protoc:3.25.9" + artifact = "com.google.protobuf:protoc:3.25.8" } plugins { grpc { @@ -182,7 +182,7 @@ plugins { protobuf { protoc { - artifact = "com.google.protobuf:protoc:3.25.9" + artifact = "com.google.protobuf:protoc:3.25.8" } plugins { grpc { diff --git a/buildscripts/kokoro/windows32.bat b/buildscripts/kokoro/windows32.bat index c79b1f25f04..90c74a57f1a 100644 --- a/buildscripts/kokoro/windows32.bat +++ b/buildscripts/kokoro/windows32.bat @@ -25,7 +25,7 @@ cd "%WORKSPACE%" SET TARGET_ARCH=x86_32 SET FAIL_ON_WARNINGS=true -SET PROTOBUF_VER=25.6 +SET PROTOBUF_VER=35.1 SET PKG_CONFIG_PATH=%ESCWORKSPACE%\\grpc-java-helper32\\protobuf-%PROTOBUF_VER%\\build\\protobuf-%PROTOBUF_VER%\\lib\\pkgconfig SET VC_PROTOBUF_LIBS=/LIBPATH:%ESCWORKSPACE%\\grpc-java-helper32\\protobuf-%PROTOBUF_VER%\\build\\protobuf-%PROTOBUF_VER%\\lib SET VC_PROTOBUF_INCLUDE=%ESCWORKSPACE%\\grpc-java-helper32\\protobuf-%PROTOBUF_VER%\\build\\protobuf-%PROTOBUF_VER%\\include diff --git a/buildscripts/kokoro/windows64.bat b/buildscripts/kokoro/windows64.bat index cab87a03c4d..dba07807d03 100644 --- a/buildscripts/kokoro/windows64.bat +++ b/buildscripts/kokoro/windows64.bat @@ -24,7 +24,7 @@ cd "%WORKSPACE%" SET TARGET_ARCH=x86_64 SET FAIL_ON_WARNINGS=true -SET PROTOBUF_VER=25.6 +SET PROTOBUF_VER=35.1 SET PKG_CONFIG_PATH=%ESCWORKSPACE%\\grpc-java-helper64\\protobuf-%PROTOBUF_VER%\\build\\protobuf-%PROTOBUF_VER%\\lib\\pkgconfig SET VC_PROTOBUF_LIBS=/LIBPATH:%ESCWORKSPACE%\\grpc-java-helper64\\protobuf-%PROTOBUF_VER%\\build\\protobuf-%PROTOBUF_VER%\\lib SET VC_PROTOBUF_INCLUDE=%ESCWORKSPACE%\\grpc-java-helper64\\protobuf-%PROTOBUF_VER%\\build\\protobuf-%PROTOBUF_VER%\\include diff --git a/buildscripts/make_dependencies.bat b/buildscripts/make_dependencies.bat index cec5b3e71b2..4ff775347a5 100644 --- a/buildscripts/make_dependencies.bat +++ b/buildscripts/make_dependencies.bat @@ -1,8 +1,8 @@ choco install -y pkgconfiglite choco install -y openjdk --version=17.0 set PATH=%PATH%;"c:\Program Files\OpenJDK\jdk-17\bin" -set PROTOBUF_VER=25.6 -set ABSL_VERSION=20230802.1 +set PROTOBUF_VER=35.1 +set ABSL_VERSION=20250127.1 set CMAKE_NAME=cmake-3.26.3-windows-x86_64 if not exist "protobuf-%PROTOBUF_VER%\build\Release\" ( diff --git a/buildscripts/make_dependencies.sh b/buildscripts/make_dependencies.sh index bd003918b59..600e2d40a1b 100755 --- a/buildscripts/make_dependencies.sh +++ b/buildscripts/make_dependencies.sh @@ -3,8 +3,8 @@ # Build protoc set -evux -o pipefail -PROTOBUF_VERSION=25.6 -ABSL_VERSION=20230802.1 +PROTOBUF_VERSION=35.1 +ABSL_VERSION=20250127.1 # ARCH is x86_64 bit unless otherwise specified. ARCH="${ARCH:-x86_64}" diff --git a/examples/example-alts/build.gradle b/examples/example-alts/build.gradle index 2da10b0bb5d..59963c7ca5f 100644 --- a/examples/example-alts/build.gradle +++ b/examples/example-alts/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.9' +def protocVersion = '3.25.8' dependencies { // grpc-alts transitively depends on grpc-netty-shaded, grpc-protobuf, and grpc-stub diff --git a/examples/example-debug/build.gradle b/examples/example-debug/build.gradle index 141da213e5e..5df4432c518 100644 --- a/examples/example-debug/build.gradle +++ b/examples/example-debug/build.gradle @@ -24,7 +24,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protobufVersion = '3.25.9' +def protobufVersion = '3.25.8' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/examples/example-debug/pom.xml b/examples/example-debug/pom.xml index 0690e59cd91..9b4a24dcbc8 100644 --- a/examples/example-debug/pom.xml +++ b/examples/example-debug/pom.xml @@ -13,7 +13,7 @@ UTF-8 1.84.0-SNAPSHOT - 3.25.9 + 3.25.8 1.8 1.8 diff --git a/examples/example-dualstack/build.gradle b/examples/example-dualstack/build.gradle index 3f744f12077..f9ed301ad67 100644 --- a/examples/example-dualstack/build.gradle +++ b/examples/example-dualstack/build.gradle @@ -24,7 +24,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protobufVersion = '3.25.9' +def protobufVersion = '3.25.8' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/examples/example-dualstack/pom.xml b/examples/example-dualstack/pom.xml index c40421c1c39..6c05aff9759 100644 --- a/examples/example-dualstack/pom.xml +++ b/examples/example-dualstack/pom.xml @@ -13,7 +13,7 @@ UTF-8 1.84.0-SNAPSHOT - 3.25.9 + 3.25.8 1.8 1.8 diff --git a/examples/example-gauth/build.gradle b/examples/example-gauth/build.gradle index 5287819728d..6106f30a981 100644 --- a/examples/example-gauth/build.gradle +++ b/examples/example-gauth/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protobufVersion = '3.25.9' +def protobufVersion = '3.25.8' def protocVersion = protobufVersion diff --git a/examples/example-gauth/pom.xml b/examples/example-gauth/pom.xml index ebde5e22ca7..cd0a395cdde 100644 --- a/examples/example-gauth/pom.xml +++ b/examples/example-gauth/pom.xml @@ -13,7 +13,7 @@ UTF-8 1.84.0-SNAPSHOT - 3.25.9 + 3.25.8 1.8 1.8 diff --git a/examples/example-gcp-csm-observability/build.gradle b/examples/example-gcp-csm-observability/build.gradle index 0084464d4f2..3e9051acd09 100644 --- a/examples/example-gcp-csm-observability/build.gradle +++ b/examples/example-gcp-csm-observability/build.gradle @@ -23,7 +23,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.9' +def protocVersion = '3.25.8' def openTelemetryVersion = '1.63.0' def openTelemetryPrometheusVersion = '1.63.0-alpha' diff --git a/examples/example-gcp-observability/build.gradle b/examples/example-gcp-observability/build.gradle index ab73b99f891..b81bcb6b762 100644 --- a/examples/example-gcp-observability/build.gradle +++ b/examples/example-gcp-observability/build.gradle @@ -23,7 +23,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.9' +def protocVersion = '3.25.8' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/examples/example-hostname/build.gradle b/examples/example-hostname/build.gradle index cd11db311ef..5926ac1ee08 100644 --- a/examples/example-hostname/build.gradle +++ b/examples/example-hostname/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protobufVersion = '3.25.9' +def protobufVersion = '3.25.8' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/examples/example-hostname/pom.xml b/examples/example-hostname/pom.xml index c0156044153..5f65084692a 100644 --- a/examples/example-hostname/pom.xml +++ b/examples/example-hostname/pom.xml @@ -13,7 +13,7 @@ UTF-8 1.84.0-SNAPSHOT - 3.25.9 + 3.25.8 1.8 1.8 diff --git a/examples/example-jwt-auth/build.gradle b/examples/example-jwt-auth/build.gradle index 82ffd7c8add..436a17bb079 100644 --- a/examples/example-jwt-auth/build.gradle +++ b/examples/example-jwt-auth/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protobufVersion = '3.25.9' +def protobufVersion = '3.25.8' def protocVersion = protobufVersion dependencies { diff --git a/examples/example-jwt-auth/pom.xml b/examples/example-jwt-auth/pom.xml index 1d0ac563a9a..e198cbaf816 100644 --- a/examples/example-jwt-auth/pom.xml +++ b/examples/example-jwt-auth/pom.xml @@ -14,8 +14,8 @@ UTF-8 1.84.0-SNAPSHOT - 3.25.9 - 3.25.9 + 3.25.8 + 3.25.8 1.8 1.8 diff --git a/examples/example-oauth/build.gradle b/examples/example-oauth/build.gradle index db5d043ec2f..5232e0ace32 100644 --- a/examples/example-oauth/build.gradle +++ b/examples/example-oauth/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protobufVersion = '3.25.9' +def protobufVersion = '3.25.8' def protocVersion = protobufVersion dependencies { diff --git a/examples/example-oauth/pom.xml b/examples/example-oauth/pom.xml index d21f66a5dc6..0401fb38df7 100644 --- a/examples/example-oauth/pom.xml +++ b/examples/example-oauth/pom.xml @@ -14,8 +14,8 @@ UTF-8 1.84.0-SNAPSHOT - 3.25.9 - 3.25.9 + 3.25.8 + 3.25.8 1.8 1.8 diff --git a/examples/example-opentelemetry/build.gradle b/examples/example-opentelemetry/build.gradle index 1173aa27a81..842c9cafe7f 100644 --- a/examples/example-opentelemetry/build.gradle +++ b/examples/example-opentelemetry/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.9' +def protocVersion = '3.25.8' def openTelemetryVersion = '1.63.0' def openTelemetryPrometheusVersion = '1.63.0-alpha' diff --git a/examples/example-orca/build.gradle b/examples/example-orca/build.gradle index 0f9fd2d385f..ffcd8dd3e99 100644 --- a/examples/example-orca/build.gradle +++ b/examples/example-orca/build.gradle @@ -17,7 +17,7 @@ java { } def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.9' +def protocVersion = '3.25.8' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/examples/example-reflection/build.gradle b/examples/example-reflection/build.gradle index 450ba681046..5f729f534ed 100644 --- a/examples/example-reflection/build.gradle +++ b/examples/example-reflection/build.gradle @@ -17,7 +17,7 @@ java { } def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.9' +def protocVersion = '3.25.8' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/examples/example-servlet/build.gradle b/examples/example-servlet/build.gradle index 3f7733015a2..ce786c8f21e 100644 --- a/examples/example-servlet/build.gradle +++ b/examples/example-servlet/build.gradle @@ -16,7 +16,7 @@ java { } def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.9' +def protocVersion = '3.25.8' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}", diff --git a/examples/example-tls/build.gradle b/examples/example-tls/build.gradle index a9bc492832e..57e9923e9ee 100644 --- a/examples/example-tls/build.gradle +++ b/examples/example-tls/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.9' +def protocVersion = '3.25.8' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/examples/example-tls/pom.xml b/examples/example-tls/pom.xml index 5015e4037c7..74129e43b0b 100644 --- a/examples/example-tls/pom.xml +++ b/examples/example-tls/pom.xml @@ -13,7 +13,7 @@ UTF-8 1.84.0-SNAPSHOT - 3.25.9 + 3.25.8 1.8 1.8 diff --git a/examples/example-xds/build.gradle b/examples/example-xds/build.gradle index 30a8042ed29..2b894562204 100644 --- a/examples/example-xds/build.gradle +++ b/examples/example-xds/build.gradle @@ -22,7 +22,7 @@ java { // Feel free to delete the comment at the next line. It is just for safely // updating the version in our release process. def grpcVersion = '1.84.0-SNAPSHOT' // CURRENT_GRPC_VERSION -def protocVersion = '3.25.9' +def protocVersion = '3.25.8' dependencies { implementation "io.grpc:grpc-protobuf:${grpcVersion}" diff --git a/interop-testing/build.gradle b/interop-testing/build.gradle index 3f12e0e2c6d..eab52afff78 100644 --- a/interop-testing/build.gradle +++ b/interop-testing/build.gradle @@ -42,12 +42,10 @@ dependencies { runtimeOnly libraries.opencensus.impl, libraries.netty.tcnative, libraries.netty.tcnative.classes, + libraries.opentelemetry.exporter.prometheus, // For xds interop client project(':grpc-googleapis'), project(':grpc-grpclb'), project(':grpc-rls') - runtimeOnly(libraries.opentelemetry.exporter.prometheus) { // For xds interop client - exclude group: 'com.google.protobuf', module: 'protobuf-java' - } testImplementation testFixtures(project(':grpc-api')), testFixtures(project(':grpc-core')), project(':grpc-inprocess'), diff --git a/xds/build.gradle b/xds/build.gradle index 65d340bd123..c6325f7fc2d 100644 --- a/xds/build.gradle +++ b/xds/build.gradle @@ -70,9 +70,7 @@ dependencies { testImplementation project(':grpc-inprocess') testImplementation libraries.opentelemetry.api testImplementation libraries.opentelemetry.sdk.testing - testImplementation(libraries.cel.compiler) { - exclude group: 'com.google.protobuf', module: 'protobuf-java' - } + testImplementation libraries.cel.compiler testImplementation testFixtures(project(':grpc-core')), testFixtures(project(':grpc-api')), testFixtures(project(':grpc-util')) From f3a16f3f2d0950cfcc70166f4565f18c3b40adf0 Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Tue, 18 Aug 2026 05:05:40 +0000 Subject: [PATCH 09/18] opentelemetry: stabilize tracing and remove GRPC_EXPERIMENTAL_ENABLE_OTEL_TRACING flag --- .../integration/TestServiceClient.java | 7 ++--- .../integration/TestServiceServer.java | 7 ++--- .../OpenTelemetryContextPropagationTest.java | 7 ++--- .../grpc/opentelemetry/GrpcOpenTelemetry.java | 22 ++++++-------- .../InternalGrpcOpenTelemetry.java | 5 ++++ .../opentelemetry/GrpcOpenTelemetryTest.java | 30 ++++++++++--------- 6 files changed, 39 insertions(+), 39 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 39d14499030..583d8a3a995 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 @@ -327,10 +327,9 @@ void setUp() { previous, GrpcTraceBinContextPropagator.defaultInstance())) .build(); this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk(); - GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder() - .sdk(openTelemetrySdk); - InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true); - GrpcOpenTelemetry grpcOpenTelemetry = grpcOpentelemetryBuilder.build(); + GrpcOpenTelemetry grpcOpenTelemetry = GrpcOpenTelemetry.newBuilder() + .sdk(openTelemetrySdk) + .build(); grpcOpenTelemetry.registerGlobal(); } tester.setUp(); diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java index f8d12871071..8488d9cca68 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java @@ -177,10 +177,9 @@ void start() throws Exception { previous, GrpcTraceBinContextPropagator.defaultInstance())) .build(); this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk(); - GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder() - .sdk(openTelemetrySdk); - InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true); - GrpcOpenTelemetry grpcOpenTelemetry = grpcOpentelemetryBuilder.build(); + GrpcOpenTelemetry grpcOpenTelemetry = GrpcOpenTelemetry.newBuilder() + .sdk(openTelemetrySdk) + .build(); grpcOpenTelemetry.registerGlobal(); } executor = Executors.newSingleThreadScheduledExecutor(); diff --git a/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java b/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java index 726453d4194..fc137667494 100644 --- a/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java +++ b/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java @@ -78,10 +78,9 @@ public OpenTelemetryContextPropagationTest(TextMapPropagator textMapPropagator, .build(); this.tracer = openTelemetrySdk .getTracer("grpc-java-interop-test"); - GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder() - .sdk(openTelemetrySdk); - InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true); - grpcOpenTelemetry = grpcOpentelemetryBuilder.build(); + grpcOpenTelemetry = GrpcOpenTelemetry.newBuilder() + .sdk(openTelemetrySdk) + .build(); this.censusClient = isCensusClient; } diff --git a/opentelemetry/src/main/java/io/grpc/opentelemetry/GrpcOpenTelemetry.java b/opentelemetry/src/main/java/io/grpc/opentelemetry/GrpcOpenTelemetry.java index 87ad61c9f27..ef4d5ef244d 100644 --- a/opentelemetry/src/main/java/io/grpc/opentelemetry/GrpcOpenTelemetry.java +++ b/opentelemetry/src/main/java/io/grpc/opentelemetry/GrpcOpenTelemetry.java @@ -69,10 +69,6 @@ public Stopwatch get() { } }; - @VisibleForTesting - static boolean ENABLE_OTEL_TRACING = - GrpcUtil.getFlag("GRPC_EXPERIMENTAL_ENABLE_OTEL_TRACING", false); - private final OpenTelemetry openTelemetrySdk; private final MeterProvider meterProvider; private final Meter meter; @@ -177,9 +173,7 @@ public void configureChannelBuilder(ManagedChannelBuilder builder) { InternalManagedChannelBuilder.addMetricSink(builder, sink); InternalManagedChannelBuilder.interceptWithTarget( builder, openTelemetryMetricsModule::getClientInterceptor); - if (ENABLE_OTEL_TRACING) { - builder.intercept(openTelemetryTracingModule.getClientInterceptor()); - } + builder.intercept(openTelemetryTracingModule.getClientInterceptor()); } /** @@ -190,11 +184,9 @@ public void configureChannelBuilder(ManagedChannelBuilder builder) { public void configureServerBuilder(ServerBuilder serverBuilder) { /* To ensure baggage propagation to metrics, we need the tracing tracers to be initialised before metrics */ - if (ENABLE_OTEL_TRACING) { - serverBuilder.addStreamTracerFactory( - openTelemetryTracingModule.getServerTracerFactory()); - serverBuilder.intercept(openTelemetryTracingModule.getServerSpanPropagationInterceptor()); - } + serverBuilder.addStreamTracerFactory( + openTelemetryTracingModule.getServerTracerFactory()); + serverBuilder.intercept(openTelemetryTracingModule.getServerSpanPropagationInterceptor()); serverBuilder.addStreamTracerFactory(openTelemetryMetricsModule.getServerTracerFactory()); serverBuilder.addMetricSink(sink); } @@ -435,8 +427,12 @@ public Builder disableAllMetrics() { return this; } + /** + * @deprecated Tracing is enabled by default whenever GrpcOpenTelemetry is configured. + */ + @Deprecated + @SuppressWarnings("InlineMeSuggester") Builder enableTracing(boolean enable) { - ENABLE_OTEL_TRACING = enable; return this; } diff --git a/opentelemetry/src/main/java/io/grpc/opentelemetry/InternalGrpcOpenTelemetry.java b/opentelemetry/src/main/java/io/grpc/opentelemetry/InternalGrpcOpenTelemetry.java index ea1e7ab803f..98e40c9ab7e 100644 --- a/opentelemetry/src/main/java/io/grpc/opentelemetry/InternalGrpcOpenTelemetry.java +++ b/opentelemetry/src/main/java/io/grpc/opentelemetry/InternalGrpcOpenTelemetry.java @@ -30,6 +30,11 @@ public static void builderPlugin( builder.plugin(plugin); } + /** + * @deprecated Tracing is enabled by default whenever GrpcOpenTelemetry is configured. + */ + @Deprecated + @SuppressWarnings("InlineMeSuggester") public static void enableTracing(GrpcOpenTelemetry.Builder builder, boolean enable) { builder.enableTracing(enable); } diff --git a/opentelemetry/src/test/java/io/grpc/opentelemetry/GrpcOpenTelemetryTest.java b/opentelemetry/src/test/java/io/grpc/opentelemetry/GrpcOpenTelemetryTest.java index 77eadf9ebbb..d9e0a679ce2 100644 --- a/opentelemetry/src/test/java/io/grpc/opentelemetry/GrpcOpenTelemetryTest.java +++ b/opentelemetry/src/test/java/io/grpc/opentelemetry/GrpcOpenTelemetryTest.java @@ -36,9 +36,9 @@ import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader; import io.opentelemetry.sdk.trace.SdkTracerProvider; +import java.util.ArrayList; import java.util.Arrays; -import org.junit.After; -import org.junit.Before; +import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -50,17 +50,6 @@ public class GrpcOpenTelemetryTest { SdkMeterProvider.builder().registerMetricReader(inMemoryMetricReader).build(); private final SdkTracerProvider tracerProvider = SdkTracerProvider.builder().build(); private final OpenTelemetry noopOpenTelemetry = OpenTelemetry.noop(); - private boolean originalEnableOtelTracing; - - @Before - public void setup() { - originalEnableOtelTracing = GrpcOpenTelemetry.ENABLE_OTEL_TRACING; - } - - @After - public void tearDown() { - GrpcOpenTelemetry.ENABLE_OTEL_TRACING = originalEnableOtelTracing; - } @Test public void build() { @@ -87,7 +76,6 @@ public void buildTracer() { OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build(); GrpcOpenTelemetry grpcOpenTelemetry = GrpcOpenTelemetry.newBuilder() - .enableTracing(true) .sdk(sdk).build(); assertThat(grpcOpenTelemetry.getOpenTelemetryInstance()).isSameInstanceAs(sdk); @@ -177,17 +165,31 @@ public void configureChannelBuilder_registersMetricSink() { grpcOpenTelemetry.configureChannelBuilder(testBuilder); assertThat(testBuilder.metricSink).isSameInstanceAs(grpcOpenTelemetry.getSink()); assertThat(testBuilder.interceptorFactory).isNotNull(); + assertThat(testBuilder.interceptors).hasSize(1); } private static class TestChannelBuilder extends ForwardingChannelBuilder2 { Object interceptorFactory; MetricSink metricSink; + List interceptors = new ArrayList<>(); @Override protected ManagedChannelBuilder delegate() { return null; } + @Override + public TestChannelBuilder intercept(ClientInterceptor... interceptors) { + this.interceptors.addAll(Arrays.asList(interceptors)); + return this; + } + + @Override + public TestChannelBuilder intercept(List interceptors) { + this.interceptors.addAll(interceptors); + return this; + } + @Override protected TestChannelBuilder interceptWithTarget(InterceptorFactory factory) { this.interceptorFactory = factory; From a07d5c3a6d4778ecd9dcf32abcbf1d85cd50e068 Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Wed, 19 Aug 2026 07:47:12 +0000 Subject: [PATCH 10/18] test(interop): configure W3C tracecontext propagator in java interop client and server --- .../java/io/grpc/testing/integration/TestServiceClient.java | 6 ------ .../java/io/grpc/testing/integration/TestServiceServer.java | 6 ------ 2 files changed, 12 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 583d8a3a995..142d1d22452 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 @@ -58,7 +58,6 @@ 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; @@ -71,7 +70,6 @@ import io.grpc.testing.integration.Messages.StreamingOutputCallRequest; import io.grpc.testing.integration.Messages.StreamingOutputCallResponse; import io.grpc.testing.integration.Messages.TestOrcaReport; -import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import java.io.File; @@ -321,10 +319,6 @@ void parseArgs(String[] args) throws Exception { void setUp() { if (enableOpentelemetry) { AutoConfiguredOpenTelemetrySdk autoSdk = AutoConfiguredOpenTelemetrySdk.builder() - .addPropagatorCustomizer( - (previous, config) -> - TextMapPropagator.composite( - previous, GrpcTraceBinContextPropagator.defaultInstance())) .build(); this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk(); GrpcOpenTelemetry grpcOpenTelemetry = GrpcOpenTelemetry.newBuilder() diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java index 8488d9cca68..0be5c9345d5 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java @@ -29,13 +29,11 @@ import io.grpc.alts.AltsServerCredentials; import io.grpc.netty.NettyServerBuilder; import io.grpc.opentelemetry.GrpcOpenTelemetry; -import io.grpc.opentelemetry.GrpcTraceBinContextPropagator; import io.grpc.opentelemetry.InternalGrpcOpenTelemetry; import io.grpc.services.MetricRecorder; import io.grpc.testing.TlsTesting; import io.grpc.xds.orca.OrcaMetricReportingServerInterceptor; import io.grpc.xds.orca.OrcaServiceImpl; -import io.opentelemetry.context.propagation.TextMapPropagator; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import java.net.InetSocketAddress; @@ -171,10 +169,6 @@ void start() throws Exception { try { if (enableOpentelemetry) { AutoConfiguredOpenTelemetrySdk autoSdk = AutoConfiguredOpenTelemetrySdk.builder() - .addPropagatorCustomizer( - (previous, config) -> - TextMapPropagator.composite( - previous, GrpcTraceBinContextPropagator.defaultInstance())) .build(); this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk(); GrpcOpenTelemetry grpcOpenTelemetry = GrpcOpenTelemetry.newBuilder() From dae54f96b0e192993af699c0d089f7096e67889f Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Wed, 19 Aug 2026 11:28:27 +0000 Subject: [PATCH 11/18] test(interop): support CLI flag aliases for otel collector address and enable tracing --- .../integration/TestServiceClient.java | 24 +++++++++++++++--- .../integration/TestServiceServer.java | 25 ++++++++++++++++--- 2 files changed, 43 insertions(+), 6 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 142d1d22452..fc71f58705d 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 @@ -72,11 +72,14 @@ import io.grpc.testing.integration.Messages.TestOrcaReport; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.nio.charset.Charset; import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; @@ -143,6 +146,7 @@ public static void main(String[] args) throws Exception { private int soakResponseSize = 314159; private int numThreads = 1; private String additionalMetadata = ""; + private String otelCollectorAddress; private static LoadBalancerProvider customBackendMetricsLoadBalancerProvider; private Tester tester = new Tester(); @@ -226,8 +230,10 @@ void parseArgs(String[] args) throws Exception { numThreads = Integer.parseInt(value); } else if ("additional_metadata".equals(key)) { additionalMetadata = value; - } else if ("enable_opentelemetry".equals(key)) { + } else if ("enable_opentelemetry".equals(key) || "enable_otel_tracing".equals(key)) { enableOpentelemetry = Boolean.parseBoolean(value); + } else if ("otel_collector_address".equals(key) || "otlp_collector_address".equals(key)) { + otelCollectorAddress = value; } else { System.err.println("Unknown argument: " + key); usage = true; @@ -318,8 +324,20 @@ void parseArgs(String[] args) throws Exception { @IgnoreJRERequirement // OpenTelemetry uses Java 8+ APIs void setUp() { if (enableOpentelemetry) { - AutoConfiguredOpenTelemetrySdk autoSdk = AutoConfiguredOpenTelemetrySdk.builder() - .build(); + AutoConfiguredOpenTelemetrySdkBuilder sdkBuilder = + AutoConfiguredOpenTelemetrySdk.builder(); + Map properties = new HashMap<>(); + properties.put("otel.traces.exporter", "otlp"); + properties.put("otel.bsp.schedule.delay", "100"); + if (otelCollectorAddress != null && !otelCollectorAddress.isEmpty()) { + String endpoint = otelCollectorAddress; + if (!endpoint.startsWith("http://") && !endpoint.startsWith("https://")) { + endpoint = "http://" + endpoint; + } + properties.put("otel.exporter.otlp.endpoint", endpoint); + } + sdkBuilder.addPropertiesSupplier(() -> properties); + AutoConfiguredOpenTelemetrySdk autoSdk = sdkBuilder.build(); this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk(); GrpcOpenTelemetry grpcOpenTelemetry = GrpcOpenTelemetry.newBuilder() .sdk(openTelemetrySdk) diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java index 0be5c9345d5..f41ccc0ef4c 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java @@ -36,10 +36,14 @@ import io.grpc.xds.orca.OrcaServiceImpl; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; +import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder; import java.net.InetSocketAddress; import java.net.SocketAddress; +import java.util.Collections; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -82,6 +86,7 @@ public void run() { private boolean useAlts = false; private int mcsLimit = -1; private boolean enableOpentelemetry = false; + private String otelCollectorAddress; private OpenTelemetrySdk openTelemetrySdk; private ScheduledExecutorService executor; @@ -130,8 +135,10 @@ void parseArgs(String[] args) { mcsLimit = Integer.parseInt(value); // TODO: Make Netty server builder usable for IPV6 as well (not limited to MCS handling) addressType = Util.AddressType.IPV4; // To use NettyServerBuilder - } else if ("enable_opentelemetry".equals(key)) { + } else if ("enable_opentelemetry".equals(key) || "enable_otel_tracing".equals(key)) { enableOpentelemetry = Boolean.parseBoolean(value); + } else if ("otel_collector_address".equals(key) || "otlp_collector_address".equals(key)) { + otelCollectorAddress = value; } else { System.err.println("Unknown argument: " + key); usage = true; @@ -168,8 +175,20 @@ void parseArgs(String[] args) { void start() throws Exception { try { if (enableOpentelemetry) { - AutoConfiguredOpenTelemetrySdk autoSdk = AutoConfiguredOpenTelemetrySdk.builder() - .build(); + AutoConfiguredOpenTelemetrySdkBuilder sdkBuilder = + AutoConfiguredOpenTelemetrySdk.builder(); + Map properties = new HashMap<>(); + properties.put("otel.traces.exporter", "otlp"); + properties.put("otel.bsp.schedule.delay", "100"); + if (otelCollectorAddress != null && !otelCollectorAddress.isEmpty()) { + String endpoint = otelCollectorAddress; + if (!endpoint.startsWith("http://") && !endpoint.startsWith("https://")) { + endpoint = "http://" + endpoint; + } + properties.put("otel.exporter.otlp.endpoint", endpoint); + } + sdkBuilder.addPropertiesSupplier(() -> properties); + AutoConfiguredOpenTelemetrySdk autoSdk = sdkBuilder.build(); this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk(); GrpcOpenTelemetry grpcOpenTelemetry = GrpcOpenTelemetry.newBuilder() .sdk(openTelemetrySdk) From 643f3238f280fa31339feb2c15faba6885c16ef9 Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Wed, 19 Aug 2026 12:00:49 +0000 Subject: [PATCH 12/18] test(interop): cleanup flags and remove unused imports --- .../java/io/grpc/testing/integration/TestServiceClient.java | 5 ++--- .../java/io/grpc/testing/integration/TestServiceServer.java | 5 ++--- 2 files changed, 4 insertions(+), 6 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 fc71f58705d..33bc16b444d 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 @@ -78,7 +78,6 @@ import java.io.InputStream; import java.nio.charset.Charset; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.concurrent.BlockingQueue; @@ -230,9 +229,9 @@ void parseArgs(String[] args) throws Exception { numThreads = Integer.parseInt(value); } else if ("additional_metadata".equals(key)) { additionalMetadata = value; - } else if ("enable_opentelemetry".equals(key) || "enable_otel_tracing".equals(key)) { + } else if ("enable_opentelemetry".equals(key)) { enableOpentelemetry = Boolean.parseBoolean(value); - } else if ("otel_collector_address".equals(key) || "otlp_collector_address".equals(key)) { + } else if ("otel_collector_address".equals(key)) { otelCollectorAddress = value; } else { System.err.println("Unknown argument: " + key); diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java index f41ccc0ef4c..9e6f60eccdc 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java @@ -39,7 +39,6 @@ import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder; import java.net.InetSocketAddress; import java.net.SocketAddress; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -135,9 +134,9 @@ void parseArgs(String[] args) { mcsLimit = Integer.parseInt(value); // TODO: Make Netty server builder usable for IPV6 as well (not limited to MCS handling) addressType = Util.AddressType.IPV4; // To use NettyServerBuilder - } else if ("enable_opentelemetry".equals(key) || "enable_otel_tracing".equals(key)) { + } else if ("enable_opentelemetry".equals(key)) { enableOpentelemetry = Boolean.parseBoolean(value); - } else if ("otel_collector_address".equals(key) || "otlp_collector_address".equals(key)) { + } else if ("otel_collector_address".equals(key)) { otelCollectorAddress = value; } else { System.err.println("Unknown argument: " + key); From 361daa2f519503a3c3769bb910430921e0234686 Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Thu, 20 Aug 2026 07:57:54 +0000 Subject: [PATCH 13/18] revert(opentelemetry): revert production GrpcOpenTelemetry changes to match upstream master --- .../integration/TestServiceClient.java | 7 +++-- .../integration/TestServiceServer.java | 7 +++-- .../OpenTelemetryContextPropagationTest.java | 7 +++-- .../grpc/opentelemetry/GrpcOpenTelemetry.java | 22 ++++++++------ .../InternalGrpcOpenTelemetry.java | 5 ---- .../opentelemetry/GrpcOpenTelemetryTest.java | 30 +++++++++---------- 6 files changed, 39 insertions(+), 39 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 33bc16b444d..4e52d61e2ce 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 @@ -338,9 +338,10 @@ void setUp() { sdkBuilder.addPropertiesSupplier(() -> properties); AutoConfiguredOpenTelemetrySdk autoSdk = sdkBuilder.build(); this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk(); - GrpcOpenTelemetry grpcOpenTelemetry = GrpcOpenTelemetry.newBuilder() - .sdk(openTelemetrySdk) - .build(); + GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder() + .sdk(openTelemetrySdk); + InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true); + GrpcOpenTelemetry grpcOpenTelemetry = grpcOpentelemetryBuilder.build(); grpcOpenTelemetry.registerGlobal(); } tester.setUp(); diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java index 9e6f60eccdc..6f1b170d46a 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java @@ -189,9 +189,10 @@ void start() throws Exception { sdkBuilder.addPropertiesSupplier(() -> properties); AutoConfiguredOpenTelemetrySdk autoSdk = sdkBuilder.build(); this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk(); - GrpcOpenTelemetry grpcOpenTelemetry = GrpcOpenTelemetry.newBuilder() - .sdk(openTelemetrySdk) - .build(); + GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder() + .sdk(openTelemetrySdk); + InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true); + GrpcOpenTelemetry grpcOpenTelemetry = grpcOpentelemetryBuilder.build(); grpcOpenTelemetry.registerGlobal(); } executor = Executors.newSingleThreadScheduledExecutor(); diff --git a/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java b/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java index fc137667494..726453d4194 100644 --- a/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java +++ b/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java @@ -78,9 +78,10 @@ public OpenTelemetryContextPropagationTest(TextMapPropagator textMapPropagator, .build(); this.tracer = openTelemetrySdk .getTracer("grpc-java-interop-test"); - grpcOpenTelemetry = GrpcOpenTelemetry.newBuilder() - .sdk(openTelemetrySdk) - .build(); + GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder() + .sdk(openTelemetrySdk); + InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true); + grpcOpenTelemetry = grpcOpentelemetryBuilder.build(); this.censusClient = isCensusClient; } diff --git a/opentelemetry/src/main/java/io/grpc/opentelemetry/GrpcOpenTelemetry.java b/opentelemetry/src/main/java/io/grpc/opentelemetry/GrpcOpenTelemetry.java index ef4d5ef244d..87ad61c9f27 100644 --- a/opentelemetry/src/main/java/io/grpc/opentelemetry/GrpcOpenTelemetry.java +++ b/opentelemetry/src/main/java/io/grpc/opentelemetry/GrpcOpenTelemetry.java @@ -69,6 +69,10 @@ public Stopwatch get() { } }; + @VisibleForTesting + static boolean ENABLE_OTEL_TRACING = + GrpcUtil.getFlag("GRPC_EXPERIMENTAL_ENABLE_OTEL_TRACING", false); + private final OpenTelemetry openTelemetrySdk; private final MeterProvider meterProvider; private final Meter meter; @@ -173,7 +177,9 @@ public void configureChannelBuilder(ManagedChannelBuilder builder) { InternalManagedChannelBuilder.addMetricSink(builder, sink); InternalManagedChannelBuilder.interceptWithTarget( builder, openTelemetryMetricsModule::getClientInterceptor); - builder.intercept(openTelemetryTracingModule.getClientInterceptor()); + if (ENABLE_OTEL_TRACING) { + builder.intercept(openTelemetryTracingModule.getClientInterceptor()); + } } /** @@ -184,9 +190,11 @@ public void configureChannelBuilder(ManagedChannelBuilder builder) { public void configureServerBuilder(ServerBuilder serverBuilder) { /* To ensure baggage propagation to metrics, we need the tracing tracers to be initialised before metrics */ - serverBuilder.addStreamTracerFactory( - openTelemetryTracingModule.getServerTracerFactory()); - serverBuilder.intercept(openTelemetryTracingModule.getServerSpanPropagationInterceptor()); + if (ENABLE_OTEL_TRACING) { + serverBuilder.addStreamTracerFactory( + openTelemetryTracingModule.getServerTracerFactory()); + serverBuilder.intercept(openTelemetryTracingModule.getServerSpanPropagationInterceptor()); + } serverBuilder.addStreamTracerFactory(openTelemetryMetricsModule.getServerTracerFactory()); serverBuilder.addMetricSink(sink); } @@ -427,12 +435,8 @@ public Builder disableAllMetrics() { return this; } - /** - * @deprecated Tracing is enabled by default whenever GrpcOpenTelemetry is configured. - */ - @Deprecated - @SuppressWarnings("InlineMeSuggester") Builder enableTracing(boolean enable) { + ENABLE_OTEL_TRACING = enable; return this; } diff --git a/opentelemetry/src/main/java/io/grpc/opentelemetry/InternalGrpcOpenTelemetry.java b/opentelemetry/src/main/java/io/grpc/opentelemetry/InternalGrpcOpenTelemetry.java index 98e40c9ab7e..ea1e7ab803f 100644 --- a/opentelemetry/src/main/java/io/grpc/opentelemetry/InternalGrpcOpenTelemetry.java +++ b/opentelemetry/src/main/java/io/grpc/opentelemetry/InternalGrpcOpenTelemetry.java @@ -30,11 +30,6 @@ public static void builderPlugin( builder.plugin(plugin); } - /** - * @deprecated Tracing is enabled by default whenever GrpcOpenTelemetry is configured. - */ - @Deprecated - @SuppressWarnings("InlineMeSuggester") public static void enableTracing(GrpcOpenTelemetry.Builder builder, boolean enable) { builder.enableTracing(enable); } diff --git a/opentelemetry/src/test/java/io/grpc/opentelemetry/GrpcOpenTelemetryTest.java b/opentelemetry/src/test/java/io/grpc/opentelemetry/GrpcOpenTelemetryTest.java index d9e0a679ce2..77eadf9ebbb 100644 --- a/opentelemetry/src/test/java/io/grpc/opentelemetry/GrpcOpenTelemetryTest.java +++ b/opentelemetry/src/test/java/io/grpc/opentelemetry/GrpcOpenTelemetryTest.java @@ -36,9 +36,9 @@ import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader; import io.opentelemetry.sdk.trace.SdkTracerProvider; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; +import org.junit.After; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -50,6 +50,17 @@ public class GrpcOpenTelemetryTest { SdkMeterProvider.builder().registerMetricReader(inMemoryMetricReader).build(); private final SdkTracerProvider tracerProvider = SdkTracerProvider.builder().build(); private final OpenTelemetry noopOpenTelemetry = OpenTelemetry.noop(); + private boolean originalEnableOtelTracing; + + @Before + public void setup() { + originalEnableOtelTracing = GrpcOpenTelemetry.ENABLE_OTEL_TRACING; + } + + @After + public void tearDown() { + GrpcOpenTelemetry.ENABLE_OTEL_TRACING = originalEnableOtelTracing; + } @Test public void build() { @@ -76,6 +87,7 @@ public void buildTracer() { OpenTelemetrySdk.builder().setTracerProvider(tracerProvider).build(); GrpcOpenTelemetry grpcOpenTelemetry = GrpcOpenTelemetry.newBuilder() + .enableTracing(true) .sdk(sdk).build(); assertThat(grpcOpenTelemetry.getOpenTelemetryInstance()).isSameInstanceAs(sdk); @@ -165,31 +177,17 @@ public void configureChannelBuilder_registersMetricSink() { grpcOpenTelemetry.configureChannelBuilder(testBuilder); assertThat(testBuilder.metricSink).isSameInstanceAs(grpcOpenTelemetry.getSink()); assertThat(testBuilder.interceptorFactory).isNotNull(); - assertThat(testBuilder.interceptors).hasSize(1); } private static class TestChannelBuilder extends ForwardingChannelBuilder2 { Object interceptorFactory; MetricSink metricSink; - List interceptors = new ArrayList<>(); @Override protected ManagedChannelBuilder delegate() { return null; } - @Override - public TestChannelBuilder intercept(ClientInterceptor... interceptors) { - this.interceptors.addAll(Arrays.asList(interceptors)); - return this; - } - - @Override - public TestChannelBuilder intercept(List interceptors) { - this.interceptors.addAll(interceptors); - return this; - } - @Override protected TestChannelBuilder interceptWithTarget(InterceptorFactory factory) { this.interceptorFactory = factory; From 90fadba08a504d8ab99d688b468b64b79432683f Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Thu, 20 Aug 2026 08:19:16 +0000 Subject: [PATCH 14/18] clean(interop): remove unrelated whitespace and try-with-resources diffs in TestServiceClient and TestServiceServer --- .../integration/TestServiceClient.java | 55 +++-- .../integration/TestServiceServer.java | 189 ++++++++---------- 2 files changed, 111 insertions(+), 133 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 4e52d61e2ce..b8e1cce2c8a 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,8 +57,6 @@ import io.grpc.netty.NettyChannelBuilder; import io.grpc.okhttp.InternalOkHttpChannelBuilder; import io.grpc.okhttp.OkHttpChannelBuilder; -import io.grpc.opentelemetry.GrpcOpenTelemetry; -import io.grpc.opentelemetry.InternalGrpcOpenTelemetry; import io.grpc.stub.ClientCalls; import io.grpc.stub.MetadataUtils; import io.grpc.stub.StreamObserver; @@ -70,22 +68,24 @@ import io.grpc.testing.integration.Messages.StreamingOutputCallRequest; import io.grpc.testing.integration.Messages.StreamingOutputCallResponse; import io.grpc.testing.integration.Messages.TestOrcaReport; +import io.grpc.opentelemetry.GrpcOpenTelemetry; +import io.grpc.opentelemetry.InternalGrpcOpenTelemetry; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder; +import java.util.HashMap; +import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.nio.charset.Charset; import java.util.Arrays; -import java.util.HashMap; import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import javax.annotation.Nullable; -import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; /** * Application that starts a client for the {@link TestServiceGrpc.TestServiceImplBase} and runs @@ -108,9 +108,9 @@ public static void main(String[] args) throws Exception { client.parseArgs(args); customBackendMetricsLoadBalancerProvider = new CustomBackendMetricsLoadBalancerProvider(); LoadBalancerRegistry.getDefaultRegistry().register(customBackendMetricsLoadBalancerProvider); + client.setUp(); try { - client.setUp(); client.run(); } finally { client.tearDown(); @@ -125,8 +125,6 @@ public static void main(String[] args) throws Exception { private boolean useTls = true; private boolean useAlts = false; private boolean useH2cUpgrade = false; - private boolean enableOpentelemetry = false; - private OpenTelemetrySdk openTelemetrySdk; private String customCredentialsType; private boolean useTestCa; private boolean useOkHttp; @@ -144,8 +142,10 @@ public static void main(String[] args) throws Exception { private int soakRequestSize = 271828; private int soakResponseSize = 314159; private int numThreads = 1; - private String additionalMetadata = ""; + private boolean enableOpentelemetry; private String otelCollectorAddress; + private OpenTelemetrySdk openTelemetrySdk; + private String additionalMetadata = ""; private static LoadBalancerProvider customBackendMetricsLoadBalancerProvider; private Tester tester = new Tester(); @@ -328,9 +328,7 @@ void setUp() { Map properties = new HashMap<>(); properties.put("otel.traces.exporter", "otlp"); properties.put("otel.bsp.schedule.delay", "100"); - if (otelCollectorAddress != null && !otelCollectorAddress.isEmpty()) { String endpoint = otelCollectorAddress; - if (!endpoint.startsWith("http://") && !endpoint.startsWith("https://")) { endpoint = "http://" + endpoint; } properties.put("otel.exporter.otlp.endpoint", endpoint); @@ -350,11 +348,15 @@ void setUp() { private synchronized void tearDown() { try { tester.tearDown(); - } finally { if (customBackendMetricsLoadBalancerProvider != null) { LoadBalancerRegistry.getDefaultRegistry() .deregister(customBackendMetricsLoadBalancerProvider); } + } catch (RuntimeException ex) { + throw ex; + } catch (Exception ex) { + throw new RuntimeException(ex); + } finally { if (openTelemetrySdk != null) { openTelemetrySdk.close(); } @@ -461,36 +463,28 @@ private void runTest(TestCases testCase) throws Exception { case SERVICE_ACCOUNT_CREDS: { String jsonKey = Files.asCharSource(new File(serviceAccountKeyFile), UTF_8).read(); - try (FileInputStream credentialsStream = - new FileInputStream(new File(serviceAccountKeyFile))) { - tester.serviceAccountCreds(jsonKey, credentialsStream, oauthScope); - } + FileInputStream credentialsStream = new FileInputStream(new File(serviceAccountKeyFile)); + tester.serviceAccountCreds(jsonKey, credentialsStream, oauthScope); break; } case JWT_TOKEN_CREDS: { - try (FileInputStream credentialsStream = - new FileInputStream(new File(serviceAccountKeyFile))) { - tester.jwtTokenCreds(credentialsStream); - } + FileInputStream credentialsStream = new FileInputStream(new File(serviceAccountKeyFile)); + tester.jwtTokenCreds(credentialsStream); break; } case OAUTH2_AUTH_TOKEN: { String jsonKey = Files.asCharSource(new File(serviceAccountKeyFile), UTF_8).read(); - try (FileInputStream credentialsStream = - new FileInputStream(new File(serviceAccountKeyFile))) { - tester.oauth2AuthToken(jsonKey, credentialsStream, oauthScope); - } + FileInputStream credentialsStream = new FileInputStream(new File(serviceAccountKeyFile)); + tester.oauth2AuthToken(jsonKey, credentialsStream, oauthScope); break; } case PER_RPC_CREDS: { String jsonKey = Files.asCharSource(new File(serviceAccountKeyFile), UTF_8).read(); - try (FileInputStream credentialsStream = - new FileInputStream(new File(serviceAccountKeyFile))) { - tester.perRpcCreds(jsonKey, credentialsStream, oauthScope); - } + FileInputStream credentialsStream = new FileInputStream(new File(serviceAccountKeyFile)); + tester.perRpcCreds(jsonKey, credentialsStream, oauthScope); break; } @@ -722,8 +716,7 @@ protected ManagedChannelBuilder createChannelBuilder() { if (serverPort == 0) { nettyBuilder = NettyChannelBuilder.forTarget(serverHost, channelCredentials); } else { - nettyBuilder = - NettyChannelBuilder.forAddress(serverHost, serverPort, channelCredentials); + nettyBuilder = NettyChannelBuilder.forAddress(serverHost, serverPort, channelCredentials); } nettyBuilder.flowControlWindow(AbstractInteropTest.TEST_FLOW_CONTROL_WINDOW); if (serverHostOverride != null) { @@ -841,8 +834,8 @@ public void cacheableUnary() { } /** Sends a large unary rpc with service account credentials. */ - public void serviceAccountCreds( - String jsonKey, InputStream credentialsStream, String authScope) throws Exception { + public void serviceAccountCreds(String jsonKey, InputStream credentialsStream, String authScope) + throws Exception { // cast to ServiceAccountCredentials to double-check the right type of object was created. GoogleCredentials credentials = ServiceAccountCredentials.class.cast(GoogleCredentials.fromStream(credentialsStream)); diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java index 6f1b170d46a..daa6dfe42ed 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java @@ -28,25 +28,25 @@ import io.grpc.TlsServerCredentials; import io.grpc.alts.AltsServerCredentials; import io.grpc.netty.NettyServerBuilder; -import io.grpc.opentelemetry.GrpcOpenTelemetry; -import io.grpc.opentelemetry.InternalGrpcOpenTelemetry; import io.grpc.services.MetricRecorder; import io.grpc.testing.TlsTesting; import io.grpc.xds.orca.OrcaMetricReportingServerInterceptor; import io.grpc.xds.orca.OrcaServiceImpl; +import java.net.InetSocketAddress; +import io.grpc.opentelemetry.GrpcOpenTelemetry; +import io.grpc.opentelemetry.InternalGrpcOpenTelemetry; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder; -import java.net.InetSocketAddress; -import java.net.SocketAddress; import java.util.HashMap; +import java.util.Map; +import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; +import java.net.SocketAddress; import java.util.List; import java.util.Locale; -import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; -import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; /** Server that manages startup/shutdown of a single {@code TestService}. */ public class TestServiceServer { @@ -134,10 +134,6 @@ void parseArgs(String[] args) { mcsLimit = Integer.parseInt(value); // TODO: Make Netty server builder usable for IPV6 as well (not limited to MCS handling) addressType = Util.AddressType.IPV4; // To use NettyServerBuilder - } else if ("enable_opentelemetry".equals(key)) { - enableOpentelemetry = Boolean.parseBoolean(value); - } else if ("otel_collector_address".equals(key)) { - otelCollectorAddress = value; } else { System.err.println("Unknown argument: " + key); usage = true; @@ -172,111 +168,100 @@ void parseArgs(String[] args) { @VisibleForTesting @IgnoreJRERequirement // OpenTelemetry uses Java 8+ APIs void start() throws Exception { - try { - if (enableOpentelemetry) { - AutoConfiguredOpenTelemetrySdkBuilder sdkBuilder = - AutoConfiguredOpenTelemetrySdk.builder(); - Map properties = new HashMap<>(); - properties.put("otel.traces.exporter", "otlp"); - properties.put("otel.bsp.schedule.delay", "100"); - if (otelCollectorAddress != null && !otelCollectorAddress.isEmpty()) { - String endpoint = otelCollectorAddress; - if (!endpoint.startsWith("http://") && !endpoint.startsWith("https://")) { - endpoint = "http://" + endpoint; - } - properties.put("otel.exporter.otlp.endpoint", endpoint); + if (enableOpentelemetry) { + AutoConfiguredOpenTelemetrySdkBuilder sdkBuilder = + AutoConfiguredOpenTelemetrySdk.builder(); + Map properties = new HashMap<>(); + properties.put("otel.traces.exporter", "otlp"); + properties.put("otel.bsp.schedule.delay", "100"); + String endpoint = otelCollectorAddress; + endpoint = "http://" + endpoint; } - sdkBuilder.addPropertiesSupplier(() -> properties); - AutoConfiguredOpenTelemetrySdk autoSdk = sdkBuilder.build(); - this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk(); - GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder() - .sdk(openTelemetrySdk); - InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true); - GrpcOpenTelemetry grpcOpenTelemetry = grpcOpentelemetryBuilder.build(); - grpcOpenTelemetry.registerGlobal(); + properties.put("otel.exporter.otlp.endpoint", endpoint); } - executor = Executors.newSingleThreadScheduledExecutor(); - ServerCredentials serverCreds; - if (useAlts) { - if (localHandshakerPort > -1) { - serverCreds = AltsServerCredentials.newBuilder() - .enableUntrustedAltsForTesting() - .setHandshakerAddressForTesting("localhost:" + localHandshakerPort).build(); - } else { - serverCreds = AltsServerCredentials.create(); - } - } else if (useTls) { - serverCreds = TlsServerCredentials.create( - TlsTesting.loadCert("server1.pem"), TlsTesting.loadCert("server1.key")); + sdkBuilder.addPropertiesSupplier(() -> properties); + AutoConfiguredOpenTelemetrySdk autoSdk = sdkBuilder.build(); + this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk(); + GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder() + .sdk(openTelemetrySdk); + InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true); + GrpcOpenTelemetry grpcOpenTelemetry = grpcOpentelemetryBuilder.build(); + grpcOpenTelemetry.registerGlobal(); + } + executor = Executors.newSingleThreadScheduledExecutor(); + ServerCredentials serverCreds; + if (useAlts) { + if (localHandshakerPort > -1) { + serverCreds = AltsServerCredentials.newBuilder() + .enableUntrustedAltsForTesting() + .setHandshakerAddressForTesting("localhost:" + localHandshakerPort).build(); } else { - serverCreds = InsecureServerCredentials.create(); + serverCreds = AltsServerCredentials.create(); } - MetricRecorder metricRecorder = MetricRecorder.newInstance(); - BindableService orcaOobService = - OrcaServiceImpl.createService(executor, metricRecorder, 1, TimeUnit.SECONDS); + } else if (useTls) { + serverCreds = TlsServerCredentials.create( + TlsTesting.loadCert("server1.pem"), TlsTesting.loadCert("server1.key")); + } else { + serverCreds = InsecureServerCredentials.create(); + } + MetricRecorder metricRecorder = MetricRecorder.newInstance(); + BindableService orcaOobService = + OrcaServiceImpl.createService(executor, metricRecorder, 1, TimeUnit.SECONDS); - // Create ServerBuilder with appropriate addresses - // - IPV4_IPV6: bind to wildcard which covers all addresses on all interfaces of both families - // - IPV4: bind to v4 address for local hostname + v4 localhost - // - IPV6: bind to all v6 addresses for local hostname + v6 localhost - ServerBuilder serverBuilder; - switch (addressType) { - case IPV4_IPV6: - serverBuilder = Grpc.newServerBuilderForPort(port, serverCreds); - break; - case IPV4: - SocketAddress v4Address = Util.getV4Address(port); - InetSocketAddress localV4Address = new InetSocketAddress("127.0.0.1", port); - serverBuilder = - NettyServerBuilder.forAddress(localV4Address, serverCreds); - if (v4Address != null && !v4Address.equals(localV4Address)) { - ((NettyServerBuilder) serverBuilder).addListenAddress(v4Address); - } - if (mcsLimit != -1) { - ((NettyServerBuilder) serverBuilder).maxConcurrentCallsPerConnection(mcsLimit); - } - break; - case IPV6: - List v6Addresses = Util.getV6Addresses(port); - InetSocketAddress localV6Address = new InetSocketAddress("::1", port); - serverBuilder = - NettyServerBuilder.forAddress(localV6Address, serverCreds); - for (SocketAddress address : v6Addresses) { - if (!address.equals(localV6Address)) { - ((NettyServerBuilder) serverBuilder).addListenAddress(address); - } + // Create ServerBuilder with appropriate addresses + // - IPV4_IPV6: bind to wildcard which covers all addresses on all interfaces of both families + // - IPV4: bind to v4 address for local hostname + v4 localhost + // - IPV6: bind to all v6 addresses for local hostname + v6 localhost + ServerBuilder serverBuilder; + switch (addressType) { + case IPV4_IPV6: + serverBuilder = Grpc.newServerBuilderForPort(port, serverCreds); + break; + case IPV4: + SocketAddress v4Address = Util.getV4Address(port); + InetSocketAddress localV4Address = new InetSocketAddress("127.0.0.1", port); + serverBuilder = + NettyServerBuilder.forAddress(localV4Address, serverCreds); + if (v4Address != null && !v4Address.equals(localV4Address)) { + ((NettyServerBuilder) serverBuilder).addListenAddress(v4Address); + } + if (mcsLimit != -1) { + ((NettyServerBuilder) serverBuilder).maxConcurrentCallsPerConnection(mcsLimit); + } + break; + case IPV6: + List v6Addresses = Util.getV6Addresses(port); + InetSocketAddress localV6Address = new InetSocketAddress("::1", port); + serverBuilder = + NettyServerBuilder.forAddress(localV6Address, serverCreds); + for (SocketAddress address : v6Addresses) { + if (!address.equals(localV6Address)) { + ((NettyServerBuilder) serverBuilder).addListenAddress(address); } - break; - default: - throw new AssertionError("Unknown address type: " + addressType); - } - server = serverBuilder - .maxInboundMessageSize(AbstractInteropTest.MAX_MESSAGE_SIZE) - .addService( - ServerInterceptors.intercept( - new TestServiceImpl(executor, metricRecorder), TestServiceImpl.interceptors())) - .addService(orcaOobService) - .intercept(OrcaMetricReportingServerInterceptor.create(metricRecorder)) - .build() - .start(); - } catch (Throwable t) { - stop(); - throw t; + } + break; + default: + throw new AssertionError("Unknown address type: " + addressType); } + server = serverBuilder + .maxInboundMessageSize(AbstractInteropTest.MAX_MESSAGE_SIZE) + .addService( + ServerInterceptors.intercept( + new TestServiceImpl(executor, metricRecorder), TestServiceImpl.interceptors())) + .addService(orcaOobService) + .intercept(OrcaMetricReportingServerInterceptor.create(metricRecorder)) + .build() + .start(); } @VisibleForTesting void stop() throws Exception { try { - if (server != null) { - server.shutdownNow(); - if (!server.awaitTermination(5, TimeUnit.SECONDS)) { - System.err.println("Timed out waiting for server shutdown"); - } - } - if (executor != null) { - MoreExecutors.shutdownAndAwaitTermination(executor, 5, TimeUnit.SECONDS); + server.shutdownNow(); + if (!server.awaitTermination(5, TimeUnit.SECONDS)) { + System.err.println("Timed out waiting for server shutdown"); } + MoreExecutors.shutdownAndAwaitTermination(executor, 5, TimeUnit.SECONDS); } finally { if (openTelemetrySdk != null) { openTelemetrySdk.close(); From 2dc31439c93c9edcc69f5bb7c4bf82eb2f761924 Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Thu, 20 Aug 2026 08:30:28 +0000 Subject: [PATCH 15/18] fix(checkstyle): fix import order in TestServiceClient and TestServiceServer --- .../testing/integration/TestServiceClient.java | 10 ++++++---- .../testing/integration/TestServiceServer.java | 14 ++++++++------ 2 files changed, 14 insertions(+), 10 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 b8e1cce2c8a..77ecc6d2a65 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,8 @@ import io.grpc.netty.NettyChannelBuilder; import io.grpc.okhttp.InternalOkHttpChannelBuilder; import io.grpc.okhttp.OkHttpChannelBuilder; +import io.grpc.opentelemetry.GrpcOpenTelemetry; +import io.grpc.opentelemetry.InternalGrpcOpenTelemetry; import io.grpc.stub.ClientCalls; import io.grpc.stub.MetadataUtils; import io.grpc.stub.StreamObserver; @@ -68,24 +70,22 @@ import io.grpc.testing.integration.Messages.StreamingOutputCallRequest; import io.grpc.testing.integration.Messages.StreamingOutputCallResponse; import io.grpc.testing.integration.Messages.TestOrcaReport; -import io.grpc.opentelemetry.GrpcOpenTelemetry; -import io.grpc.opentelemetry.InternalGrpcOpenTelemetry; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder; -import java.util.HashMap; -import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.nio.charset.Charset; import java.util.Arrays; +import java.util.HashMap; import java.util.Map; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import java.util.concurrent.atomic.AtomicReference; import javax.annotation.Nullable; +import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; /** * Application that starts a client for the {@link TestServiceGrpc.TestServiceImplBase} and runs @@ -328,7 +328,9 @@ void setUp() { Map properties = new HashMap<>(); properties.put("otel.traces.exporter", "otlp"); properties.put("otel.bsp.schedule.delay", "100"); + if (otelCollectorAddress != null && !otelCollectorAddress.isEmpty()) { String endpoint = otelCollectorAddress; + if (!endpoint.startsWith("http://") && !endpoint.startsWith("https://")) { endpoint = "http://" + endpoint; } properties.put("otel.exporter.otlp.endpoint", endpoint); diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java index daa6dfe42ed..98bdddd9a11 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java @@ -28,25 +28,25 @@ import io.grpc.TlsServerCredentials; import io.grpc.alts.AltsServerCredentials; import io.grpc.netty.NettyServerBuilder; +import io.grpc.opentelemetry.GrpcOpenTelemetry; +import io.grpc.opentelemetry.InternalGrpcOpenTelemetry; import io.grpc.services.MetricRecorder; import io.grpc.testing.TlsTesting; import io.grpc.xds.orca.OrcaMetricReportingServerInterceptor; import io.grpc.xds.orca.OrcaServiceImpl; -import java.net.InetSocketAddress; -import io.grpc.opentelemetry.GrpcOpenTelemetry; -import io.grpc.opentelemetry.InternalGrpcOpenTelemetry; import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk; import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdkBuilder; -import java.util.HashMap; -import java.util.Map; -import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; +import java.net.InetSocketAddress; import java.net.SocketAddress; +import java.util.HashMap; import java.util.List; import java.util.Locale; +import java.util.Map; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement; /** Server that manages startup/shutdown of a single {@code TestService}. */ public class TestServiceServer { @@ -174,7 +174,9 @@ void start() throws Exception { Map properties = new HashMap<>(); properties.put("otel.traces.exporter", "otlp"); properties.put("otel.bsp.schedule.delay", "100"); + if (otelCollectorAddress != null && !otelCollectorAddress.isEmpty()) { String endpoint = otelCollectorAddress; + if (!endpoint.startsWith("http://") && !endpoint.startsWith("https://")) { endpoint = "http://" + endpoint; } properties.put("otel.exporter.otlp.endpoint", endpoint); From ae2ee2006edbf988de95ef53417c98d94a655a2f Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Thu, 20 Aug 2026 08:33:40 +0000 Subject: [PATCH 16/18] docs(interop): add comment explaining otel.bsp.schedule.delay configuration --- .../main/java/io/grpc/testing/integration/TestServiceClient.java | 1 + .../main/java/io/grpc/testing/integration/TestServiceServer.java | 1 + 2 files changed, 2 insertions(+) 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 77ecc6d2a65..aa165643fb9 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 @@ -327,6 +327,7 @@ void setUp() { AutoConfiguredOpenTelemetrySdk.builder(); Map properties = new HashMap<>(); properties.put("otel.traces.exporter", "otlp"); + // Reduce BatchSpanProcessor export delay from default 5000ms to 100ms for fast test runs. properties.put("otel.bsp.schedule.delay", "100"); if (otelCollectorAddress != null && !otelCollectorAddress.isEmpty()) { String endpoint = otelCollectorAddress; diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java index 98bdddd9a11..9a032b2207e 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java @@ -173,6 +173,7 @@ void start() throws Exception { AutoConfiguredOpenTelemetrySdk.builder(); Map properties = new HashMap<>(); properties.put("otel.traces.exporter", "otlp"); + // Reduce BatchSpanProcessor export delay from default 5000ms to 100ms for fast test runs. properties.put("otel.bsp.schedule.delay", "100"); if (otelCollectorAddress != null && !otelCollectorAddress.isEmpty()) { String endpoint = otelCollectorAddress; From 61b8f4bc1455765f5dbf98aed32e02d9d3ecce0c Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Thu, 20 Aug 2026 08:39:21 +0000 Subject: [PATCH 17/18] revert(test): revert OpenTelemetryContextPropagationTest to match upstream master --- .../OpenTelemetryContextPropagationTest.java | 25 +++---------------- 1 file changed, 3 insertions(+), 22 deletions(-) diff --git a/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java b/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java index 726453d4194..3884d977a6e 100644 --- a/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java +++ b/interop-testing/src/test/java/io/grpc/testing/integration/OpenTelemetryContextPropagationTest.java @@ -43,9 +43,7 @@ import io.opentelemetry.sdk.OpenTelemetrySdk; import io.opentelemetry.sdk.trace.SdkTracerProvider; import java.util.Arrays; -import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; -import org.junit.After; import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; @@ -85,18 +83,6 @@ public OpenTelemetryContextPropagationTest(TextMapPropagator textMapPropagator, this.censusClient = isCensusClient; } - @Override - @After - public void tearDown() { - try { - super.tearDown(); - } finally { - if (openTelemetrySdk != null) { - openTelemetrySdk.close(); - } - } - } - @Override protected ServerBuilder getServerBuilder() { NettyServerBuilder builder = NettyServerBuilder.forPort(0, InsecureServerCredentials.create()) @@ -146,12 +132,10 @@ public void onComplete() { return builder; } - private final AtomicBoolean applicationSpanClosed = new AtomicBoolean(false); - private void maybeCloseSpan(AtomicReference applicationSpan) { - Span span = applicationSpan.get(); - if (span != null && applicationSpanClosed.compareAndSet(false, true)) { - span.end(); + Span tmp = applicationSpan.get(); + if (tmp != null) { + tmp.end(); } } @@ -181,8 +165,6 @@ public void otelSpanContextPropagation() { Span parentSpan = tracer.spanBuilder("Test.interopTest").startSpan(); try (Scope scope = Context.current().with(parentSpan).makeCurrent()) { blockingStub.unaryCall(SimpleRequest.getDefaultInstance()); - } finally { - parentSpan.end(); } assertEquals(parentSpan.getSpanContext().getTraceId(), applicationSpan.get().getSpanContext().getTraceId()); @@ -204,7 +186,6 @@ public void censusToOtelGrpcTraceBinPropagator() { applicationSpan.get().getSpanContext().getTraceId()); } finally { context.detach(previous); - parentSpan.end(); } } } From 89a93ddd748eb881c4136ac2b433acea4122cd20 Mon Sep 17 00:00:00 2001 From: agrawalabhi Date: Thu, 20 Aug 2026 09:03:04 +0000 Subject: [PATCH 18/18] fix(interop): add enable_opentelemetry and otel_collector_address parsing to TestServiceServer --- .../java/io/grpc/testing/integration/TestServiceServer.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java index 9a032b2207e..aba27644dbd 100644 --- a/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java +++ b/interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java @@ -134,6 +134,10 @@ void parseArgs(String[] args) { mcsLimit = Integer.parseInt(value); // TODO: Make Netty server builder usable for IPV6 as well (not limited to MCS handling) addressType = Util.AddressType.IPV4; // To use NettyServerBuilder + } else if ("enable_opentelemetry".equals(key)) { + enableOpentelemetry = Boolean.parseBoolean(value); + } else if ("otel_collector_address".equals(key)) { + otelCollectorAddress = value; } else { System.err.println("Unknown argument: " + key); usage = true;