Make OpenTelemetry-API Bridge and dependent instrumentations work with indy (#11578)

This commit is contained in:
Jonas Kunz 2024-09-05 01:07:13 +02:00 committed by GitHub
parent 4b03e98b47
commit 9dd11ff606
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
21 changed files with 225 additions and 103 deletions

View File

@ -10,10 +10,12 @@ import static java.util.Arrays.asList;
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 KotlinCoroutinesInstrumentationModule extends InstrumentationModule {
public class KotlinCoroutinesInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public KotlinCoroutinesInstrumentationModule() {
super("kotlinx-coroutines");
@ -25,12 +27,9 @@ public class KotlinCoroutinesInstrumentationModule extends InstrumentationModule
}
@Override
public boolean isIndyModule() {
// java.lang.LinkageError: bad method type alias: (CoroutineContext)Object[] not visible from
// class
// io.opentelemetry.javaagent.instrumentation.kotlinxcoroutines.KotlinCoroutinesInstrumentation$ContextAdvice
// CoroutineContext is loaded from agent class loader not application
return false;
public String getModuleGroup() {
// This module uses the api context bridge helpers, therefore must be in the same classloader
return "opentelemetry-api-bridge";
}
@Override

View File

@ -10,19 +10,17 @@ import static java.util.Arrays.asList;
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.Collections;
import java.util.List;
@AutoService(InstrumentationModule.class)
public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule {
public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public OpenTelemetryApiInstrumentationModule() {
super("opentelemetry-api", "opentelemetry-api-1.0");
}
@Override
public boolean isIndyModule() {
return false;
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return asList(
@ -31,4 +29,17 @@ public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule
new OpenTelemetryInstrumentation(),
new SpanInstrumentation());
}
@Override
public String getModuleGroup() {
return "opentelemetry-api-bridge";
}
@Override
public List<String> agentPackagesToHide() {
// These are helper classes injected by api-version specific instrumentation modules
// We don't want to fall back to accidentally trying to load those from the agent CL
// when they haven't been injected
return Collections.singletonList("io.opentelemetry.javaagent.instrumentation.opentelemetryapi");
}
}

View File

@ -10,22 +10,24 @@ 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 OpenTelemetryApiInstrumentationModule extends InstrumentationModule {
public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public OpenTelemetryApiInstrumentationModule() {
super("opentelemetry-api", "opentelemetry-api-1.10");
}
@Override
public boolean isIndyModule() {
return false;
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return singletonList(new OpenTelemetryInstrumentation());
}
@Override
public String getModuleGroup() {
return "opentelemetry-api-bridge";
}
}

View File

@ -10,21 +10,23 @@ 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 OpenTelemetryApiInstrumentationModule extends InstrumentationModule {
public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public OpenTelemetryApiInstrumentationModule() {
super("opentelemetry-api", "opentelemetry-api-1.15");
}
@Override
public boolean isIndyModule() {
return false;
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return singletonList(new OpenTelemetryInstrumentation());
}
@Override
public String getModuleGroup() {
return "opentelemetry-api-bridge";
}
}

View File

@ -10,21 +10,23 @@ 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 OpenTelemetryApiInstrumentationModule extends InstrumentationModule {
public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public OpenTelemetryApiInstrumentationModule() {
super("opentelemetry-api", "opentelemetry-api-1.27");
}
@Override
public boolean isIndyModule() {
return false;
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return singletonList(new OpenTelemetryInstrumentation());
}
@Override
public String getModuleGroup() {
return "opentelemetry-api-bridge";
}
}

View File

@ -11,20 +11,17 @@ 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;
import net.bytebuddy.matcher.ElementMatcher;
@AutoService(InstrumentationModule.class)
public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule {
public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public OpenTelemetryApiInstrumentationModule() {
super("opentelemetry-api", "opentelemetry-api-1.31", "opentelemetry-api-incubator-1.31");
}
@Override
public boolean isIndyModule() {
return false;
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return singletonList(new OpenTelemetryInstrumentation());
@ -35,4 +32,9 @@ public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule
return hasClassesNamed(
"application.io.opentelemetry.extension.incubator.metrics.ExtendedDoubleHistogramBuilder");
}
@Override
public String getModuleGroup() {
return "opentelemetry-api-bridge";
}
}

View File

@ -12,11 +12,13 @@ import static net.bytebuddy.matcher.ElementMatchers.not;
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;
import net.bytebuddy.matcher.ElementMatcher;
@AutoService(InstrumentationModule.class)
public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule {
public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public OpenTelemetryApiInstrumentationModule() {
super("opentelemetry-api", "opentelemetry-api-1.32");
}
@ -30,13 +32,13 @@ public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule
"application.io.opentelemetry.extension.incubator.metrics.ExtendedDoubleHistogramBuilder"));
}
@Override
public boolean isIndyModule() {
return false;
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return singletonList(new OpenTelemetryInstrumentation());
}
@Override
public String getModuleGroup() {
return "opentelemetry-api-bridge";
}
}

View File

@ -11,11 +11,13 @@ 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;
import net.bytebuddy.matcher.ElementMatcher;
@AutoService(InstrumentationModule.class)
public class OpenTelemetryApiIncubatorInstrumentationModule extends InstrumentationModule {
public class OpenTelemetryApiIncubatorInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public OpenTelemetryApiIncubatorInstrumentationModule() {
super("opentelemetry-api", "opentelemetry-api-1.32", "opentelemetry-api-incubator-1.32");
}
@ -28,13 +30,13 @@ public class OpenTelemetryApiIncubatorInstrumentationModule extends Instrumentat
"application.io.opentelemetry.extension.incubator.metrics.ExtendedDoubleHistogramBuilder");
}
@Override
public boolean isIndyModule() {
return false;
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return singletonList(new OpenTelemetryIncubatorInstrumentation());
}
@Override
public String getModuleGroup() {
return "opentelemetry-api-bridge";
}
}

View File

@ -11,11 +11,13 @@ 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;
import net.bytebuddy.matcher.ElementMatcher;
@AutoService(InstrumentationModule.class)
public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule {
public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public OpenTelemetryApiInstrumentationModule() {
super("opentelemetry-api", "opentelemetry-api-1.37", "opentelemetry-api-incubator-1.37");
}
@ -26,13 +28,13 @@ public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule
return hasClassesNamed("application.io.opentelemetry.api.incubator.metrics.DoubleGauge");
}
@Override
public boolean isIndyModule() {
return false;
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return singletonList(new OpenTelemetryInstrumentation());
}
@Override
public String getModuleGroup() {
return "opentelemetry-api-bridge";
}
}

View File

@ -12,11 +12,13 @@ import static net.bytebuddy.matcher.ElementMatchers.not;
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;
import net.bytebuddy.matcher.ElementMatcher;
@AutoService(InstrumentationModule.class)
public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule {
public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public OpenTelemetryApiInstrumentationModule() {
super("opentelemetry-api", "opentelemetry-api-1.38");
}
@ -30,13 +32,13 @@ public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule
"application.io.opentelemetry.api.incubator.metrics.ExtendedDoubleHistogramBuilder"));
}
@Override
public boolean isIndyModule() {
return false;
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return singletonList(new OpenTelemetryInstrumentation());
}
@Override
public String getModuleGroup() {
return "opentelemetry-api-bridge";
}
}

View File

@ -11,11 +11,13 @@ 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;
import net.bytebuddy.matcher.ElementMatcher;
@AutoService(InstrumentationModule.class)
public class OpenTelemetryApiIncubatorInstrumentationModule extends InstrumentationModule {
public class OpenTelemetryApiIncubatorInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public OpenTelemetryApiIncubatorInstrumentationModule() {
super("opentelemetry-api", "opentelemetry-api-1.38", "opentelemetry-api-incubator-1.38");
}
@ -28,13 +30,13 @@ public class OpenTelemetryApiIncubatorInstrumentationModule extends Instrumentat
"application.io.opentelemetry.api.incubator.metrics.ExtendedDoubleHistogramBuilder");
}
@Override
public boolean isIndyModule() {
return false;
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return singletonList(new OpenTelemetryIncubatorInstrumentation());
}
@Override
public String getModuleGroup() {
return "opentelemetry-api-bridge";
}
}

View File

@ -10,21 +10,23 @@ 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 OpenTelemetryApiInstrumentationModule extends InstrumentationModule {
public class OpenTelemetryApiInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public OpenTelemetryApiInstrumentationModule() {
super("opentelemetry-api", "opentelemetry-api-1.4");
}
@Override
public boolean isIndyModule() {
return false;
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return singletonList(new OpenTelemetryInstrumentation());
}
@Override
public String getModuleGroup() {
return "opentelemetry-api-bridge";
}
}

View File

@ -10,10 +10,12 @@ 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 ContextExtensionInstrumentationModule extends InstrumentationModule {
public class ContextExtensionInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public ContextExtensionInstrumentationModule() {
super("opentelemetry-extension-kotlin");
@ -24,13 +26,13 @@ public class ContextExtensionInstrumentationModule extends InstrumentationModule
return className.startsWith("io.opentelemetry.extension.kotlin.");
}
@Override
public boolean isIndyModule() {
return false;
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return singletonList(new ContextExtensionInstrumentation());
}
@Override
public String getModuleGroup() {
return "opentelemetry-api-bridge";
}
}

View File

@ -11,11 +11,13 @@ import static java.util.Arrays.asList;
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;
import net.bytebuddy.matcher.ElementMatcher;
@AutoService(InstrumentationModule.class)
public class InstrumentationApiInstrumentationModule extends InstrumentationModule {
public class InstrumentationApiInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public InstrumentationApiInstrumentationModule() {
super("opentelemetry-instrumentation-api");
@ -26,13 +28,13 @@ public class InstrumentationApiInstrumentationModule extends InstrumentationModu
return hasClassesNamed("application.io.opentelemetry.instrumentation.api.internal.SpanKey");
}
@Override
public boolean isIndyModule() {
return false;
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return asList(new HttpRouteStateInstrumentation(), new SpanKeyInstrumentation());
}
@Override
public String getModuleGroup() {
return "opentelemetry-api-bridge";
}
}

View File

