From e8362bebf297c1d2a7c2661e40dcc1a015bbe06d Mon Sep 17 00:00:00 2001 From: Cesar Munoz <56847527+LikeTheSalad@users.noreply.github.com> Date: Tue, 21 Oct 2025 11:33:15 +0200 Subject: [PATCH 1/3] Making module indy ready --- .../okhttp/v3_0/OkHttp3InstrumentationModule.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3InstrumentationModule.java b/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3InstrumentationModule.java index afc5d61aa215..f27f0d56ef13 100644 --- a/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3InstrumentationModule.java +++ b/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3InstrumentationModule.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 OkHttp3InstrumentationModule extends InstrumentationModule { +public class OkHttp3InstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { public OkHttp3InstrumentationModule() { super("okhttp", "okhttp-3.0"); @@ -23,4 +25,9 @@ public OkHttp3InstrumentationModule() { public List typeInstrumentations() { return asList(new OkHttp3Instrumentation(), new OkHttp3DispatcherInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } } From 924498ccdb78230e0e38aa2b9333d8bee73e7fed Mon Sep 17 00:00:00 2001 From: Cesar Munoz <56847527+LikeTheSalad@users.noreply.github.com> Date: Tue, 21 Oct 2025 11:34:24 +0200 Subject: [PATCH 2/3] Migrating OkHttp3Instrumentation --- .../okhttp/v3_0/OkHttp3Instrumentation.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Instrumentation.java b/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Instrumentation.java index 9971b1077c8e..9c785764f2d3 100644 --- a/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Instrumentation.java +++ b/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Instrumentation.java @@ -32,15 +32,15 @@ public void transform(TypeTransformer transformer) { public static class ConstructorAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static void trackCallDepth(@Advice.Local("otelCallDepth") CallDepth callDepth) { - callDepth = CallDepth.forClass(OkHttpClient.Builder.class); + public static CallDepth trackCallDepth() { + CallDepth callDepth = CallDepth.forClass(OkHttpClient.Builder.class); callDepth.getAndIncrement(); + return callDepth; } @Advice.OnMethodExit(suppress = Throwable.class) public static void addTracingInterceptor( - @Advice.This OkHttpClient.Builder builder, - @Advice.Local("otelCallDepth") CallDepth callDepth) { + @Advice.This OkHttpClient.Builder builder, @Advice.Enter CallDepth callDepth) { // No-args constructor is automatically called by constructors with args, but we only want to // run once from the constructor with args because that is where the dedupe needs to happen. if (callDepth.decrementAndGet() > 0) { From b057db760f35e35807da608ec0e2d2e054ecb001 Mon Sep 17 00:00:00 2001 From: Cesar Munoz <56847527+LikeTheSalad@users.noreply.github.com> Date: Tue, 21 Oct 2025 11:38:24 +0200 Subject: [PATCH 3/3] Migrating OkHttp3DispatcherInstrumentation --- .../okhttp/v3_0/OkHttp3DispatcherInstrumentation.java | 11 ++++------- .../okhttp/v3_0/OkHttp3Singletons.java | 4 ++++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3DispatcherInstrumentation.java b/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3DispatcherInstrumentation.java index 20a7e70195d2..77922c0cf468 100644 --- a/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3DispatcherInstrumentation.java +++ b/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3DispatcherInstrumentation.java @@ -6,12 +6,12 @@ package io.opentelemetry.javaagent.instrumentation.okhttp.v3_0; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface; +import static io.opentelemetry.javaagent.instrumentation.okhttp.v3_0.OkHttp3Singletons.PROPAGATED_CONTEXT; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.bootstrap.executors.ExecutorAdviceHelper; import io.opentelemetry.javaagent.bootstrap.executors.PropagatedContext; @@ -42,9 +42,7 @@ public static class AttachStateAdvice { public static PropagatedContext onEnter(@Advice.Argument(0) Runnable call) { Context context = Java8BytecodeBridge.currentContext(); if (ExecutorAdviceHelper.shouldPropagateContext(context, call)) { - VirtualField virtualField = - VirtualField.find(Runnable.class, PropagatedContext.class); - return ExecutorAdviceHelper.attachContextToTask(context, virtualField, call); + return ExecutorAdviceHelper.attachContextToTask(context, PROPAGATED_CONTEXT, call); } return null; } @@ -54,9 +52,8 @@ public static void onExit( @Advice.Argument(0) Runnable call, @Advice.Enter PropagatedContext propagatedContext, @Advice.Thrown Throwable throwable) { - VirtualField virtualField = - VirtualField.find(Runnable.class, PropagatedContext.class); - ExecutorAdviceHelper.cleanUpAfterSubmit(propagatedContext, throwable, virtualField, call); + ExecutorAdviceHelper.cleanUpAfterSubmit( + propagatedContext, throwable, PROPAGATED_CONTEXT, call); } } } diff --git a/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Singletons.java b/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Singletons.java index f7e982f7edab..ccec80dd89e4 100644 --- a/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Singletons.java +++ b/instrumentation/okhttp/okhttp-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Singletons.java @@ -10,9 +10,11 @@ import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; import io.opentelemetry.instrumentation.api.semconv.http.HttpClientRequestResendCount; +import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.instrumentation.okhttp.v3_0.internal.ConnectionErrorSpanInterceptor; import io.opentelemetry.instrumentation.okhttp.v3_0.internal.OkHttpClientInstrumenterBuilderFactory; import io.opentelemetry.instrumentation.okhttp.v3_0.internal.TracingInterceptor; +import io.opentelemetry.javaagent.bootstrap.executors.PropagatedContext; import io.opentelemetry.javaagent.bootstrap.internal.JavaagentHttpClientInstrumenters; import okhttp3.Interceptor; import okhttp3.Response; @@ -20,6 +22,8 @@ /** Holder of singleton interceptors for adding to instrumented clients. */ public final class OkHttp3Singletons { + public static final VirtualField PROPAGATED_CONTEXT = + VirtualField.find(Runnable.class, PropagatedContext.class); private static final Instrumenter INSTRUMENTER = JavaagentHttpClientInstrumenters.create( OkHttpClientInstrumenterBuilderFactory.create(GlobalOpenTelemetry.get()));