diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseInstrumentationModule.java b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseInstrumentationModule.java index e8f88cb46791..8c2889870cea 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseInstrumentationModule.java +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseInstrumentationModule.java @@ -6,14 +6,18 @@ package io.opentelemetry.javaagent.instrumentation.couchbase.v2_0; import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; 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 CouchbaseInstrumentationModule extends InstrumentationModule { +public class CouchbaseInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { + public CouchbaseInstrumentationModule() { super("couchbase", "couchbase-2.0"); } @@ -24,13 +28,12 @@ public boolean isHelperClass(String className) { } @Override - public boolean isIndyModule() { - // rx.__OpenTelemetryTracingUtil is used for accessing a package private field - return false; + public List typeInstrumentations() { + return asList(new CouchbaseBucketInstrumentation(), new CouchbaseClusterInstrumentation()); } @Override - public List typeInstrumentations() { - return asList(new CouchbaseBucketInstrumentation(), new CouchbaseClusterInstrumentation()); + public List injectedClassNames() { + return singletonList("rx.__OpenTelemetryTracingUtil"); } } diff --git a/instrumentation/hystrix-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hystrix/HystrixInstrumentationModule.java b/instrumentation/hystrix-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hystrix/HystrixInstrumentationModule.java index 52bd6175c0ee..c58f5c48d8aa 100644 --- a/instrumentation/hystrix-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hystrix/HystrixInstrumentationModule.java +++ b/instrumentation/hystrix-1.4/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/hystrix/HystrixInstrumentationModule.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 HystrixInstrumentationModule extends InstrumentationModule { +public class HystrixInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { public HystrixInstrumentationModule() { super("hystrix", "hystrix-1.4"); @@ -25,13 +27,12 @@ public boolean isHelperClass(String className) { } @Override - public boolean isIndyModule() { - // rx.__OpenTelemetryTracingUtil is used for accessing a package private field - return false; + public List typeInstrumentations() { + return singletonList(new HystrixCommandInstrumentation()); } @Override - public List typeInstrumentations() { - return singletonList(new HystrixCommandInstrumentation()); + public List injectedClassNames() { + return singletonList("rx.__OpenTelemetryTracingUtil"); } } diff --git a/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/KtorInstrumentationModule.java b/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/KtorInstrumentationModule.java index e146eab0381b..e13de2782242 100644 --- a/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/KtorInstrumentationModule.java +++ b/instrumentation/ktor/ktor-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/ktor/v2_0/KtorInstrumentationModule.java @@ -24,14 +24,6 @@ public boolean isHelperClass(String className) { return className.startsWith("io.opentelemetry.extension.kotlin."); } - @Override - public boolean isIndyModule() { - // java.lang.LinkageError: loader constraint violation in interface itable initialization for - // class - // io.opentelemetry.javaagent.shaded.instrumentation.ktor.v2_0.client.KtorClientTracing$Companion: when selecting method 'java.lang.Object io.ktor.client.plugins.HttpClientPlugin.prepare(kotlin.jvm.functions.Function1)' the class loader 'app' for super interface io.ktor.client.plugins.HttpClientPlugin, and the class loader io.opentelemetry.javaagent.tooling.instrumentation.indy.InstrumentationModuleClassLoader @2565a7d0 of the selected method's class, io.opentelemetry.javaagent.shaded.instrumentation.ktor.v2_0.client.KtorClientTracing$Companion have different Class objects for the type kotlin.jvm.functions.Function1 used in the signature (io.ktor.client.plugins.HttpClientPlugin is in unnamed module of loader 'app'; io.opentelemetry.javaagent.shaded.instrumentation.ktor.v2_0.client.KtorClientTracing$Companion is in unnamed module of loader io.opentelemetry.javaagent.tooling.instrumentation.indy.InstrumentationModuleClassLoader @2565a7d0, parent loader io.opentelemetry.javaagent.bootstrap.AgentClassLoader @ea30797) - return false; - } - @Override public List typeInstrumentations() { return asList(new ServerInstrumentation(), new HttpClientInstrumentation()); 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 d36b25f84009..afc5d61aa215 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 @@ -19,13 +19,6 @@ public OkHttp3InstrumentationModule() { super("okhttp", "okhttp-3.0"); } - @Override - public boolean isIndyModule() { - // java.lang.LinkageError: bad method type alias: (Builder,Map)void not visible from class - // io.opentelemetry.javaagent.instrumentation.okhttp.v3_0.OkHttp3Instrumentation$ConstructorAdvice - return false; - } - @Override public List typeInstrumentations() { return asList(new OkHttp3Instrumentation(), new OkHttp3DispatcherInstrumentation()); diff --git a/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientInstrumentationModule.java b/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientInstrumentationModule.java index cce1d2e0d61d..448cff225ac4 100644 --- a/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientInstrumentationModule.java +++ b/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientInstrumentationModule.java @@ -6,14 +6,17 @@ package io.opentelemetry.javaagent.instrumentation.vertx.v4_0.sql; import static java.util.Arrays.asList; +import static java.util.Collections.singletonList; 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 VertxSqlClientInstrumentationModule extends InstrumentationModule { +public class VertxSqlClientInstrumentationModule extends InstrumentationModule + implements ExperimentalInstrumentationModule { public VertxSqlClientInstrumentationModule() { super("vertx-sql-client", "vertx-sql-client-4.0", "vertx"); @@ -25,9 +28,8 @@ public boolean isHelperClass(String className) { } @Override - public boolean isIndyModule() { - // QueryExecutorUtil accesses package private class io.vertx.sqlclient.impl.QueryExecutor - return false; + public List injectedClassNames() { + return singletonList("io.vertx.sqlclient.impl.QueryExecutorUtil"); } @Override diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/internal/ExperimentalInstrumentationModule.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/internal/ExperimentalInstrumentationModule.java index bfd0a620166e..b4e90e5ab91f 100644 --- a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/internal/ExperimentalInstrumentationModule.java +++ b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/internal/ExperimentalInstrumentationModule.java @@ -5,8 +5,11 @@ package io.opentelemetry.javaagent.extension.instrumentation.internal; +import static java.util.Collections.emptyList; + import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.internal.injection.ClassInjector; +import java.util.List; /** * This class is internal and is hence not for public use. Its APIs are unstable and can change at @@ -25,4 +28,12 @@ public interface ExperimentalInstrumentationModule { * @param injector the builder for injecting classes */ default void injectClasses(ClassInjector injector) {} + + /** + * Returns a list of helper classes that will be defined in the class loader of the instrumented + * library. + */ + default List injectedClassNames() { + return emptyList(); + } } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java index 23c293d1c142..ea0f03752aa8 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/InstrumentationModuleInstaller.java @@ -31,6 +31,7 @@ import io.opentelemetry.javaagent.tooling.util.NamedMatcher; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; import java.lang.instrument.Instrumentation; +import java.util.Collections; import java.util.List; import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.description.annotation.AnnotationSource; @@ -69,19 +70,40 @@ AgentBuilder install( } if (instrumentationModule.isIndyModule()) { - return installIndyModule(instrumentationModule, parentAgentBuilder); + return installIndyModule(instrumentationModule, parentAgentBuilder, config); } else { return installInjectingModule(instrumentationModule, parentAgentBuilder, config); } } private AgentBuilder installIndyModule( - InstrumentationModule instrumentationModule, AgentBuilder parentAgentBuilder) { - - IndyModuleRegistry.registerIndyModule(instrumentationModule); - + InstrumentationModule instrumentationModule, + AgentBuilder parentAgentBuilder, + ConfigProperties config) { + List helperClassNames = + InstrumentationModuleMuzzle.getHelperClassNames(instrumentationModule); HelperResourceBuilderImpl helperResourceBuilder = new HelperResourceBuilderImpl(); instrumentationModule.registerHelperResources(helperResourceBuilder); + List typeInstrumentations = instrumentationModule.typeInstrumentations(); + if (typeInstrumentations.isEmpty()) { + if (!helperClassNames.isEmpty() || !helperResourceBuilder.getResources().isEmpty()) { + logger.log( + WARNING, + "Helper classes and resources won't be injected if no types are instrumented: {0}", + instrumentationModule.instrumentationName()); + } + + return parentAgentBuilder; + } + + List injectedHelperClassNames = Collections.emptyList(); + if (instrumentationModule instanceof ExperimentalInstrumentationModule) { + ExperimentalInstrumentationModule experimentalInstrumentationModule = + (ExperimentalInstrumentationModule) instrumentationModule; + injectedHelperClassNames = experimentalInstrumentationModule.injectedClassNames(); + } + + IndyModuleRegistry.registerIndyModule(instrumentationModule); ClassInjectorImpl injectedClassesCollector = new ClassInjectorImpl(instrumentationModule); if (instrumentationModule instanceof ExperimentalInstrumentationModule) { @@ -89,17 +111,23 @@ private AgentBuilder installIndyModule( .injectClasses(injectedClassesCollector); } + MuzzleMatcher muzzleMatcher = new MuzzleMatcher(logger, instrumentationModule, config); + AgentBuilder.Transformer helperInjector = new HelperInjector( instrumentationModule.instrumentationName(), - injectedClassesCollector.getClassesToInject(), + injectedHelperClassNames, helperResourceBuilder.getResources(), instrumentationModule.getClass().getClassLoader(), instrumentation); + AgentBuilder.Transformer indyHelperInjector = + new HelperInjector( + instrumentationModule.instrumentationName(), + injectedClassesCollector.getClassesToInject(), + Collections.emptyList(), + instrumentationModule.getClass().getClassLoader(), + instrumentation); - // TODO (Jonas): Adapt MuzzleMatcher to use the same type lookup strategy as the - // InstrumentationModuleClassLoader (see IndyModuleTypePool) - // MuzzleMatcher muzzleMatcher = new MuzzleMatcher(logger, instrumentationModule, config); VirtualFieldImplementationInstaller contextProvider = virtualFieldInstallerFactory.create(instrumentationModule); @@ -107,8 +135,10 @@ private AgentBuilder installIndyModule( for (TypeInstrumentation typeInstrumentation : instrumentationModule.typeInstrumentations()) { AgentBuilder.Identified.Extendable extendableAgentBuilder = setTypeMatcher(agentBuilder, instrumentationModule, typeInstrumentation) + .and(muzzleMatcher) .transform(new PatchByteCodeVersionTransformer()) - .transform(helperInjector); + .transform(helperInjector) + .transform(indyHelperInjector); // TODO (Jonas): we are not calling // contextProvider.rewriteVirtualFieldsCalls(extendableAgentBuilder) anymore diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java index df70f987722e..03488bf921a3 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/MuzzleMatcher.java @@ -14,6 +14,7 @@ import io.opentelemetry.javaagent.tooling.TransformSafeLogger; import io.opentelemetry.javaagent.tooling.Utils; import io.opentelemetry.javaagent.tooling.config.AgentConfig; +import io.opentelemetry.javaagent.tooling.instrumentation.indy.IndyModuleRegistry; import io.opentelemetry.javaagent.tooling.muzzle.Mismatch; import io.opentelemetry.javaagent.tooling.muzzle.ReferenceMatcher; import io.opentelemetry.sdk.autoconfigure.spi.ConfigProperties; @@ -60,6 +61,10 @@ public boolean matches( ProtectionDomain protectionDomain) { if (classLoader == BOOTSTRAP_LOADER) { classLoader = Utils.getBootstrapProxy(); + } else if (instrumentationModule.isIndyModule()) { + classLoader = + IndyModuleRegistry.getInstrumentationClassloader( + instrumentationModule.getClass().getName(), classLoader); } return matchCache.computeIfAbsent(classLoader, this::doesMatch); } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/IndyModuleRegistry.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/IndyModuleRegistry.java index dfe421224c23..fa98cbd30ebb 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/IndyModuleRegistry.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/IndyModuleRegistry.java @@ -9,6 +9,7 @@ import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; import io.opentelemetry.javaagent.tooling.muzzle.InstrumentationModuleMuzzle; import java.lang.ref.WeakReference; import java.util.HashSet; @@ -84,6 +85,9 @@ static InstrumentationModuleClassLoader createInstrumentationModuleClassloader( // TODO (Jonas): Make muzzle include advice classes as helper classes // so that we don't have to include them here toInject.addAll(getModuleAdviceNames(module)); + if (module instanceof ExperimentalInstrumentationModule) { + toInject.removeAll(((ExperimentalInstrumentationModule) module).injectedClassNames()); + } ClassLoader agentOrExtensionCl = module.getClass().getClassLoader(); Map injectedClasses = diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/InstrumentationModuleClassLoader.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/InstrumentationModuleClassLoader.java index 30641430464f..eba2d240aa1a 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/InstrumentationModuleClassLoader.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/InstrumentationModuleClassLoader.java @@ -54,16 +54,26 @@ public class InstrumentationModuleClassLoader extends ClassLoader { private volatile MethodHandles.Lookup cachedLookup; private final ClassLoader instrumentedCl; + private final boolean delegateAllToAgent; public InstrumentationModuleClassLoader( ClassLoader instrumentedCl, ClassLoader agentOrExtensionCl, Map injectedClasses) { + this(instrumentedCl, agentOrExtensionCl, injectedClasses, false); + } + + InstrumentationModuleClassLoader( + ClassLoader instrumentedCl, + ClassLoader agentOrExtensionCl, + Map injectedClasses, + boolean delegateAllToAgent) { // agent/extension-classloader is "main"-parent, but class lookup is overridden super(agentOrExtensionCl); additionalInjectedClasses = injectedClasses; this.agentOrExtensionCl = agentOrExtensionCl; this.instrumentedCl = instrumentedCl; + this.delegateAllToAgent = delegateAllToAgent; } /** @@ -110,7 +120,7 @@ protected Class loadClass(String name, boolean resolve) throws ClassNotFoundE } } } - if (result == null) { + if (result == null && shouldLoadFromAgent(name)) { result = tryLoad(agentOrExtensionCl, name); } if (result == null) { @@ -128,6 +138,10 @@ protected Class loadClass(String name, boolean resolve) throws ClassNotFoundE } } + private boolean shouldLoadFromAgent(String dotClassName) { + return delegateAllToAgent || dotClassName.startsWith("io.opentelemetry.javaagent"); + } + private static Class tryLoad(ClassLoader cl, String name) { try { return cl.loadClass(name); diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/InstrumentationModuleClassLoaderTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/InstrumentationModuleClassLoaderTest.java index 6cd9c673e99c..e6449f28fb2d 100644 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/InstrumentationModuleClassLoaderTest.java +++ b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/instrumentation/indy/InstrumentationModuleClassLoaderTest.java @@ -43,9 +43,9 @@ void checkLookup() throws Throwable { ClassLoader dummyParent = new URLClassLoader(new URL[] {}, null); InstrumentationModuleClassLoader m1 = - new InstrumentationModuleClassLoader(dummyParent, dummyParent, toInject); + new InstrumentationModuleClassLoader(dummyParent, dummyParent, toInject, true); InstrumentationModuleClassLoader m2 = - new InstrumentationModuleClassLoader(dummyParent, dummyParent, toInject); + new InstrumentationModuleClassLoader(dummyParent, dummyParent, toInject, true); // MethodHandles.publicLookup() always succeeds on the first invocation lookupAndInvokeFoo(m1); @@ -79,7 +79,7 @@ void checkInjectedClassesHavePackage() throws Throwable { ClassLoader dummyParent = new URLClassLoader(new URL[] {}, null); InstrumentationModuleClassLoader m1 = - new InstrumentationModuleClassLoader(dummyParent, dummyParent, toInject); + new InstrumentationModuleClassLoader(dummyParent, dummyParent, toInject, true); Class injected = Class.forName(A.class.getName(), true, m1); // inject two classes from the same package to trigger errors if we try to redefine the package @@ -120,7 +120,7 @@ void checkClassLookupPrecedence(@TempDir Path tempDir) throws Exception { toInject.put(C.class.getName(), ClassCopySource.create(C.class.getName(), moduleSourceCl)); InstrumentationModuleClassLoader moduleCl = - new InstrumentationModuleClassLoader(appCl, agentCl, toInject); + new InstrumentationModuleClassLoader(appCl, agentCl, toInject, true); // Verify precedence for classloading Class clA = moduleCl.loadClass(A.class.getName()); diff --git a/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/HelperInjector.java b/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/HelperInjector.java index 2b2d0e4b9475..12ebb113ff5a 100644 --- a/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/HelperInjector.java +++ b/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/HelperInjector.java @@ -160,7 +160,6 @@ public static void setHelperInjectorListener(HelperInjectorListener listener) { private Map> getHelperMap(ClassLoader targetClassloader) { Map> result = new LinkedHashMap<>(); if (dynamicTypeMap.isEmpty()) { - for (String helperClassName : helperClassNames) { result.put( helperClassName, diff --git a/testing-common/integration-tests/src/main/java/indy/IndyInstrumentationTestModule.java b/testing-common/integration-tests/src/main/java/io/opentelemetry/javaagent/IndyInstrumentationTestModule.java similarity index 99% rename from testing-common/integration-tests/src/main/java/indy/IndyInstrumentationTestModule.java rename to testing-common/integration-tests/src/main/java/io/opentelemetry/javaagent/IndyInstrumentationTestModule.java index 12089bcde530..88848fb7a23d 100644 --- a/testing-common/integration-tests/src/main/java/indy/IndyInstrumentationTestModule.java +++ b/testing-common/integration-tests/src/main/java/io/opentelemetry/javaagent/IndyInstrumentationTestModule.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package indy; +package io.opentelemetry.javaagent; import static net.bytebuddy.implementation.bytecode.assign.Assigner.Typing.DYNAMIC; import static net.bytebuddy.matcher.ElementMatchers.named;