From 9926288342841702205a4add941f997c365bec37 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Wed, 7 Apr 2021 00:03:24 -0700 Subject: [PATCH] Clarify empty type instrumentations (#2740) * Add comment for EmptyTypeInstrumentation * Clarify use of empty type instrumentations --- .../v2_7/DubboInstrumentation.java | 27 ---------------- .../v2_7/DubboInstrumentationModule.java | 20 +++++++++++- .../AwsSdkInitializationInstrumentation.java | 31 ------------------- .../v2_2/AwsSdkInstrumentationModule.java | 23 +++++++++++++- .../v2_13_2/Log4j2InstrumentationModule.java | 13 ++++---- 5 files changed, 48 insertions(+), 66 deletions(-) delete mode 100644 instrumentation/apache-dubbo/apache-dubbo-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachedubbo/v2_7/DubboInstrumentation.java delete mode 100644 instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkInitializationInstrumentation.java diff --git a/instrumentation/apache-dubbo/apache-dubbo-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachedubbo/v2_7/DubboInstrumentation.java b/instrumentation/apache-dubbo/apache-dubbo-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachedubbo/v2_7/DubboInstrumentation.java deleted file mode 100644 index d2064655ee..0000000000 --- a/instrumentation/apache-dubbo/apache-dubbo-2.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachedubbo/v2_7/DubboInstrumentation.java +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.apachedubbo.v2_7; - -import static net.bytebuddy.matcher.ElementMatchers.named; - -import io.opentelemetry.javaagent.tooling.TypeInstrumentation; -import java.util.Collections; -import java.util.Map; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -public class DubboInstrumentation implements TypeInstrumentation { - @Override - public ElementMatcher typeMatcher() { - return named("org.apache.dubbo.common.extension.ExtensionLoader"); - } - - @Override - public Map, String> transformers() { - return Collections.emptyMap(); - } -} 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 f9282b7ce6..7c0aa27c75 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 @@ -6,12 +6,16 @@ package io.opentelemetry.javaagent.instrumentation.apachedubbo.v2_7; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.ClassLoaderMatcher.hasClassesNamed; +import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.tooling.InstrumentationModule; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Collections; import java.util.List; +import java.util.Map; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) @@ -34,6 +38,20 @@ public class DubboInstrumentationModule extends InstrumentationModule { @Override public List typeInstrumentations() { - return Collections.singletonList(new DubboInstrumentation()); + return Collections.singletonList(new ResourceInjectingTypeInstrumentation()); + } + + // A type instrumentation is needed to trigger resource injection. + public static class ResourceInjectingTypeInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return named("org.apache.dubbo.common.extension.ExtensionLoader"); + } + + @Override + public Map, String> transformers() { + // Nothing to transform, this type instrumentation is only used for injecting resources. + return Collections.emptyMap(); + } } } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkInitializationInstrumentation.java b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkInitializationInstrumentation.java deleted file mode 100644 index 1062130f6b..0000000000 --- a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/awssdk/v2_2/AwsSdkInitializationInstrumentation.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.awssdk.v2_2; - -import static net.bytebuddy.matcher.ElementMatchers.named; - -import io.opentelemetry.javaagent.tooling.TypeInstrumentation; -import java.util.Collections; -import java.util.Map; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -public class AwsSdkInitializationInstrumentation implements TypeInstrumentation { - @Override - public ElementMatcher typeMatcher() { - // This is essentially the entry point of the AWS SDK, all clients implement it. We can ensure - // our interceptor service definition is injected as early as possible if we typematch against - // it. - return named("software.amazon.awssdk.core.SdkClient"); - } - - @Override - public Map, String> transformers() { - // Don't need to transform, just want to make sure helpers are injected as early as possible. - return Collections.emptyMap(); - } -} 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 8485d031b3..bc60a27015 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 @@ -6,12 +6,16 @@ package io.opentelemetry.javaagent.instrumentation.awssdk.v2_2; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.ClassLoaderMatcher.hasClassesNamed; +import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.tooling.InstrumentationModule; import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Collections; import java.util.List; +import java.util.Map; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) @@ -45,6 +49,23 @@ public class AwsSdkInstrumentationModule extends InstrumentationModule { @Override public List typeInstrumentations() { - return Collections.singletonList(new AwsSdkInitializationInstrumentation()); + return Collections.singletonList(new ResourceInjectingTypeInstrumentation()); + } + + // A type instrumentation is needed to trigger resource injection. + public static class ResourceInjectingTypeInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + // This is essentially the entry point of the AWS SDK, all clients implement it. We can ensure + // our interceptor service definition is injected as early as possible if we typematch against + // it. + return named("software.amazon.awssdk.core.SdkClient"); + } + + @Override + public Map, String> transformers() { + // Nothing to transform, this type instrumentation is only used for injecting resources. + return Collections.emptyMap(); + } } } 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 5fe0c77330..a6fb10f59e 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 @@ -39,23 +39,24 @@ public class Log4j2InstrumentationModule extends InstrumentationModule { @Override public List typeInstrumentations() { - return Arrays.asList(new BugFixingInstrumentation(), new EmptyTypeInstrumentation()); + return Arrays.asList( + new BugFixingInstrumentation(), new ResourceInjectingTypeInstrumentation()); } - public static class EmptyTypeInstrumentation implements TypeInstrumentation { + // A type instrumentation is needed to trigger resource injection. + public static class ResourceInjectingTypeInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { // we cannot use ContextDataProvider here because one of the classes that we inject implements // this interface, causing the interface to be loaded while it's being transformed, which - // leads - // to duplicate class definition error after the interface is transformed and the triggering - // class loader tries to load it. + // leads to duplicate class definition error after the interface is transformed and the + // triggering class loader tries to load it. return named("org.apache.logging.log4j.core.impl.ThreadContextDataInjector"); } @Override public Map, String> transformers() { - // Nothing to instrument, no methods to match + // Nothing to transform, this type instrumentation is only used for injecting resources. return emptyMap(); } }