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 74f6f2e3fe3d..c2111cdb444a 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 @@ -17,9 +17,11 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; +import io.opentelemetry.javaagent.bootstrap.BootstrapPackagePrefixesHolder; import io.opentelemetry.javaagent.bootstrap.CallDepth; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import java.util.List; import net.bytebuddy.asm.Advice; import net.bytebuddy.asm.Advice.AssignReturned; import net.bytebuddy.description.method.MethodDescription; @@ -68,7 +70,13 @@ public void transform(TypeTransformer transformer) { public static class LoadClassAdvice { @Advice.OnMethodEnter(skipOn = Advice.OnNonDefaultValue.class) - public static Class onEnter(@Advice.Argument(0) String name) { + public static Class onEnter( + @Advice.This ClassLoader classLoader, @Advice.Argument(0) String name) { + // must be read before call depth is incremented as setting the call depth prevents the class + // loader of the instrumented class from loading BootstrapPackagePrefixesHolder itself + List bootstrapPackagePrefixes = + BootstrapPackagePrefixesHolder.getBootstrapPackagePrefixes(); + // need to use call depth here to prevent re-entry from call to Class.forName() below // because on some JVMs (e.g. IBM's, though IBM bootstrap loader is explicitly excluded above) // Class.forName() ends up calling loadClass() on the bootstrap loader which would then come @@ -80,7 +88,7 @@ public static Class onEnter(@Advice.Argument(0) String name) { } try { - for (String prefix : BootstrapPackagesHelper.bootstrapPackagesPrefixes) { + for (String prefix : bootstrapPackagePrefixes) { if (name.startsWith(prefix)) { try { return Class.forName(name, false, null); diff --git a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootstrapPackagesHelper.java b/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootstrapPackagesHelper.java deleted file mode 100644 index 4afe3a683f96..000000000000 --- a/instrumentation/internal/internal-class-loader/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/internal/classloader/BootstrapPackagesHelper.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.internal.classloader; - -import static java.util.logging.Level.WARNING; - -import io.opentelemetry.javaagent.bootstrap.BootstrapPackagePrefixesHolder; -import io.opentelemetry.javaagent.tooling.Constants; -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.util.List; -import java.util.logging.Logger; - -public class BootstrapPackagesHelper { - - public static final List bootstrapPackagesPrefixes = findBootstrapPackagePrefixes(); - - /** - * We have to make sure that {@link BootstrapPackagePrefixesHolder} is loaded from bootstrap class - * loader. After that we can use in {@link BootDelegationInstrumentation.LoadClassAdvice}. - */ - private static List findBootstrapPackagePrefixes() { - try { - Class holderClass = - Class.forName( - "io.opentelemetry.javaagent.bootstrap.BootstrapPackagePrefixesHolder", true, null); - MethodHandle methodHandle = - MethodHandles.publicLookup() - .findStatic( - holderClass, "getBoostrapPackagePrefixes", MethodType.methodType(List.class)); - //noinspection unchecked - return (List) methodHandle.invokeExact(); - } catch (Throwable e) { - Logger.getLogger(BootstrapPackagesHelper.class.getName()) - .log(WARNING, "Unable to load bootstrap package prefixes from the bootstrap CL", e); - return Constants.BOOTSTRAP_PACKAGE_PREFIXES; - } - } - - private BootstrapPackagesHelper() {} -} 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 0f4666ff5ea4..ffbda5b61949 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 @@ -12,7 +12,6 @@ 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.Arrays; import java.util.List; @AutoService(InstrumentationModule.class) @@ -28,13 +27,6 @@ public boolean defaultEnabled(ConfigProperties config) { return true; } - @Override - public List getAdditionalHelperClassNames() { - return Arrays.asList( - "io.opentelemetry.javaagent.instrumentation.internal.classloader.BootstrapPackagesHelper", - "io.opentelemetry.javaagent.tooling.Constants"); - } - @Override public List injectedClassNames() { return getAdditionalHelperClassNames(); diff --git a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/BootstrapPackagePrefixesHolder.java b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/BootstrapPackagePrefixesHolder.java index eceaa6576042..7ff29a54e062 100644 --- a/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/BootstrapPackagePrefixesHolder.java +++ b/javaagent-bootstrap/src/main/java/io/opentelemetry/javaagent/bootstrap/BootstrapPackagePrefixesHolder.java @@ -20,7 +20,7 @@ public final class BootstrapPackagePrefixesHolder { private static volatile List bootstrapPackagePrefixes; - public static List getBoostrapPackagePrefixes() { + public static List getBootstrapPackagePrefixes() { return bootstrapPackagePrefixes; } diff --git a/testing-common/integration-tests/src/test/java/instrumentation/AgentInstrumentationTest.java b/testing-common/integration-tests/src/test/java/instrumentation/AgentInstrumentationTest.java index fa0a44bc5dd5..c63b3b54a196 100644 --- a/testing-common/integration-tests/src/test/java/instrumentation/AgentInstrumentationTest.java +++ b/testing-common/integration-tests/src/test/java/instrumentation/AgentInstrumentationTest.java @@ -39,7 +39,7 @@ class AgentInstrumentationTest { private static final ClassLoader BOOTSTRAP_CLASSLOADER = null; private static final List BOOTSTRAP_PACKAGE_PREFIXES = - BootstrapPackagePrefixesHolder.getBoostrapPackagePrefixes(); + BootstrapPackagePrefixesHolder.getBootstrapPackagePrefixes(); @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create();