From c775072f67cf8810c40152f5fd50546cab900469 Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Fri, 12 Sep 2025 15:17:30 +0200 Subject: [PATCH 1/8] internal-class-loader --- .../classloader/BootDelegationInstrumentation.java | 9 ++++++--- .../classloader/ClassLoaderInstrumentationModule.java | 5 +++++ .../classloader/LoadInjectedClassInstrumentation.java | 9 ++++++--- 3 files changed, 17 insertions(+), 6 deletions(-) diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootDelegationInstrumentation.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootDelegationInstrumentation.java index e40cea1c41f3..74f6f2e3fe3d 100644 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootDelegationInstrumentation.java +++ b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootDelegationInstrumentation.java @@ -21,6 +21,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.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -99,13 +100,15 @@ public static Class onEnter(@Advice.Argument(0) String name) { return null; } + @AssignReturned.ToReturned @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void onExit( - @Advice.Return(readOnly = false) Class result, - @Advice.Enter Class resultFromBootstrapLoader) { + public static Class onExit( + @Advice.Return Class originalResult, @Advice.Enter Class resultFromBootstrapLoader) { + Class result = originalResult; if (resultFromBootstrapLoader != null) { result = resultFromBootstrapLoader; } + return result; } } } diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java index 441fdc0b8002..93341bbb19e0 100644 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java +++ b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java @@ -48,4 +48,9 @@ public List typeInstrumentations() { new ResourceInjectionInstrumentation(), new DefineClassInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } } diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java index 81aea69de8b7..61e6e76ab2db 100644 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java +++ b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java @@ -20,6 +20,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.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @@ -63,16 +64,18 @@ public static Class onEnter( if (helperClass != null) { return helperClass; } - return null; } + @AssignReturned.ToReturned @Advice.OnMethodExit(onThrowable = Throwable.class) - public static void onExit( - @Advice.Return(readOnly = false) Class result, @Advice.Enter Class loadedClass) { + public static Class onExit( + @Advice.Return Class originalResult, @Advice.Enter Class loadedClass) { + Class result = originalResult; if (loadedClass != null) { result = loadedClass; } + return result; } } } From 72edf42fd1628875ac22a1a053d48a92cdb32b42 Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Fri, 12 Sep 2025 15:28:05 +0200 Subject: [PATCH 2/8] internal-eclipse-osgi-3.6 --- .../internal/osgi/EclipseOsgiInstrumentation.java | 9 ++++++--- .../internal/osgi/EclipseOsgiInstrumentationModule.java | 9 ++++++++- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentation.java b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentation.java index e4a8bda14df1..6998a6467c1a 100644 --- a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentation.java +++ b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentation.java @@ -13,6 +13,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; @@ -52,13 +53,15 @@ public static boolean onEnter(@Advice.Argument(0) String packageName) { return InClassLoaderMatcher.get() && !packageName.startsWith("io.opentelemetry."); } + @AssignReturned.ToReturned @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void onExit( - @Advice.Return(readOnly = false) boolean result, - @Advice.Enter boolean inClassLoaderMatcher) { + public static boolean onExit( + @Advice.Return boolean originalResult, @Advice.Enter boolean inClassLoaderMatcher) { + boolean result = originalResult; if (inClassLoaderMatcher) { result = false; } + return result; } } } diff --git a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentationModule.java b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentationModule.java index 63906fc886eb..8def552c2518 100644 --- a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentationModule.java +++ b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentationModule.java @@ -10,11 +10,13 @@ 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 io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.util.List; @AutoService(InstrumentationModule.class) -public class EclipseOsgiInstrumentationModule extends InstrumentationModule { +public class EclipseOsgiInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { public EclipseOsgiInstrumentationModule() { super("internal-eclipse-osgi", "internal-eclipse-osgi-3.6"); } @@ -29,4 +31,9 @@ public boolean defaultEnabled(ConfigProperties config) { public List typeInstrumentations() { return singletonList(new EclipseOsgiInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } } From a8cd4f7ad45ea1fda5dad358e37c2c571131487e Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Fri, 12 Sep 2025 15:40:57 +0200 Subject: [PATCH 3/8] internal-reflection --- .../java/instrumentation/TestHelperClass.java | 6 ++++++ .../TestInstrumentationModule.java | 5 +++++ .../instrumentation/TestTypeInstrumentation.java | 16 ++++++++-------- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java index fa310587f74f..baab1839bb89 100644 --- a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java +++ b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java @@ -5,11 +5,17 @@ package instrumentation; +import io.opentelemetry.instrumentation.api.util.VirtualField; + /** * Class that will be injected in target classloader with inline instrumentation and proxied with * indy instrumentation */ public class TestHelperClass { + // virtual field needs to be in an helper class for indy instrumentation + public static final VirtualField VIRTUAL_FIELD = + VirtualField.find(Runnable.class, String.class); + public TestHelperClass() {} } diff --git a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java index 67a74f26e7ad..04061086aed2 100644 --- a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java +++ b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java @@ -40,4 +40,9 @@ public void injectClasses(ClassInjector injector) { .proxyBuilder("instrumentation.TestHelperClass") .inject(InjectionMode.CLASS_AND_RESOURCE); } + + @Override + public boolean isIndyReady() { + return true; + } } diff --git a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java index e8c05c8c1b1d..64a53b7bc788 100644 --- a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java +++ b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java @@ -7,10 +7,10 @@ import static net.bytebuddy.matcher.ElementMatchers.named; -import io.opentelemetry.instrumentation.api.util.VirtualField; 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; @@ -32,21 +32,21 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class TestAdvice { + @AssignReturned.ToReturned @Advice.OnMethodExit - public static void methodExit( - @Advice.This Runnable test, @Advice.Return(readOnly = false) String result) { - VirtualField.find(Runnable.class, String.class).set(test, "instrumented"); - result = "instrumented"; + public static String methodExit(@Advice.This Runnable test) { + TestHelperClass.VIRTUAL_FIELD.set(test, "instrumented"); + return "instrumented"; } } @SuppressWarnings("unused") public static class Test2Advice { + @AssignReturned.ToReturned @Advice.OnMethodExit - public static void methodExit( - @Advice.This Runnable test, @Advice.Return(readOnly = false) String result) { - result = VirtualField.find(Runnable.class, String.class).get(test); + public static String methodExit(@Advice.This Runnable test) { + return TestHelperClass.VIRTUAL_FIELD.get(test); } } } From 6ac9fb4eb54d2d104b9a37b17493f0cf495fdb72 Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Fri, 12 Sep 2025 15:42:16 +0200 Subject: [PATCH 4/8] internal-url-class-loader --- .../java/instrumentation/TestInstrumentationModule.java | 9 ++++++++- .../java/instrumentation/TestTypeInstrumentation.java | 6 ++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java b/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java index d9e406633db8..27e405e5766a 100644 --- a/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java +++ b/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.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 TestInstrumentationModule extends InstrumentationModule { +public class TestInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { public TestInstrumentationModule() { super("test-instrumentation"); } @@ -22,4 +24,9 @@ public TestInstrumentationModule() { public List typeInstrumentations() { return singletonList(new TestTypeInstrumentation()); } + + @Override + public boolean isIndyReady() { + return true; + } } diff --git a/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java b/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java index fe84d88b82f1..8ba3db630e35 100644 --- a/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java +++ b/instrumentation/internal/internal-url-class-loader/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java @@ -11,6 +11,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; @@ -34,9 +35,10 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class GetHostNameAdvice { + @AssignReturned.ToReturned @Advice.OnMethodExit - public static void methodExit(@Advice.Return(readOnly = false) String hostName) { - hostName = "not-the-host-name"; + public static String methodExit() { + return "not-the-host-name"; } } } From fd0069ca6cec657ca2c863fb832a22d8303ebbea Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Fri, 12 Sep 2025 16:17:30 +0200 Subject: [PATCH 5/8] revert changes for integration tests --- .../java/instrumentation/TestHelperClass.java | 6 ------ .../TestInstrumentationModule.java | 5 ----- .../instrumentation/TestTypeInstrumentation.java | 16 ++++++++-------- 3 files changed, 8 insertions(+), 19 deletions(-) diff --git a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java index baab1839bb89..fa310587f74f 100644 --- a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java +++ b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestHelperClass.java @@ -5,17 +5,11 @@ package instrumentation; -import io.opentelemetry.instrumentation.api.util.VirtualField; - /** * Class that will be injected in target classloader with inline instrumentation and proxied with * indy instrumentation */ public class TestHelperClass { - // virtual field needs to be in an helper class for indy instrumentation - public static final VirtualField VIRTUAL_FIELD = - VirtualField.find(Runnable.class, String.class); - public TestHelperClass() {} } diff --git a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java index 04061086aed2..67a74f26e7ad 100644 --- a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java +++ b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestInstrumentationModule.java @@ -40,9 +40,4 @@ public void injectClasses(ClassInjector injector) { .proxyBuilder("instrumentation.TestHelperClass") .inject(InjectionMode.CLASS_AND_RESOURCE); } - - @Override - public boolean isIndyReady() { - return true; - } } diff --git a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java index 64a53b7bc788..e8c05c8c1b1d 100644 --- a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java +++ b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java @@ -7,10 +7,10 @@ import static net.bytebuddy.matcher.ElementMatchers.named; +import io.opentelemetry.instrumentation.api.util.VirtualField; 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; @@ -32,21 +32,21 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class TestAdvice { - @AssignReturned.ToReturned @Advice.OnMethodExit - public static String methodExit(@Advice.This Runnable test) { - TestHelperClass.VIRTUAL_FIELD.set(test, "instrumented"); - return "instrumented"; + public static void methodExit( + @Advice.This Runnable test, @Advice.Return(readOnly = false) String result) { + VirtualField.find(Runnable.class, String.class).set(test, "instrumented"); + result = "instrumented"; } } @SuppressWarnings("unused") public static class Test2Advice { - @AssignReturned.ToReturned @Advice.OnMethodExit - public static String methodExit(@Advice.This Runnable test) { - return TestHelperClass.VIRTUAL_FIELD.get(test); + public static void methodExit( + @Advice.This Runnable test, @Advice.Return(readOnly = false) String result) { + result = VirtualField.find(Runnable.class, String.class).get(test); } } } From 7b443bd4454ba728b7d83ef6251019768ec65ca7 Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Fri, 12 Sep 2025 16:40:12 +0200 Subject: [PATCH 6/8] keep changes to the advice migration --- .../instrumentation/TestTypeInstrumentation.java | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java index e8c05c8c1b1d..a364632def87 100644 --- a/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java +++ b/instrumentation/internal/internal-reflection/javaagent-integration-tests/src/main/java/instrumentation/TestTypeInstrumentation.java @@ -11,6 +11,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; @@ -32,21 +33,21 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class TestAdvice { + @AssignReturned.ToReturned @Advice.OnMethodExit - public static void methodExit( - @Advice.This Runnable test, @Advice.Return(readOnly = false) String result) { + public static String methodExit(@Advice.This Runnable test) { VirtualField.find(Runnable.class, String.class).set(test, "instrumented"); - result = "instrumented"; + return "instrumented"; } } @SuppressWarnings("unused") public static class Test2Advice { + @AssignReturned.ToReturned @Advice.OnMethodExit - public static void methodExit( - @Advice.This Runnable test, @Advice.Return(readOnly = false) String result) { - result = VirtualField.find(Runnable.class, String.class).get(test); + public static String methodExit(@Advice.This Runnable test) { + return VirtualField.find(Runnable.class, String.class).get(test); } } } From 8835bc321d4924cba34ac11d06ad9cb1795e0b50 Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Mon, 22 Sep 2025 14:25:01 +0200 Subject: [PATCH 7/8] add comment forced inline instrumentation --- .../internal/classloader/ClassLoaderInstrumentationModule.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java index 93341bbb19e0..0f4666ff5ea4 100644 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java +++ b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/ClassLoaderInstrumentationModule.java @@ -51,6 +51,8 @@ public List typeInstrumentations() { @Override public boolean isIndyReady() { + // This module uses inlined advices to prevent recursion issues with invokedynamic, which is + // forced by using 'applyInlineAdvice' in 'transform' method of instrumentations. return true; } } From 182cb530a45aea5193acddf7df1b40231f478a5c Mon Sep 17 00:00:00 2001 From: Sylvain Juge <763082+SylvainJuge@users.noreply.github.com> Date: Wed, 24 Sep 2025 09:36:39 +0200 Subject: [PATCH 8/8] post-review changes --- .../LoadInjectedClassInstrumentation.java | 12 ++---------- .../internal/osgi/EclipseOsgiInstrumentation.java | 6 +----- 2 files changed, 3 insertions(+), 15 deletions(-) diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java index 61e6e76ab2db..a7049805c491 100644 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java +++ b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/LoadInjectedClassInstrumentation.java @@ -60,22 +60,14 @@ public static class LoadClassAdvice { @Advice.OnMethodEnter(skipOn = Advice.OnNonDefaultValue.class) public static Class onEnter( @Advice.This ClassLoader classLoader, @Advice.Argument(0) String name) { - Class helperClass = InjectedClassHelper.loadHelperClass(classLoader, name); - if (helperClass != null) { - return helperClass; - } - return null; + return InjectedClassHelper.loadHelperClass(classLoader, name); } @AssignReturned.ToReturned @Advice.OnMethodExit(onThrowable = Throwable.class) public static Class onExit( @Advice.Return Class originalResult, @Advice.Enter Class loadedClass) { - Class result = originalResult; - if (loadedClass != null) { - result = loadedClass; - } - return result; + return loadedClass != null ? loadedClass : originalResult; } } } diff --git a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentation.java b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentation.java index 6998a6467c1a..e3b9010e6ab0 100644 --- a/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentation.java +++ b/instrumentation/internal/internal-eclipse-osgi-3.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/osgi/EclipseOsgiInstrumentation.java @@ -57,11 +57,7 @@ public static boolean onEnter(@Advice.Argument(0) String packageName) { @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static boolean onExit( @Advice.Return boolean originalResult, @Advice.Enter boolean inClassLoaderMatcher) { - boolean result = originalResult; - if (inClassLoaderMatcher) { - result = false; - } - return result; + return inClassLoaderMatcher ? false : originalResult; } } }