Skip to content

Commit cf6b688

Browse files
committed
interop: enable OpenTelemetry tracing support in Java interop client and server
1 parent bc01994 commit cf6b688

4 files changed

Lines changed: 64 additions & 8 deletions

File tree

gradle/libs.versions.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,7 @@ opencensus-impl = { module = "io.opencensus:opencensus-impl", version.ref = "ope
122122
opentelemetry-api = "io.opentelemetry:opentelemetry-api:1.63.0"
123123
opentelemetry-exporter-prometheus = "io.opentelemetry:opentelemetry-exporter-prometheus:1.63.0-alpha"
124124
opentelemetry-gcp-resources = "io.opentelemetry.contrib:opentelemetry-gcp-resources:1.57.0-alpha"
125+
opentelemetry-exporter-otlp = "io.opentelemetry:opentelemetry-exporter-otlp:1.63.0"
125126
opentelemetry-sdk-extension-autoconfigure = "io.opentelemetry:opentelemetry-sdk-extension-autoconfigure:1.63.0"
126127
opentelemetry-sdk-testing = "io.opentelemetry:opentelemetry-sdk-testing:1.63.0"
127128
perfmark-api = "io.perfmark:perfmark-api:0.27.0"

interop-testing/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ dependencies {
2626
libraries.opencensus.contrib.grpc.metrics,
2727
libraries.google.auth.oauth2Http,
2828
libraries.opentelemetry.sdk.extension.autoconfigure,
29+
libraries.opentelemetry.exporter.otlp,
2930
libraries.guava.jre // Fix checkUpperBoundDeps using -android
3031
api project(':grpc-api'),
3132
project(':grpc-stub'),

interop-testing/src/main/java/io/grpc/testing/integration/TestServiceClient.java

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@
5454
import io.grpc.internal.JsonParser;
5555
import io.grpc.netty.InsecureFromHttp1ChannelCredentials;
5656
import io.grpc.netty.InternalNettyChannelBuilder;
57+
import io.grpc.opentelemetry.GrpcOpenTelemetry;
58+
import io.grpc.opentelemetry.GrpcTraceBinContextPropagator;
59+
import io.grpc.opentelemetry.InternalGrpcOpenTelemetry;
60+
import io.opentelemetry.context.propagation.TextMapPropagator;
61+
import io.opentelemetry.sdk.OpenTelemetrySdk;
62+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
5763
import io.grpc.netty.NettyChannelBuilder;
5864
import io.grpc.okhttp.InternalOkHttpChannelBuilder;
5965
import io.grpc.okhttp.OkHttpChannelBuilder;
@@ -118,6 +124,8 @@ public static void main(String[] args) throws Exception {
118124
private boolean useTls = true;
119125
private boolean useAlts = false;
120126
private boolean useH2cUpgrade = false;
127+
private boolean enableOpentelemetry = false;
128+
private OpenTelemetrySdk openTelemetrySdk;
121129
private String customCredentialsType;
122130
private boolean useTestCa;
123131
private boolean useOkHttp;
@@ -219,6 +227,8 @@ void parseArgs(String[] args) throws Exception {
219227
numThreads = Integer.parseInt(value);
220228
} else if ("additional_metadata".equals(key)) {
221229
additionalMetadata = value;
230+
} else if ("enable_opentelemetry".equals(key)) {
231+
enableOpentelemetry = Boolean.parseBoolean(value);
222232
} else {
223233
System.err.println("Unknown argument: " + key);
224234
usage = true;
@@ -307,20 +317,34 @@ void parseArgs(String[] args) throws Exception {
307317

308318
@VisibleForTesting
309319
void setUp() {
320+
if (enableOpentelemetry) {
321+
AutoConfiguredOpenTelemetrySdk autoSdk = AutoConfiguredOpenTelemetrySdk.builder()
322+
.addPropagatorCustomizer(
323+
(previous, config) ->
324+
TextMapPropagator.composite(
325+
previous, GrpcTraceBinContextPropagator.defaultInstance()))
326+
.build();
327+
this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk();
328+
GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder()
329+
.sdk(openTelemetrySdk);
330+
InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true);
331+
GrpcOpenTelemetry grpcOpenTelemetry = grpcOpentelemetryBuilder.build();
332+
grpcOpenTelemetry.registerGlobal();
333+
}
310334
tester.setUp();
311335
}
312336

313337
private synchronized void tearDown() {
314338
try {
315339
tester.tearDown();
340+
} finally {
316341
if (customBackendMetricsLoadBalancerProvider != null) {
317342
LoadBalancerRegistry.getDefaultRegistry()
318343
.deregister(customBackendMetricsLoadBalancerProvider);
319344
}
320-
} catch (RuntimeException ex) {
321-
throw ex;
322-
} catch (Exception ex) {
323-
throw new RuntimeException(ex);
345+
if (openTelemetrySdk != null) {
346+
openTelemetrySdk.close();
347+
}
324348
}
325349
}
326350

interop-testing/src/main/java/io/grpc/testing/integration/TestServiceServer.java

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,16 @@
2828
import io.grpc.TlsServerCredentials;
2929
import io.grpc.alts.AltsServerCredentials;
3030
import io.grpc.netty.NettyServerBuilder;
31+
import io.grpc.opentelemetry.GrpcOpenTelemetry;
32+
import io.grpc.opentelemetry.GrpcTraceBinContextPropagator;
33+
import io.grpc.opentelemetry.InternalGrpcOpenTelemetry;
3134
import io.grpc.services.MetricRecorder;
3235
import io.grpc.testing.TlsTesting;
3336
import io.grpc.xds.orca.OrcaMetricReportingServerInterceptor;
3437
import io.grpc.xds.orca.OrcaServiceImpl;
38+
import io.opentelemetry.context.propagation.TextMapPropagator;
39+
import io.opentelemetry.sdk.OpenTelemetrySdk;
40+
import io.opentelemetry.sdk.autoconfigure.AutoConfiguredOpenTelemetrySdk;
3541
import java.net.InetSocketAddress;
3642
import java.net.SocketAddress;
3743
import java.util.List;
@@ -76,6 +82,8 @@ public void run() {
7682
private boolean useTls = true;
7783
private boolean useAlts = false;
7884
private int mcsLimit = -1;
85+
private boolean enableOpentelemetry = false;
86+
private OpenTelemetrySdk openTelemetrySdk;
7987

8088
private ScheduledExecutorService executor;
8189
private Server server;
@@ -123,6 +131,8 @@ void parseArgs(String[] args) {
123131
mcsLimit = Integer.parseInt(value);
124132
// TODO: Make Netty server builder usable for IPV6 as well (not limited to MCS handling)
125133
addressType = Util.AddressType.IPV4; // To use NettyServerBuilder
134+
} else if ("enable_opentelemetry".equals(key)) {
135+
enableOpentelemetry = Boolean.parseBoolean(value);
126136
} else {
127137
System.err.println("Unknown argument: " + key);
128138
usage = true;
@@ -156,6 +166,20 @@ void parseArgs(String[] args) {
156166
@SuppressWarnings("AddressSelection")
157167
@VisibleForTesting
158168
void start() throws Exception {
169+
if (enableOpentelemetry) {
170+
AutoConfiguredOpenTelemetrySdk autoSdk = AutoConfiguredOpenTelemetrySdk.builder()
171+
.addPropagatorCustomizer(
172+
(previous, config) ->
173+
TextMapPropagator.composite(
174+
previous, GrpcTraceBinContextPropagator.defaultInstance()))
175+
.build();
176+
this.openTelemetrySdk = autoSdk.getOpenTelemetrySdk();
177+
GrpcOpenTelemetry.Builder grpcOpentelemetryBuilder = GrpcOpenTelemetry.newBuilder()
178+
.sdk(openTelemetrySdk);
179+
InternalGrpcOpenTelemetry.enableTracing(grpcOpentelemetryBuilder, true);
180+
GrpcOpenTelemetry grpcOpenTelemetry = grpcOpentelemetryBuilder.build();
181+
grpcOpenTelemetry.registerGlobal();
182+
}
159183
executor = Executors.newSingleThreadScheduledExecutor();
160184
ServerCredentials serverCreds;
161185
if (useAlts) {
@@ -224,11 +248,17 @@ void start() throws Exception {
224248

225249
@VisibleForTesting
226250
void stop() throws Exception {
227-
server.shutdownNow();
228-
if (!server.awaitTermination(5, TimeUnit.SECONDS)) {
229-
System.err.println("Timed out waiting for server shutdown");
251+
try {
252+
server.shutdownNow();
253+
if (!server.awaitTermination(5, TimeUnit.SECONDS)) {
254+
System.err.println("Timed out waiting for server shutdown");
255+
}
256+
MoreExecutors.shutdownAndAwaitTermination(executor, 5, TimeUnit.SECONDS);
257+
} finally {
258+
if (openTelemetrySdk != null) {
259+
openTelemetrySdk.close();
260+
}
230261
}
231-
MoreExecutors.shutdownAndAwaitTermination(executor, 5, TimeUnit.SECONDS);
232262
}
233263

234264
@VisibleForTesting

0 commit comments

Comments
 (0)