From 1406855bb70a1304b7e363737e66de9aab2c3d92 Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Fri, 2 Apr 2021 01:11:15 +0200 Subject: [PATCH] Revert "Prevent duplicate telemetry when using both library and auto instrumentation (#2661)" (#2689) --- docs/contributing/muzzle.md | 2 +- examples/distro/gradle/shadow.gradle | 4 +- gradle/instrumentation.gradle | 5 +- .../v2_7/DubboInstrumentationModule.java | 5 - .../v1_3/ArmeriaInstrumentationModule.java | 5 - .../v1_0/AwsLambdaInstrumentationModule.java | 5 - .../v1_11/AwsSdkInstrumentationModule.java | 5 - .../v2_2/AwsSdkInstrumentationModule.java | 5 - .../javaagent/couchbase-3.1-javaagent.gradle | 7 +- .../v3_1/CouchbaseInstrumentationModule.java | 10 +- .../grpc/v1_5/GrpcInstrumentationModule.java | 5 - instrumentation/instrumentation.gradle | 6 +- .../axis2/Axis2InstrumentationModule.java | 5 - .../cxf/CxfInstrumentationModule.java | 5 - .../v5_1/LettuceInstrumentationModule.java | 5 - .../v2_13_2/Log4j2InstrumentationModule.java | 5 - .../v1_0/LogbackInstrumentationModule.java | 5 - .../v3_0/OkHttp3InstrumentationModule.java | 5 - .../oshi/OshiInstrumentationModule.java | 5 - .../instrumentation/oshi/OshiTest.groovy | 14 +-- .../reactor/ReactorInstrumentationModule.java | 5 - .../RocketMqInstrumentationModule.java | 5 - .../rxjava2/RxJava2InstrumentationModule.java | 5 - .../WebfluxClientInstrumentationModule.java | 5 - .../SpringWebMvcInstrumentationModule.java | 5 - .../tooling/InstrumentationModule.java | 83 ++++------------ .../matcher/AgentElementMatchers.java | 6 -- .../matcher/CallWhenTrueDecorator.java | 27 ------ .../bytebuddy/matcher/ClassLoaderMatcher.java | 97 ++++++------------- .../muzzle/InstrumentationClassPredicate.java | 3 +- .../muzzle/collector/MuzzleCodeGenerator.java | 7 +- .../matcher/CallWhenTrueDecoratorTest.java | 52 ---------- javaagent/javaagent.gradle | 2 +- testing/agent-exporter/agent-exporter.gradle | 6 +- .../agent-for-testing.gradle | 2 +- 35 files changed, 79 insertions(+), 344 deletions(-) delete mode 100644 javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/CallWhenTrueDecorator.java delete mode 100644 javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/CallWhenTrueDecoratorTest.java diff --git a/docs/contributing/muzzle.md b/docs/contributing/muzzle.md index 4873cda9e0..2bb5289bc9 100644 --- a/docs/contributing/muzzle.md +++ b/docs/contributing/muzzle.md @@ -26,7 +26,7 @@ instrumentations (`InstrumentationModule#typeInstrumentations()`). The reference starts from advice classes (values of the map returned by the `TypeInstrumentation#transformers()` method) and traverses the class graph until it encounters a reference to a non-instrumentation class (determined by `InstrumentationClassPredicate` and -the `InstrumentationModule#isLibraryInstrumentationClass(String)` predicate). Aside from references, +the `InstrumentationModule#isHelperClass(String)` predicate). Aside from references, the collection process also builds a graph of dependencies between internal instrumentation helper classes - this dependency graph is later used to construct a list of helper classes that will be injected to the application classloader (`InstrumentationModule#getMuzzleHelperClassNames()`). diff --git a/examples/distro/gradle/shadow.gradle b/examples/distro/gradle/shadow.gradle index 453a1fbb49..31c5202a14 100644 --- a/examples/distro/gradle/shadow.gradle +++ b/examples/distro/gradle/shadow.gradle @@ -4,8 +4,8 @@ ext.relocatePackages = { shadowJar -> // rewrite dependencies calling Logger.getLogger shadowJar.relocate 'java.util.logging.Logger', 'io.opentelemetry.javaagent.bootstrap.PatchLogger' - // prevents conflict with library instrumentation, which uses its own instrumentation-api - shadowJar.relocate 'io.opentelemetry.instrumentation.api', 'io.opentelemetry.javaagent.shaded.instrumentation.api' + // rewrite library instrumentation dependencies + shadowJar.relocate "io.opentelemetry.instrumentation", "io.opentelemetry.javaagent.shaded.instrumentation" // relocate OpenTelemetry API usage shadowJar.relocate "io.opentelemetry.api", "io.opentelemetry.javaagent.shaded.io.opentelemetry.api" diff --git a/gradle/instrumentation.gradle b/gradle/instrumentation.gradle index 9ab1448629..8d05d54f35 100644 --- a/gradle/instrumentation.gradle +++ b/gradle/instrumentation.gradle @@ -79,12 +79,15 @@ shadowJar { archiveFileName = 'agent-testing.jar' + // rewrite library instrumentation dependencies + relocate "io.opentelemetry.instrumentation", "io.opentelemetry.javaagent.shaded.instrumentation" + // Prevents conflict with other SLF4J instances. Important for premain. relocate 'org.slf4j', 'io.opentelemetry.javaagent.slf4j' // rewrite dependencies calling Logger.getLogger relocate 'java.util.logging.Logger', 'io.opentelemetry.javaagent.bootstrap.PatchLogger' - // prevents conflict with library instrumentation, which uses its own instrumentation-api + // prevents conflict with library instrumentation relocate 'io.opentelemetry.instrumentation.api', 'io.opentelemetry.javaagent.shaded.instrumentation.api' // relocate OpenTelemetry API usage diff --git a/instrumentation/apache-dubbo/apache-dubbo-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachedubbo/v2_7/DubboInstrumentationModule.java b/instrumentation/apache-dubbo/apache-dubbo-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachedubbo/v2_7/DubboInstrumentationModule.java index 63a3fa859d..f9282b7ce6 100644 --- a/instrumentation/apache-dubbo/apache-dubbo-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachedubbo/v2_7/DubboInstrumentationModule.java +++ b/instrumentation/apache-dubbo/apache-dubbo-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachedubbo/v2_7/DubboInstrumentationModule.java @@ -32,11 +32,6 @@ public class DubboInstrumentationModule extends InstrumentationModule { return hasClassesNamed("org.apache.dubbo.rpc.Filter"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.apachedubbo.v2_7"); - } - @Override public List typeInstrumentations() { return Collections.singletonList(new DubboInstrumentation()); diff --git a/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaInstrumentationModule.java b/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaInstrumentationModule.java index e6d0d52535..e6f3d19a7c 100644 --- a/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaInstrumentationModule.java +++ b/instrumentation/armeria-1.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/v1_3/ArmeriaInstrumentationModule.java @@ -26,11 +26,6 @@ public class ArmeriaInstrumentationModule extends InstrumentationModule { return hasClassesNamed("com.linecorp.armeria.server.metric.PrometheusExpositionServiceBuilder"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.armeria.v1_3"); - } - @Override public List typeInstrumentations() { return asList( diff --git a/instrumentation/aws-lambda-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambda/v1_0/AwsLambdaInstrumentationModule.java b/instrumentation/aws-lambda-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambda/v1_0/AwsLambdaInstrumentationModule.java index dba1e276dd..b69c099825 100644 --- a/instrumentation/aws-lambda-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambda/v1_0/AwsLambdaInstrumentationModule.java +++ b/instrumentation/aws-lambda-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awslambda/v1_0/AwsLambdaInstrumentationModule.java @@ -23,11 +23,6 @@ public class AwsLambdaInstrumentationModule extends InstrumentationModule { return new String[] {"io.opentelemetry.extension.aws.AwsXrayPropagator"}; } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.awslambda.v1_0"); - } - @Override public List typeInstrumentations() { return singletonList(new AwsLambdaRequestHandlerInstrumentation()); diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/AwsSdkInstrumentationModule.java b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/AwsSdkInstrumentationModule.java index 52222a2eeb..dd573f9695 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/AwsSdkInstrumentationModule.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/AwsSdkInstrumentationModule.java @@ -23,11 +23,6 @@ public class AwsSdkInstrumentationModule extends InstrumentationModule { return new String[] {"io.opentelemetry.extension.aws.AwsXrayPropagator"}; } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.awssdk.v1_11"); - } - @Override public List typeInstrumentations() { return asList( diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkInstrumentationModule.java b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkInstrumentationModule.java index 822b53e262..8485d031b3 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkInstrumentationModule.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkInstrumentationModule.java @@ -43,11 +43,6 @@ public class AwsSdkInstrumentationModule extends InstrumentationModule { return hasClassesNamed("software.amazon.awssdk.core.interceptor.ExecutionInterceptor"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.awssdk.v2_2"); - } - @Override public List typeInstrumentations() { return Collections.singletonList(new AwsSdkInitializationInstrumentation()); diff --git a/instrumentation/couchbase/couchbase-3.1/javaagent/couchbase-3.1-javaagent.gradle b/instrumentation/couchbase/couchbase-3.1/javaagent/couchbase-3.1-javaagent.gradle index be61a41987..c32976a313 100644 --- a/instrumentation/couchbase/couchbase-3.1/javaagent/couchbase-3.1-javaagent.gradle +++ b/instrumentation/couchbase/couchbase-3.1/javaagent/couchbase-3.1-javaagent.gradle @@ -21,9 +21,4 @@ dependencies { testLibrary group: "com.couchbase.client", name: "java-client", version: "3.1.0" testImplementation group: "org.testcontainers", name: "couchbase", version: versions.testcontainers -} - -configurations { - // exclude lib from test classpath, otherwise the javaagent would be skipped - testImplementation.exclude group: 'com.couchbase.client', module: 'tracing-opentelemetry' -} +} \ No newline at end of file diff --git a/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseInstrumentationModule.java b/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseInstrumentationModule.java index 27ba9358b6..7c602975d4 100644 --- a/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseInstrumentationModule.java +++ b/instrumentation/couchbase/couchbase-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v3_1/CouchbaseInstrumentationModule.java @@ -20,6 +20,11 @@ public class CouchbaseInstrumentationModule extends InstrumentationModule { super("couchbase", "couchbase-3.1"); } + @Override + public boolean isHelperClass(String className) { + return className.startsWith("com.couchbase.client.tracing.opentelemetry"); + } + @Override public ElementMatcher.Junction classLoaderMatcher() { // New class introduced in 3.1, the minimum version we support. @@ -28,11 +33,6 @@ public class CouchbaseInstrumentationModule extends InstrumentationModule { return hasClassesNamed("com.couchbase.client.core.cnc.TracingIdentifiers"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("com.couchbase.client.tracing.opentelemetry"); - } - @Override public List typeInstrumentations() { return Collections.singletonList(new CouchbaseEnvironmentInstrumentation()); diff --git a/instrumentation/grpc-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_5/GrpcInstrumentationModule.java b/instrumentation/grpc-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_5/GrpcInstrumentationModule.java index dbf1890c00..50e016e5d7 100644 --- a/instrumentation/grpc-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_5/GrpcInstrumentationModule.java +++ b/instrumentation/grpc-1.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/grpc/v1_5/GrpcInstrumentationModule.java @@ -18,11 +18,6 @@ public class GrpcInstrumentationModule extends InstrumentationModule { super("grpc", "grpc-1.5"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.grpc.v1_5"); - } - @Override public List typeInstrumentations() { return asList( diff --git a/instrumentation/instrumentation.gradle b/instrumentation/instrumentation.gradle index a8bbaae756..1a6fd7e0a5 100644 --- a/instrumentation/instrumentation.gradle +++ b/instrumentation/instrumentation.gradle @@ -61,12 +61,12 @@ shadowJar { exclude(project(':javaagent-api')) } + // rewrite library instrumentation dependencies + relocate "io.opentelemetry.instrumentation", "io.opentelemetry.javaagent.shaded.instrumentation" + // rewrite dependencies calling Logger.getLogger relocate 'java.util.logging.Logger', 'io.opentelemetry.javaagent.bootstrap.PatchLogger' - // prevents conflict with library instrumentation, which uses its own instrumentation-api - relocate 'io.opentelemetry.instrumentation.api', 'io.opentelemetry.javaagent.shaded.instrumentation.api' - // relocate OpenTelemetry API usage relocate "io.opentelemetry.api", "io.opentelemetry.javaagent.shaded.io.opentelemetry.api" relocate "io.opentelemetry.semconv", "io.opentelemetry.javaagent.shaded.io.opentelemetry.semconv" diff --git a/instrumentation/jaxws/jaxws-2.0-axis2-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/axis2/Axis2InstrumentationModule.java b/instrumentation/jaxws/jaxws-2.0-axis2-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/axis2/Axis2InstrumentationModule.java index 2c1f774899..3276aa0c24 100644 --- a/instrumentation/jaxws/jaxws-2.0-axis2-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/axis2/Axis2InstrumentationModule.java +++ b/instrumentation/jaxws/jaxws-2.0-axis2-1.6/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/axis2/Axis2InstrumentationModule.java @@ -26,11 +26,6 @@ public class Axis2InstrumentationModule extends InstrumentationModule { return hasClassesNamed("org.apache.axis2.jaxws.api.MessageAccessor"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.axis2"); - } - @Override public List typeInstrumentations() { return Collections.singletonList(new InvocationListenerRegistryTypeInstrumentation()); diff --git a/instrumentation/jaxws/jaxws-2.0-cxf-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cxf/CxfInstrumentationModule.java b/instrumentation/jaxws/jaxws-2.0-cxf-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cxf/CxfInstrumentationModule.java index acdfadb014..0012d713eb 100644 --- a/instrumentation/jaxws/jaxws-2.0-cxf-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cxf/CxfInstrumentationModule.java +++ b/instrumentation/jaxws/jaxws-2.0-cxf-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cxf/CxfInstrumentationModule.java @@ -17,11 +17,6 @@ public class CxfInstrumentationModule extends InstrumentationModule { super("cxf", "cxf-3.0"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.cxf"); - } - @Override public List typeInstrumentations() { return Collections.singletonList(new EndpointImplTypeInstrumentation()); diff --git a/instrumentation/lettuce/lettuce-5.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceInstrumentationModule.java b/instrumentation/lettuce/lettuce-5.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceInstrumentationModule.java index 87c3cee7d9..b1516dd276 100644 --- a/instrumentation/lettuce/lettuce-5.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceInstrumentationModule.java +++ b/instrumentation/lettuce/lettuce-5.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_1/LettuceInstrumentationModule.java @@ -36,11 +36,6 @@ public class LettuceInstrumentationModule extends InstrumentationModule { return hasClassesNamed("io.lettuce.core.tracing.Tracing"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.lettuce.v5_1"); - } - @Override public List typeInstrumentations() { return singletonList(new DefaultClientResourcesInstrumentation()); diff --git a/instrumentation/log4j/log4j-2.13.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/v2_13_2/Log4j2InstrumentationModule.java b/instrumentation/log4j/log4j-2.13.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/v2_13_2/Log4j2InstrumentationModule.java index 4f6e4ed332..5fe0c77330 100644 --- a/instrumentation/log4j/log4j-2.13.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/v2_13_2/Log4j2InstrumentationModule.java +++ b/instrumentation/log4j/log4j-2.13.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/log4j/v2_13_2/Log4j2InstrumentationModule.java @@ -37,11 +37,6 @@ public class Log4j2InstrumentationModule extends InstrumentationModule { return hasClassesNamed("org.apache.logging.log4j.core.util.ContextDataProvider"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.log4j.v2_13_2"); - } - @Override public List typeInstrumentations() { return Arrays.asList(new BugFixingInstrumentation(), new EmptyTypeInstrumentation()); diff --git a/instrumentation/logback/logback-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/v1_0/LogbackInstrumentationModule.java b/instrumentation/logback/logback-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/v1_0/LogbackInstrumentationModule.java index b3eee26e0c..3ec8a09b95 100644 --- a/instrumentation/logback/logback-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/v1_0/LogbackInstrumentationModule.java +++ b/instrumentation/logback/logback-1.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/logback/v1_0/LogbackInstrumentationModule.java @@ -26,11 +26,6 @@ public class LogbackInstrumentationModule extends InstrumentationModule { return asList(new LoggerInstrumentation(), new LoggingEventInstrumentation()); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.logback.v1_0"); - } - @Override public Map contextStore() { return singletonMap("ch.qos.logback.classic.spi.ILoggingEvent", Span.class.getName()); 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 ee979723e2..d7d9897b5a 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 @@ -29,11 +29,6 @@ public class OkHttp3InstrumentationModule extends InstrumentationModule { super("okhttp", "okhttp-3.0"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.okhttp.v3_0"); - } - @Override public List typeInstrumentations() { return singletonList(new OkHttpClientInstrumentation()); diff --git a/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiInstrumentationModule.java b/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiInstrumentationModule.java index c66b5192ca..c8c08e59cc 100644 --- a/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiInstrumentationModule.java +++ b/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiInstrumentationModule.java @@ -31,11 +31,6 @@ public class OshiInstrumentationModule extends InstrumentationModule { super("oshi"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.oshi"); - } - @Override public List typeInstrumentations() { return singletonList(new SystemInfoInstrumentation()); diff --git a/instrumentation/oshi/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/oshi/OshiTest.groovy b/instrumentation/oshi/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/oshi/OshiTest.groovy index a579a75e4c..208b319029 100644 --- a/instrumentation/oshi/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/oshi/OshiTest.groovy +++ b/instrumentation/oshi/javaagent/src/test/groovy/io/opentelemetry/javaagent/instrumentation/oshi/OshiTest.groovy @@ -15,13 +15,13 @@ class OshiTest extends AgentInstrumentationSpecification { def "test system metrics is enabled"() { expect: // TODO (trask) is this the instrumentation library name we want? - findMetric("io.opentelemetry.instrumentation.oshi", "system.disk.io") != null - findMetric("io.opentelemetry.instrumentation.oshi", "system.disk.operations") != null - findMetric("io.opentelemetry.instrumentation.oshi", "system.memory.usage") != null - findMetric("io.opentelemetry.instrumentation.oshi", "system.memory.utilization") != null - findMetric("io.opentelemetry.instrumentation.oshi", "system.network.errors") != null - findMetric("io.opentelemetry.instrumentation.oshi", "system.network.io") != null - findMetric("io.opentelemetry.instrumentation.oshi", "system.network.packets") != null + findMetric("io.opentelemetry.javaagent.shaded.instrumentation.oshi", "system.disk.io") != null + findMetric("io.opentelemetry.javaagent.shaded.instrumentation.oshi", "system.disk.operations") != null + findMetric("io.opentelemetry.javaagent.shaded.instrumentation.oshi", "system.memory.usage") != null + findMetric("io.opentelemetry.javaagent.shaded.instrumentation.oshi", "system.memory.utilization") != null + findMetric("io.opentelemetry.javaagent.shaded.instrumentation.oshi", "system.network.errors") != null + findMetric("io.opentelemetry.javaagent.shaded.instrumentation.oshi", "system.network.io") != null + findMetric("io.opentelemetry.javaagent.shaded.instrumentation.oshi", "system.network.packets") != null } def findMetric(instrumentationName, metricName) { diff --git a/instrumentation/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/ReactorInstrumentationModule.java b/instrumentation/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/ReactorInstrumentationModule.java index 9279c91327..f7f3eaaf07 100644 --- a/instrumentation/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/ReactorInstrumentationModule.java +++ b/instrumentation/reactor-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/reactor/ReactorInstrumentationModule.java @@ -26,11 +26,6 @@ public class ReactorInstrumentationModule extends InstrumentationModule { super("reactor", "reactor-3.1"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.reactor"); - } - @Override public List typeInstrumentations() { return singletonList(new HooksInstrumentation()); diff --git a/instrumentation/rocketmq-client-4.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmq/RocketMqInstrumentationModule.java b/instrumentation/rocketmq-client-4.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmq/RocketMqInstrumentationModule.java index 92849e2a2b..9b8aeead19 100644 --- a/instrumentation/rocketmq-client-4.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmq/RocketMqInstrumentationModule.java +++ b/instrumentation/rocketmq-client-4.8/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/rocketmq/RocketMqInstrumentationModule.java @@ -18,11 +18,6 @@ public class RocketMqInstrumentationModule extends InstrumentationModule { super("rocketmq-client", "rocketmq-client-4.8"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.rocketmq"); - } - @Override public List typeInstrumentations() { return asList(new RocketMqProducerInstrumentation(), new RocketMqConsumerInstrumentation()); diff --git a/instrumentation/rxjava-2.0/javaagent/src/main/java/io/opentelemetry/instrumentation/rxjava2/RxJava2InstrumentationModule.java b/instrumentation/rxjava-2.0/javaagent/src/main/java/io/opentelemetry/instrumentation/rxjava2/RxJava2InstrumentationModule.java index 135a0aa285..322fb59a17 100644 --- a/instrumentation/rxjava-2.0/javaagent/src/main/java/io/opentelemetry/instrumentation/rxjava2/RxJava2InstrumentationModule.java +++ b/instrumentation/rxjava-2.0/javaagent/src/main/java/io/opentelemetry/instrumentation/rxjava2/RxJava2InstrumentationModule.java @@ -27,11 +27,6 @@ public class RxJava2InstrumentationModule extends InstrumentationModule { super("rxjava2"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.rxjava2"); - } - @Override public List typeInstrumentations() { return Collections.singletonList(new PluginInstrumentation()); diff --git a/instrumentation/spring/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/client/WebfluxClientInstrumentationModule.java b/instrumentation/spring/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/client/WebfluxClientInstrumentationModule.java index f79f872325..9b25f2fda7 100644 --- a/instrumentation/spring/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/client/WebfluxClientInstrumentationModule.java +++ b/instrumentation/spring/spring-webflux-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/spring/webflux/client/WebfluxClientInstrumentationModule.java @@ -29,11 +29,6 @@ public class WebfluxClientInstrumentationModule extends InstrumentationModule { super("spring-webflux", "spring-webflux-5.0", "spring-webflux-client"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.spring.webflux.client"); - } - @Override public List typeInstrumentations() { return singletonList(new WebClientBuilderInstrumentation()); diff --git a/instrumentation/spring/spring-webmvc-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springwebmvc/SpringWebMvcInstrumentationModule.java b/instrumentation/spring/spring-webmvc-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springwebmvc/SpringWebMvcInstrumentationModule.java index f3fed6cd58..3c66f77f4e 100644 --- a/instrumentation/spring/spring-webmvc-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springwebmvc/SpringWebMvcInstrumentationModule.java +++ b/instrumentation/spring/spring-webmvc-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/springwebmvc/SpringWebMvcInstrumentationModule.java @@ -18,11 +18,6 @@ public class SpringWebMvcInstrumentationModule extends InstrumentationModule { super("spring-webmvc", "spring-webmvc-3.1"); } - @Override - public boolean isLibraryInstrumentationClass(String className) { - return className.startsWith("io.opentelemetry.instrumentation.spring.webmvc"); - } - @Override public List typeInstrumentations() { return asList( diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/InstrumentationModule.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/InstrumentationModule.java index d99ac3bded..dd9b5e888e 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/InstrumentationModule.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/InstrumentationModule.java @@ -5,9 +5,7 @@ package io.opentelemetry.javaagent.tooling; -import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.callWhenTrue; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.failSafe; -import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.ClassLoaderMatcher.hasAnyClassesNamed; import static java.util.Arrays.asList; import static net.bytebuddy.matcher.ElementMatchers.any; import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; @@ -31,7 +29,6 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Predicate; -import java.util.stream.Collectors; import net.bytebuddy.agent.builder.AgentBuilder; import net.bytebuddy.description.annotation.AnnotationSource; import net.bytebuddy.description.method.MethodDescription; @@ -133,8 +130,7 @@ public abstract class InstrumentationModule { return parentAgentBuilder; } - ElementMatcher.Junction moduleClassLoaderMatcher = - createModuleClassLoaderMatcher(helperClassNames); + ElementMatcher.Junction moduleClassLoaderMatcher = classLoaderMatcher(); MuzzleMatcher muzzleMatcher = new MuzzleMatcher(); HelperInjector helperInjector = new HelperInjector(mainInstrumentationName(), helperClassNames, helperResourceNames); @@ -179,40 +175,6 @@ public abstract class InstrumentationModule { return helperClassNames; } - /** - * Returns the matcher produced by {@link #classLoaderMatcher()} with an additional condition - * added: no library instrumentation classes defined by this module can be present in the - * application classloader. This disables the javaagent instrumentation if the library - * instrumentation is already used by the application. - */ - private ElementMatcher.Junction createModuleClassLoaderMatcher( - List helperClassNames) { - // TODO: optimization: refactor matcher caching, only the matcher returned by this method should - // cache results, the intermediary ones don't need to cache anything - // right now every matcher returned from ClassLoaderMatcher caches separately - // this will also make those "Skipping ..." logs appear less - - List libraryHelperClasses = - helperClassNames.stream() - .filter(this::isLibraryInstrumentationClass) - .collect(Collectors.toList()); - - if (libraryHelperClasses.isEmpty()) { - return classLoaderMatcher(); - } - - ElementMatcher.Junction libraryMatcher = - callWhenTrue( - hasAnyClassesNamed(libraryHelperClasses), this::logLibraryInstrumentationDetected); - return classLoaderMatcher().and(not(libraryMatcher)); - } - - private void logLibraryInstrumentationDetected() { - log.debug( - "Skipping instrumentation {} because library instrumentation was detected on classpath", - mainInstrumentationName()); - } - private AgentBuilder.Identified.Extendable applyInstrumentationTransformers( Map, String> transformers, AgentBuilder.Identified.Extendable agentBuilder) { @@ -296,8 +258,23 @@ public abstract class InstrumentationModule { * Java helper function here. */ @SuppressWarnings("unused") - protected final Predicate isLibraryInstrumentationClassPredicate() { - return this::isLibraryInstrumentationClass; + protected final Predicate additionalLibraryInstrumentationPackage() { + return this::isHelperClass; + } + + /** + * Instrumentation modules can override this method to specify additional packages (or classes) + * that should be treated as "library instrumentation" packages. Classes from those packages will + * be treated by muzzle as instrumentation helper classes: they will be scanned for references and + * automatically injected into the application classloader if they're used in any type + * instrumentation. The classes for which this predicate returns {@code true} will be treated as + * helper classes, in addition to the default ones defined in {@link + * InstrumentationClassPredicate}. + * + * @param className The name of the class that may or may not be a helper class. + */ + public boolean isHelperClass(String className) { + return false; } /** @@ -328,8 +305,8 @@ public abstract class InstrumentationModule { /** * Instrumentation modules can override this method to provide additional helper classes that are * not located in instrumentation packages described in {@link InstrumentationClassPredicate} and - * {@link #isLibraryInstrumentationClass(String)} (and not automatically detected by muzzle). - * These additional classes will be injected into the application classloader first. + * {@link #isHelperClass(String)} (and not automatically detected by muzzle). These additional + * classes will be injected into the application classloader first. */ protected String[] additionalHelperClassNames() { return EMPTY; @@ -365,26 +342,6 @@ public abstract class InstrumentationModule { return any(); } - /** - * Instrumentation modules that use existing library instrumentation should override this method - * to specify additional packages (or classes) that should be treated as "library instrumentation" - * packages/classes. - * - *

Classes marked as library instrumentation classes will be treated by muzzle as - * instrumentation helper classes: they will be scanned for references and automatically injected - * into the application classloader if they're used in any type instrumentation. - * - *

In addition to that, the javaagent will prevent the instrumentations from this module from - * being applied when it detects that the application classloader already contains one of the - * library classes. This behavior prevents interference between library and javaagent - * instrumentation (for example, duplicate telemetry). - * - * @param className The name of the class that may or may not be a library instrumentation class. - */ - public boolean isLibraryInstrumentationClass(String className) { - return false; - } - /** Returns a list of all individual type instrumentation in this module. */ public abstract List typeInstrumentations(); diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/AgentElementMatchers.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/AgentElementMatchers.java index ff035caf4c..3b1113911e 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/AgentElementMatchers.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/AgentElementMatchers.java @@ -92,10 +92,4 @@ public class AgentElementMatchers { } } } - - /** Execute {@code callback} action whenever decorated {@code matcher} returns true. */ - public static ElementMatcher.Junction callWhenTrue( - ElementMatcher matcher, Runnable callback) { - return new CallWhenTrueDecorator<>(matcher, callback); - } } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/CallWhenTrueDecorator.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/CallWhenTrueDecorator.java deleted file mode 100644 index 5e2316d6ec..0000000000 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/CallWhenTrueDecorator.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.tooling.bytebuddy.matcher; - -import net.bytebuddy.matcher.ElementMatcher; - -final class CallWhenTrueDecorator extends ElementMatcher.Junction.AbstractBase { - private final ElementMatcher delegate; - private final Runnable callback; - - CallWhenTrueDecorator(ElementMatcher delegate, Runnable callback) { - this.delegate = delegate; - this.callback = callback; - } - - @Override - public boolean matches(T target) { - if (delegate.matches(target)) { - callback.run(); - return true; - } - return false; - } -} diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/ClassLoaderMatcher.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/ClassLoaderMatcher.java index 9fb0221584..8ceab3931f 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/ClassLoaderMatcher.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/ClassLoaderMatcher.java @@ -5,13 +5,8 @@ package io.opentelemetry.javaagent.tooling.bytebuddy.matcher; -import static java.util.Arrays.asList; - import io.opentelemetry.instrumentation.api.caching.Cache; import io.opentelemetry.javaagent.instrumentation.api.internal.InClassLoaderMatcher; -import io.opentelemetry.javaagent.tooling.Utils; -import java.util.List; -import java.util.stream.Collectors; import net.bytebuddy.matcher.ElementMatcher; public final class ClassLoaderMatcher { @@ -24,40 +19,45 @@ public final class ClassLoaderMatcher { } /** - * Creates a matcher that checks if all of the passed classes are in the passed {@link - * ClassLoader}. If {@code classNames} is empty the matcher will always return {@code true}. - * - *

NOTICE: Does not match the bootstrap classpath. Don't use with classes expected to be on the + * NOTICE: Does not match the bootstrap classpath. Don't use with classes expected to be on the * bootstrap. + * + * @param classNames list of names to match. returns true if empty. + * @return true if class is available as a resource and not the bootstrap classloader. */ - public static ElementMatcher.Junction hasClassesNamed(String... classNames) { - return new ClassLoaderHasAllClassesNamedMatcher(asList(classNames)); + public static ElementMatcher.Junction.AbstractBase hasClassesNamed( + String... classNames) { + return new ClassLoaderHasClassesNamedMatcher(classNames); } - /** - * Creates a matcher that checks if any of the passed classes are in the passed {@link - * ClassLoader}. If {@code classNames} is empty the matcher will always return {@code false}. - * - *

NOTICE: Does not match the bootstrap classpath. Don't use with classes expected to be on the - * bootstrap. - */ - public static ElementMatcher.Junction hasAnyClassesNamed(List classNames) { - return new ClassLoaderHasAnyClassesNamedMatcher(classNames); - } - - private abstract static class AbstractClassLoaderMatcher + private static class ClassLoaderHasClassesNamedMatcher extends ElementMatcher.Junction.AbstractBase { private final Cache cache = Cache.newBuilder().setWeakKeys().setMaximumSize(25).build(); - protected final List resources; + private final String[] resources; - private AbstractClassLoaderMatcher(List classNames) { - resources = classNames.stream().map(Utils::getResourceName).collect(Collectors.toList()); + private ClassLoaderHasClassesNamedMatcher(String... classNames) { + resources = classNames; + for (int i = 0; i < resources.length; i++) { + resources[i] = resources[i].replace(".", "/") + ".class"; + } } - protected abstract boolean doMatch(ClassLoader cl); + private boolean hasResources(ClassLoader cl) { + boolean priorValue = InClassLoaderMatcher.getAndSet(true); + try { + for (String resource : resources) { + if (cl.getResource(resource) == null) { + return false; + } + } + } finally { + InClassLoaderMatcher.set(priorValue); + } + return true; + } @Override public boolean matches(ClassLoader cl) { @@ -67,48 +67,5 @@ public final class ClassLoaderMatcher { } return cache.computeIfAbsent(cl, this::hasResources); } - - private boolean hasResources(ClassLoader cl) { - boolean priorValue = InClassLoaderMatcher.getAndSet(true); - boolean value; - try { - value = doMatch(cl); - } finally { - InClassLoaderMatcher.set(priorValue); - } - return value; - } - } - - private static class ClassLoaderHasAllClassesNamedMatcher extends AbstractClassLoaderMatcher { - private ClassLoaderHasAllClassesNamedMatcher(List classNames) { - super(classNames); - } - - @Override - protected boolean doMatch(ClassLoader cl) { - for (String resource : resources) { - if (cl.getResource(resource) == null) { - return false; - } - } - return true; - } - } - - private static class ClassLoaderHasAnyClassesNamedMatcher extends AbstractClassLoaderMatcher { - private ClassLoaderHasAnyClassesNamedMatcher(List classNames) { - super(classNames); - } - - @Override - protected boolean doMatch(ClassLoader cl) { - for (String resource : resources) { - if (cl.getResource(resource) != null) { - return true; - } - } - return false; - } } } diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/InstrumentationClassPredicate.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/InstrumentationClassPredicate.java index 3fc5345370..2e825167ba 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/InstrumentationClassPredicate.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/InstrumentationClassPredicate.java @@ -14,9 +14,8 @@ public final class InstrumentationClassPredicate { private static final String JAVAAGENT_API_PACKAGE = "io.opentelemetry.javaagent.instrumentation.api."; - // library instrumentation packages + // library instrumentation packages (both shaded in the agent) private static final String LIBRARY_INSTRUMENTATION_PACKAGE = "io.opentelemetry.instrumentation."; - // note that instrumentation-api is shaded in the agent private static final String INSTRUMENTATION_API_PACKAGE = "io.opentelemetry.instrumentation.api."; private final Predicate additionalLibraryInstrumentationPredicate; diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/collector/MuzzleCodeGenerator.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/collector/MuzzleCodeGenerator.java index 038b9f7ff5..79c6aeb46a 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/collector/MuzzleCodeGenerator.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/collector/MuzzleCodeGenerator.java @@ -147,8 +147,7 @@ class MuzzleCodeGenerator implements AsmVisitorWrapper { .flatMap(typeInstrumentation -> typeInstrumentation.transformers().values().stream()) .collect(Collectors.toSet()); - ReferenceCollector collector = - new ReferenceCollector(instrumentationModule::isLibraryInstrumentationClass); + ReferenceCollector collector = new ReferenceCollector(instrumentationModule::isHelperClass); for (String adviceClass : adviceClassNames) { collector.collectReferencesFromAdvice(adviceClass); } @@ -207,7 +206,7 @@ class MuzzleCodeGenerator implements AsmVisitorWrapper { * new Reference[]{ * // reference builders * }, - * this.isLibraryInstrumentationClassPredicate()); + * this.additionalLibraryInstrumentationPackage()); * } * return this.muzzleReferenceMatcher; * } @@ -473,7 +472,7 @@ class MuzzleCodeGenerator implements AsmVisitorWrapper { mv.visitMethodInsn( Opcodes.INVOKEVIRTUAL, instrumentationClassName, - "isLibraryInstrumentationClassPredicate", + "additionalLibraryInstrumentationPackage", "()Ljava/util/function/Predicate;", false); diff --git a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/CallWhenTrueDecoratorTest.java b/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/CallWhenTrueDecoratorTest.java deleted file mode 100644 index fc76e74fea..0000000000 --- a/javaagent-tooling/src/test/java/io/opentelemetry/javaagent/tooling/bytebuddy/matcher/CallWhenTrueDecoratorTest.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.tooling.bytebuddy.matcher; - -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.BDDMockito.given; -import static org.mockito.BDDMockito.then; -import static org.mockito.Mockito.never; - -import net.bytebuddy.matcher.ElementMatcher; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -@ExtendWith(MockitoExtension.class) -class CallWhenTrueDecoratorTest { - @Mock ElementMatcher delegateMatcher; - @Mock Runnable callback; - - @Test - void shouldExecuteCallbackWhenMatcherReturnsTrue() { - // given - ElementMatcher matcher = new CallWhenTrueDecorator<>(delegateMatcher, callback); - - given(delegateMatcher.matches("true")).willReturn(true); - - // when - boolean result = matcher.matches("true"); - - // then - assertTrue(result); - then(callback).should().run(); - } - - @Test - void shouldNotExecuteCallbackWhenMatcherReturnsFalse() { - // given - ElementMatcher matcher = new CallWhenTrueDecorator<>(delegateMatcher, callback); - - // when - boolean result = matcher.matches("not really true"); - - // then - assertFalse(result); - then(callback).should(never()).run(); - } -} diff --git a/javaagent/javaagent.gradle b/javaagent/javaagent.gradle index 672b8b7f35..7d6082988f 100644 --- a/javaagent/javaagent.gradle +++ b/javaagent/javaagent.gradle @@ -87,7 +87,7 @@ tasks.withType(ShadowJar).configureEach { // rewrite dependencies calling Logger.getLogger relocate 'java.util.logging.Logger', 'io.opentelemetry.javaagent.bootstrap.PatchLogger' - // prevents conflict with library instrumentation, which uses its own instrumentation-api + // prevents conflict with library instrumentation relocate 'io.opentelemetry.instrumentation.api', 'io.opentelemetry.javaagent.shaded.instrumentation.api' // relocate OpenTelemetry API diff --git a/testing/agent-exporter/agent-exporter.gradle b/testing/agent-exporter/agent-exporter.gradle index 47c7429a81..30222081dd 100644 --- a/testing/agent-exporter/agent-exporter.gradle +++ b/testing/agent-exporter/agent-exporter.gradle @@ -43,12 +43,12 @@ shadowJar { // Prevents conflict with other SLF4J instances. Important for premain. relocate 'org.slf4j', 'io.opentelemetry.javaagent.slf4j' + // rewrite library instrumentation dependencies + relocate "io.opentelemetry.instrumentation", "io.opentelemetry.javaagent.shaded.instrumentation" + // rewrite dependencies calling Logger.getLogger relocate 'java.util.logging.Logger', 'io.opentelemetry.javaagent.bootstrap.PatchLogger' - // prevents conflict with library instrumentation, which uses its own instrumentation-api - relocate 'io.opentelemetry.instrumentation.api', 'io.opentelemetry.javaagent.shaded.instrumentation.api' - // relocate OpenTelemetry API usage relocate "io.opentelemetry.api", "io.opentelemetry.javaagent.shaded.io.opentelemetry.api" relocate "io.opentelemetry.semconv", "io.opentelemetry.javaagent.shaded.io.opentelemetry.semconv" diff --git a/testing/agent-for-testing/agent-for-testing.gradle b/testing/agent-for-testing/agent-for-testing.gradle index bc5cfcb175..2386d361c0 100644 --- a/testing/agent-for-testing/agent-for-testing.gradle +++ b/testing/agent-for-testing/agent-for-testing.gradle @@ -59,7 +59,7 @@ shadowJar { // rewrite dependencies calling Logger.getLogger relocate 'java.util.logging.Logger', 'io.opentelemetry.javaagent.bootstrap.PatchLogger' - // prevents conflict with library instrumentation, which uses its own instrumentation-api + // prevents conflict with library instrumentation relocate 'io.opentelemetry.instrumentation.api', 'io.opentelemetry.javaagent.shaded.instrumentation.api' // relocate OpenTelemetry API