@ -10,18 +10,21 @@ 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 ReactorInstrumentationModule extends InstrumentationModule {
public class ReactorInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public ReactorInstrumentationModule() {
super("reactor", "reactor-3.1");
}
@Override
public boolean isIndyModule() {
return false;
public String getModuleGroup() {
// needs to be in the same module as ContextPropagationOperatorInstrumentation
return "opentelemetry-api-bridge";
}
@Override

View File

@ -106,9 +106,9 @@ public class ContextPropagationOperatorInstrumentation implements TypeInstrument
@SuppressWarnings("unused")
public static class RunWithAdvice {
@Advice.OnMethodEnter
public static void methodEnter(
@Advice.FieldValue(value = "enabled", readOnly = false) boolean enabled) {
enabled = true;
@Advice.AssignReturned.ToFields(@Advice.AssignReturned.ToFields.ToField("enabled"))
public static boolean methodEnter() {
return true;
}
}
}

View File

@ -11,11 +11,13 @@ 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;
import net.bytebuddy.matcher.ElementMatcher;
@AutoService(InstrumentationModule.class)
public class ContextPropagationOperatorInstrumentationModule extends InstrumentationModule {
public class ContextPropagationOperatorInstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public ContextPropagationOperatorInstrumentationModule() {
super("reactor", "reactor-3.1", "reactor-context-propagation-operator");
@ -26,14 +28,14 @@ public class ContextPropagationOperatorInstrumentationModule extends Instrumenta
return hasClassesNamed("application.io.opentelemetry.context.Context");
}
@Override
public boolean isIndyModule() {
// RunWithAdvice uses @Advice.FieldValue
return false;
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return singletonList(new ContextPropagationOperatorInstrumentation());
}
@Override
public String getModuleGroup() {
// This module uses the api context bridge helpers, therefore must be in the same classloader
return "opentelemetry-api-bridge";
}
}

View File

@ -11,11 +11,13 @@ 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;
import net.bytebuddy.matcher.ElementMatcher;
@AutoService(InstrumentationModule.class)
public class ContextPropagationOperator34InstrumentationModule extends InstrumentationModule {
public class ContextPropagationOperator34InstrumentationModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
public ContextPropagationOperator34InstrumentationModule() {
super("reactor", "reactor-3.4", "reactor-context-propagation-operator");
@ -33,8 +35,8 @@ public class ContextPropagationOperator34InstrumentationModule extends Instrumen
}
@Override
public boolean isIndyModule() {
// Requires Otel-API bride
return false;
public String getModuleGroup() {
// This module uses the api context bridge helpers, therefore must be in the same classloader
return "opentelemetry-api-bridge";
}
}

View File

@ -9,6 +9,7 @@ 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.Collections;
import java.util.List;
/**
@ -48,4 +49,16 @@ public interface ExperimentalInstrumentationModule {
default String getModuleGroup() {
return getClass().getName();
}
/**
* Some instrumentations need to invoke classes which are present both in the agent classloader
* and the instrumented application classloader. By default, the classloader of the
* instrumentation would link those against the class provided by the agent. This setting allows
* to hide packages, so that matching classes are instead used from the application classloader.
*
* @return the list of packages (without trailing dots)
*/
default List<String> agentPackagesToHide() {
return Collections.emptyList();
}
}

View File

@ -77,6 +77,13 @@ public class InstrumentationModuleClassLoader extends ClassLoader {
*/
private final ElementMatcher<String> agentClassNamesMatcher;
/**
* Mutable set of packages from the agent classloader to hide. So even if a class matches {@link
* #agentClassNamesMatcher}, it will not be attempted to be loaded from the agent classloader if
* it is from any of these packages.
*/
private final Set<String> hiddenAgentPackages;
private final Set<InstrumentationModule> installedModules;
public InstrumentationModuleClassLoader(
@ -98,6 +105,7 @@ public class InstrumentationModuleClassLoader extends ClassLoader {
this.agentOrExtensionCl = agentOrExtensionCl;
this.instrumentedCl = instrumentedCl;
this.agentClassNamesMatcher = classesToLoadFromAgentOrExtensionCl;
this.hiddenAgentPackages = Collections.newSetFromMap(new ConcurrentHashMap<>());
}
/**
@ -141,6 +149,10 @@ public class InstrumentationModuleClassLoader extends ClassLoader {
className -> className,
className -> BytecodeWithUrl.create(className, agentOrExtensionCl)));
installInjectedClasses(classesToInject);
if (module instanceof ExperimentalInstrumentationModule) {
hiddenAgentPackages.addAll(
((ExperimentalInstrumentationModule) module).agentPackagesToHide());
}
}
public synchronized boolean hasModuleInstalled(InstrumentationModule module) {
@ -226,7 +238,15 @@ public class InstrumentationModuleClassLoader extends ClassLoader {
}
private boolean shouldLoadFromAgent(String dotClassName) {
return agentClassNamesMatcher.matches(dotClassName);
if (!agentClassNamesMatcher.matches(dotClassName)) {
return false;
}
for (String packageName : hiddenAgentPackages) {
if (dotClassName.startsWith(packageName)) {
return false;
}
}
return true;
}
private static Class<?> tryLoad(@Nullable ClassLoader cl, String name) {

View File

@ -8,6 +8,9 @@ package io.opentelemetry.javaagent.tooling.instrumentation.indy;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
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.javaagent.tooling.BytecodeWithUrl;
import io.opentelemetry.javaagent.tooling.instrumentation.indy.dummies.Bar;
import io.opentelemetry.javaagent.tooling.instrumentation.indy.dummies.Foo;
@ -21,8 +24,10 @@ import java.net.URL;
import java.net.URLClassLoader;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.jar.JarEntry;
import java.util.jar.JarOutputStream;
@ -191,6 +196,49 @@ class InstrumentationModuleClassLoaderTest {
}
}
public static class HidingModule extends InstrumentationModule
implements ExperimentalInstrumentationModule {
List<String> hiddenPackages = new ArrayList<>();
public HidingModule() {
super("hiding-module");
}
@Override
public List<TypeInstrumentation> typeInstrumentations() {
return Collections.emptyList();
}
@Override
public List<String> agentPackagesToHide() {
return hiddenPackages;
}
}
@Test
public void testAgentClassHiding() throws ClassNotFoundException {
HidingModule module = new HidingModule();
ClassLoader agentCl = HideMe.class.getClassLoader();
InstrumentationModuleClassLoader nothingHidden =
new InstrumentationModuleClassLoader(null, agentCl, ElementMatchers.any());
nothingHidden.installModule(module);
assertThat(nothingHidden.loadClass(HideMe.class.getName())).isSameAs(HideMe.class);
module.hiddenPackages.add(HideMe.class.getPackage().getName());
InstrumentationModuleClassLoader classHidden =
new InstrumentationModuleClassLoader(null, agentCl, ElementMatchers.any());
classHidden.installModule(module);
assertThatThrownBy(() -> classHidden.loadClass(HideMe.class.getName()))
.isInstanceOf(ClassNotFoundException.class);
}
public static class HideMe {}
private static String getClassFile(Class<?> cl) {
return cl.getName().replace('.', '/') + ".class";
}