From 4aec9b8576c16b2f60c17e18a03c449a6c0130f6 Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Mon, 13 Oct 2025 17:33:24 +0200 Subject: [PATCH] make grpc indy-ready --- ...GrpcClientBuilderBuildInstrumentation.java | 8 +++---- .../grpc/v1_6/GrpcContextInstrumentation.java | 13 ++++------ .../grpc/v1_6/GrpcInstrumentationModule.java | 9 ++++++- .../GrpcServerBuilderInstrumentation.java | 24 +++++++++---------- .../grpc/v1_6/GrpcSingletons.java | 10 ++++++++ 5 files changed, 37 insertions(+), 27 deletions(-) diff --git a/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcClientBuilderBuildInstrumentation.java b/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcClientBuilderBuildInstrumentation.java index 6a2c8ae423d7..42bd46faf66f 100644 --- a/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcClientBuilderBuildInstrumentation.java +++ b/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcClientBuilderBuildInstrumentation.java @@ -7,13 +7,13 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.extendsClass; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; +import static io.opentelemetry.javaagent.instrumentation.grpc.v1_6.GrpcSingletons.MANAGED_CHANNEL_BUILDER_INSTRUMENTED; import static net.bytebuddy.matcher.ElementMatchers.declaresField; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; import io.grpc.ClientInterceptor; import io.grpc.ManagedChannelBuilder; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import java.util.List; @@ -47,11 +47,9 @@ public static class AddInterceptorAdvice { public static void addInterceptor( @Advice.This ManagedChannelBuilder builder, @Advice.FieldValue("interceptors") List interceptors) { - VirtualField, Boolean> instrumented = - VirtualField.find(ManagedChannelBuilder.class, Boolean.class); - if (!Boolean.TRUE.equals(instrumented.get(builder))) { + if (!Boolean.TRUE.equals(MANAGED_CHANNEL_BUILDER_INSTRUMENTED.get(builder))) { interceptors.add(0, GrpcSingletons.CLIENT_INTERCEPTOR); - instrumented.set(builder, true); + MANAGED_CHANNEL_BUILDER_INSTRUMENTED.set(builder, true); } } } diff --git a/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcContextInstrumentation.java b/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcContextInstrumentation.java index 78fbef21688e..99acd27e6f10 100644 --- a/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcContextInstrumentation.java +++ b/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcContextInstrumentation.java @@ -14,6 +14,7 @@ import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; +import net.bytebuddy.asm.Advice.AssignReturned; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -41,15 +42,11 @@ public static Context.Storage onEnter() { return GrpcSingletons.getStorage(); } + @AssignReturned.ToReturned @Advice.OnMethodExit - public static void onExit( - @Advice.Return(readOnly = false) Context.Storage storage, - @Advice.Enter Context.Storage ourStorage) { - if (ourStorage != null) { - storage = ourStorage; - } else { - storage = GrpcSingletons.setStorage(storage); - } + public static Context.Storage onExit( + @Advice.Return Context.Storage originalStorage, @Advice.Enter Context.Storage ourStorage) { + return ourStorage != null ? ourStorage : GrpcSingletons.setStorage(originalStorage); } } } diff --git a/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcInstrumentationModule.java b/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcInstrumentationModule.java index 2ce75e58e75b..4e4564694d2f 100644 --- a/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcInstrumentationModule.java +++ b/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcInstrumentationModule.java @@ -10,10 +10,12 @@ import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; import java.util.List; @AutoService(InstrumentationModule.class) -public class GrpcInstrumentationModule extends InstrumentationModule { +public class GrpcInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { public GrpcInstrumentationModule() { super("grpc", "grpc-1.6"); } @@ -25,4 +27,9 @@ public List typeInstrumentations() { new GrpcContextInstrumentation(), new GrpcServerBuilderInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } } diff --git a/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcServerBuilderInstrumentation.java b/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcServerBuilderInstrumentation.java index 335aff6c27a8..022f48885fd6 100644 --- a/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcServerBuilderInstrumentation.java +++ b/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcServerBuilderInstrumentation.java @@ -7,13 +7,13 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.extendsClass; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; +import static io.opentelemetry.javaagent.instrumentation.grpc.v1_6.GrpcSingletons.SERVER_BUILDER_INSTRUMENTED; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import io.grpc.ServerBuilder; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.bootstrap.CallDepth; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -44,22 +44,20 @@ public void transform(TypeTransformer transformer) { public static class BuildAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static void onEnter( - @Advice.This ServerBuilder serverBuilder, - @Advice.Local("otelCallDepth") CallDepth callDepth) { - callDepth = CallDepth.forClass(ServerBuilder.class); - if (callDepth.getAndIncrement() == 0) { - VirtualField, Boolean> instrumented = - VirtualField.find(ServerBuilder.class, Boolean.class); - if (!Boolean.TRUE.equals(instrumented.get(serverBuilder))) { - serverBuilder.intercept(GrpcSingletons.SERVER_INTERCEPTOR); - instrumented.set(serverBuilder, true); - } + public static CallDepth onEnter(@Advice.This ServerBuilder serverBuilder) { + CallDepth callDepth = CallDepth.forClass(ServerBuilder.class); + if (callDepth.getAndIncrement() > 0) { + return callDepth; } + if (!Boolean.TRUE.equals(SERVER_BUILDER_INSTRUMENTED.get(serverBuilder))) { + serverBuilder.intercept(GrpcSingletons.SERVER_INTERCEPTOR); + SERVER_BUILDER_INSTRUMENTED.set(serverBuilder, true); + } + return callDepth; } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void onExit(@Advice.Local("otelCallDepth") CallDepth callDepth) { + public static void onExit(@Advice.Enter CallDepth callDepth) { callDepth.decrementAndGet(); } } diff --git a/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcSingletons.java b/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcSingletons.java index 589e5fd96687..987e55d0116f 100644 --- a/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcSingletons.java +++ b/instrumentation/grpc-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_6/GrpcSingletons.java @@ -9,8 +9,11 @@ import io.grpc.ClientInterceptor; import io.grpc.Context; +import io.grpc.ManagedChannelBuilder; +import io.grpc.ServerBuilder; import io.grpc.ServerInterceptor; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.instrumentation.grpc.v1_6.GrpcTelemetry; import io.opentelemetry.instrumentation.grpc.v1_6.internal.ContextStorageBridge; import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; @@ -20,6 +23,13 @@ // Holds singleton references. public final class GrpcSingletons { + public static final VirtualField, Boolean> + MANAGED_CHANNEL_BUILDER_INSTRUMENTED = + VirtualField.find(ManagedChannelBuilder.class, Boolean.class); + + public static final VirtualField, Boolean> SERVER_BUILDER_INSTRUMENTED = + VirtualField.find(ServerBuilder.class, Boolean.class); + public static final ClientInterceptor CLIENT_INTERCEPTOR; public static final ServerInterceptor SERVER_INTERCEPTOR;