Make OpenTelemetry-API Bridge and dependent instrumentations work with indy (#11578)
This commit is contained in:
parent
4b03e98b47
commit
9dd11ff606
|
@ -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
|
||||
|
|
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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";
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue