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..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 @@ -48,4 +48,11 @@ public List typeInstrumentations() { new ResourceInjectionInstrumentation(), new DefineClassInstrumentation()); } + + @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; + } } 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..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 @@ -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; @@ -59,20 +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 void onExit( - @Advice.Return(readOnly = false) Class result, @Advice.Enter Class loadedClass) { - if (loadedClass != null) { - result = loadedClass; - } + public static Class onExit( + @Advice.Return Class originalResult, @Advice.Enter Class loadedClass) { + 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 e4a8bda14df1..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 @@ -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,11 @@ 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) { - if (inClassLoaderMatcher) { - result = false; - } + public static boolean onExit( + @Advice.Return boolean originalResult, @Advice.Enter boolean inClassLoaderMatcher) { + return inClassLoaderMatcher ? false : originalResult; } } } 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; + } } 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); } } } 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"; } } }