From 0e83a5b56d4ea599930694f6bde386729b0f6941 Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Mon, 9 Nov 2020 23:41:37 +0100 Subject: [PATCH] Refactor Instrumenters into InstrumentationModules - J (#1562) --- .../ClassLoaderInstrumentation.java | 14 +-- .../ClassLoaderInstrumentationModule.java | 30 +++++++ .../ResourceInjectionInstrumentation.java | 10 +-- .../AbstractExecutorInstrumentation.java | 11 +-- .../CallableInstrumentation.java | 16 +--- .../javaconcurrent/FutureInstrumentation.java | 16 +--- .../JavaConcurrentInstrumentationModule.java | 47 ++++++++++ .../JavaExecutorInstrumentation.java | 16 +--- .../JavaForkJoinTaskInstrumentation.java | 21 +---- .../NonStandardExecutorInstrumentation.java | 42 --------- ...tandardExecutorsInstrumentationModule.java | 52 +++++++++++ .../RunnableInstrumentation.java | 16 +--- .../httpclient/HttpClientInstrumentation.java | 21 +---- .../HttpClientInstrumentationModule.java | 34 ++++++++ .../HttpHeadersInstrumentation.java | 17 +--- ... => JaxRsClientInstrumentationModule.java} | 52 ++++++----- ...=> JerseyClientInstrumentationModule.java} | 47 ++++++---- ... ResteasyClientInstrumentationModule.java} | 41 +++++---- ... => JaxRsClientInstrumentationModule.java} | 48 ++++++---- .../v1_0/JaxRsAnnotationsInstrumentation.java | 26 +----- .../v1_0/JaxRsInstrumentationModule.java | 43 +++++++++ ...AbstractRequestContextInstrumentation.java | 66 +------------- ...ContainerRequestFilterInstrumentation.java | 10 +-- .../DefaultRequestContextInstrumentation.java | 12 +-- .../v2_0/JaxRsAnnotationsInstrumentation.java | 25 +----- .../JaxRsAsyncResponseInstrumentation.java | 25 +----- .../v2_0/JaxRsInstrumentationModule.java | 56 ++++++++++++ .../jaxrs/v2_0/RequestContextHelper.java | 56 ++++++++++++ .../v2_0/JerseyInstrumentationModule.java | 34 ++++++++ .../JerseyRequestContextInstrumentation.java | 14 +-- .../v2_0/Resteasy30InstrumentationModule.java | 34 ++++++++ ...steasy30RequestContextInstrumentation.java | 14 +-- .../v2_0/Resteasy31InstrumentationModule.java | 34 ++++++++ ...steasy31RequestContextInstrumentation.java | 14 +-- .../jdbc/ConnectionInstrumentation.java | 40 +-------- .../jdbc/DriverInstrumentation.java | 38 +------- ... JdbcDataSourceInstrumentationModule.java} | 36 +++++--- .../jdbc/JdbcInstrumentationModule.java | 58 +++++++++++++ .../PreparedStatementInstrumentation.java | 40 +-------- .../jdbc/StatementInstrumentation.java | 40 +-------- ...n.java => JedisInstrumentationModule.java} | 65 ++++++++------ ...n.java => JedisInstrumentationModule.java} | 47 ++++++---- .../jetty/JettyHandlerInstrumentation.java | 76 ---------------- .../jetty/JettyInstrumentationModule.java | 87 +++++++++++++++++++ .../JMSMessageConsumerInstrumentation.java | 28 +----- .../JMSMessageListenerInstrumentation.java | 20 +---- .../JMSMessageProducerInstrumentation.java | 20 +---- .../jms/JMSSessionInstrumentation.java | 27 +----- .../jms/JmsInstrumentationModule.java | 46 ++++++++++ ...n.java => HttpJspPageInstrumentation.java} | 19 +--- ...JspCompilationContextInstrumentation.java} | 20 +---- .../jsp/JspInstrumentationModule.java | 32 +++++++ 52 files changed, 934 insertions(+), 819 deletions(-) create mode 100644 instrumentation/java-classloader/src/main/java/io/opentelemetry/javaagent/instrumentation/javaclassloader/ClassLoaderInstrumentationModule.java create mode 100644 instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/JavaConcurrentInstrumentationModule.java delete mode 100644 instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/NonStandardExecutorInstrumentation.java create mode 100644 instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/NonStandardExecutorsInstrumentationModule.java create mode 100644 instrumentation/java-httpclient/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpClientInstrumentationModule.java rename instrumentation/jaxrs-client/jaxrs-client-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v1_1/{JaxRsClientV1Instrumentation.java => JaxRsClientInstrumentationModule.java} (66%) rename instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-jersey-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/{JerseyClientConnectionErrorInstrumentation.java => JerseyClientInstrumentationModule.java} (73%) rename instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-resteasy-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/{ResteasyClientConnectionErrorInstrumentation.java => ResteasyClientInstrumentationModule.java} (67%) rename instrumentation/jaxrs-client/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/{JaxRsClientInstrumentation.java => JaxRsClientInstrumentationModule.java} (58%) create mode 100644 instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxRsInstrumentationModule.java create mode 100644 instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxRsInstrumentationModule.java create mode 100644 instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/RequestContextHelper.java create mode 100644 instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-jersey-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JerseyInstrumentationModule.java create mode 100644 instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy30InstrumentationModule.java create mode 100644 instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy31InstrumentationModule.java rename instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/{DataSourceInstrumentation.java => JdbcDataSourceInstrumentationModule.java} (78%) create mode 100644 instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcInstrumentationModule.java rename instrumentation/jedis/jedis-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/{JedisInstrumentation.java => JedisInstrumentationModule.java} (69%) rename instrumentation/jedis/jedis-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/{JedisInstrumentation.java => JedisInstrumentationModule.java} (64%) delete mode 100644 instrumentation/jetty-8.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/JettyHandlerInstrumentation.java create mode 100644 instrumentation/jetty-8.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/JettyInstrumentationModule.java create mode 100644 instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JmsInstrumentationModule.java rename instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/{JSPInstrumentation.java => HttpJspPageInstrumentation.java} (85%) rename instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/{JasperJSPCompilationContextInstrumentation.java => JspCompilationContextInstrumentation.java} (80%) create mode 100644 instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspInstrumentationModule.java diff --git a/instrumentation/java-classloader/src/main/java/io/opentelemetry/javaagent/instrumentation/javaclassloader/ClassLoaderInstrumentation.java b/instrumentation/java-classloader/src/main/java/io/opentelemetry/javaagent/instrumentation/javaclassloader/ClassLoaderInstrumentation.java index e46edfbd83..db7473f818 100644 --- a/instrumentation/java-classloader/src/main/java/io/opentelemetry/javaagent/instrumentation/javaclassloader/ClassLoaderInstrumentation.java +++ b/instrumentation/java-classloader/src/main/java/io/opentelemetry/javaagent/instrumentation/javaclassloader/ClassLoaderInstrumentation.java @@ -17,10 +17,9 @@ import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.instrumentation.api.CallDepthThreadLocalMap; import io.opentelemetry.javaagent.tooling.Constants; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.method.MethodDescription; @@ -37,11 +36,7 @@ import net.bytebuddy.matcher.ElementMatcher; * This instrumentation forces all class loaders to delegate to the bootstrap class loader * for the classes that we have put in the bootstrap class loader. */ -@AutoService(Instrumenter.class) -public final class ClassLoaderInstrumentation extends Instrumenter.Default { - public ClassLoaderInstrumentation() { - super("class-loader"); - } +final class ClassLoaderInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { @@ -54,11 +49,6 @@ public final class ClassLoaderInstrumentation extends Instrumenter.Default { .and(extendsClass(named("java.lang.ClassLoader"))); } - @Override - public String[] helperClassNames() { - return new String[] {Constants.class.getName()}; - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/instrumentation/java-classloader/src/main/java/io/opentelemetry/javaagent/instrumentation/javaclassloader/ClassLoaderInstrumentationModule.java b/instrumentation/java-classloader/src/main/java/io/opentelemetry/javaagent/instrumentation/javaclassloader/ClassLoaderInstrumentationModule.java new file mode 100644 index 0000000000..629473bdc0 --- /dev/null +++ b/instrumentation/java-classloader/src/main/java/io/opentelemetry/javaagent/instrumentation/javaclassloader/ClassLoaderInstrumentationModule.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.javaclassloader; + +import static java.util.Arrays.asList; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; + +@AutoService(InstrumentationModule.class) +public class ClassLoaderInstrumentationModule extends InstrumentationModule { + public ClassLoaderInstrumentationModule() { + super("class-loader"); + } + + @Override + public String[] helperClassNames() { + return new String[] {"io.opentelemetry.javaagent.tooling.Constants"}; + } + + @Override + public List typeInstrumentations() { + return asList(new ClassLoaderInstrumentation(), new ResourceInjectionInstrumentation()); + } +} diff --git a/instrumentation/java-classloader/src/main/java/io/opentelemetry/javaagent/instrumentation/javaclassloader/ResourceInjectionInstrumentation.java b/instrumentation/java-classloader/src/main/java/io/opentelemetry/javaagent/instrumentation/javaclassloader/ResourceInjectionInstrumentation.java index 403622d07a..c306c18b47 100644 --- a/instrumentation/java-classloader/src/main/java/io/opentelemetry/javaagent/instrumentation/javaclassloader/ResourceInjectionInstrumentation.java +++ b/instrumentation/java-classloader/src/main/java/io/opentelemetry/javaagent/instrumentation/javaclassloader/ResourceInjectionInstrumentation.java @@ -10,9 +10,8 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.bootstrap.HelperResources; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.net.URL; import java.util.Collections; import java.util.Enumeration; @@ -30,12 +29,7 @@ import net.bytebuddy.matcher.ElementMatcher; *

We currently only intercept {@link ClassLoader#getResources(String)} because this is the case * we are currently always interested in, where it's used for service loading. */ -@AutoService(Instrumenter.class) -public class ResourceInjectionInstrumentation extends Instrumenter.Default { - - public ResourceInjectionInstrumentation() { - super("class-loader"); - } +class ResourceInjectionInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/AbstractExecutorInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/AbstractExecutorInstrumentation.java index 59fd6ece82..4007258bf9 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/AbstractExecutorInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/AbstractExecutorInstrumentation.java @@ -10,7 +10,7 @@ import static net.bytebuddy.matcher.ElementMatchers.any; import static net.bytebuddy.matcher.ElementMatchers.named; import io.opentelemetry.instrumentation.api.config.Config; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -22,12 +22,9 @@ import net.bytebuddy.matcher.ElementMatcher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public abstract class AbstractExecutorInstrumentation extends Instrumenter.Default { - +abstract class AbstractExecutorInstrumentation implements TypeInstrumentation { private static final Logger log = LoggerFactory.getLogger(AbstractExecutorInstrumentation.class); - public static final String EXEC_NAME = "java_concurrent"; - private static final String TRACE_EXECUTORS_CONFIG = "otel.trace.executors"; private final boolean TRACE_ALL_EXECUTORS = Config.get().getBooleanProperty("otel.trace.executors.all", false); @@ -45,9 +42,7 @@ public abstract class AbstractExecutorInstrumentation extends Instrumenter.Defau */ private final Collection ALLOWED_EXECUTORS_PREFIXES; - public AbstractExecutorInstrumentation(String... additionalNames) { - super(EXEC_NAME, additionalNames); - + AbstractExecutorInstrumentation() { if (TRACE_ALL_EXECUTORS) { log.info("Tracing all executors enabled."); ALLOWED_EXECUTORS = Collections.emptyList(); diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/CallableInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/CallableInstrumentation.java index e8f2c261ba..7f9dc0b3c6 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/CallableInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/CallableInstrumentation.java @@ -11,13 +11,12 @@ import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import com.google.auto.service.AutoService; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext; import io.opentelemetry.javaagent.instrumentation.api.concurrent.AdviceUtils; import io.opentelemetry.javaagent.instrumentation.api.concurrent.State; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; import java.util.concurrent.Callable; import net.bytebuddy.asm.Advice; @@ -25,24 +24,13 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -/** Instrument {@link Runnable} and {@link Callable} */ -@AutoService(Instrumenter.class) -public final class CallableInstrumentation extends Instrumenter.Default { - - public CallableInstrumentation() { - super(AbstractExecutorInstrumentation.EXEC_NAME); - } +final class CallableInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { return implementsInterface(named(Callable.class.getName())); } - @Override - public Map contextStore() { - return singletonMap(Callable.class.getName(), State.class.getName()); - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/FutureInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/FutureInstrumentation.java index ca11f4e0d4..4207169919 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/FutureInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/FutureInstrumentation.java @@ -10,11 +10,10 @@ import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.returns; -import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext; import io.opentelemetry.javaagent.instrumentation.api.concurrent.State; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Arrays; import java.util.Collection; import java.util.Collections; @@ -28,9 +27,7 @@ import net.bytebuddy.matcher.ElementMatcher; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -@AutoService(Instrumenter.class) -public final class FutureInstrumentation extends Instrumenter.Default { - +final class FutureInstrumentation implements TypeInstrumentation { private static final Logger log = LoggerFactory.getLogger(FutureInstrumentation.class); /** @@ -76,10 +73,6 @@ public final class FutureInstrumentation extends Instrumenter.Default { ALLOWED_FUTURES = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(allowed))); } - public FutureInstrumentation() { - super(AbstractExecutorInstrumentation.EXEC_NAME); - } - @Override public ElementMatcher typeMatcher() { final ElementMatcher.Junction hasFutureInterfaceMatcher = @@ -96,11 +89,6 @@ public final class FutureInstrumentation extends Instrumenter.Default { }.and(hasFutureInterfaceMatcher); // Apply expensive matcher last. } - @Override - public Map contextStore() { - return singletonMap(Future.class.getName(), State.class.getName()); - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/JavaConcurrentInstrumentationModule.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/JavaConcurrentInstrumentationModule.java new file mode 100644 index 0000000000..37bc28628f --- /dev/null +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/JavaConcurrentInstrumentationModule.java @@ -0,0 +1,47 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.javaconcurrent; + +import static java.util.Arrays.asList; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.instrumentation.api.concurrent.State; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; +import java.util.concurrent.ForkJoinTask; +import java.util.concurrent.Future; + +@AutoService(InstrumentationModule.class) +public class JavaConcurrentInstrumentationModule extends InstrumentationModule { + public JavaConcurrentInstrumentationModule() { + super("java_concurrent"); + } + + @Override + public List typeInstrumentations() { + return asList( + new CallableInstrumentation(), + new FutureInstrumentation(), + new JavaExecutorInstrumentation(), + new JavaForkJoinTaskInstrumentation(), + new RunnableInstrumentation()); + } + + @Override + public Map contextStore() { + Map map = new HashMap<>(); + map.put(Callable.class.getName(), State.class.getName()); + map.put(ForkJoinTask.class.getName(), State.class.getName()); + map.put(Future.class.getName(), State.class.getName()); + map.put(Runnable.class.getName(), State.class.getName()); + return Collections.unmodifiableMap(map); + } +} diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/JavaExecutorInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/JavaExecutorInstrumentation.java index 5a6905ee07..13440ff002 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/JavaExecutorInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/JavaExecutorInstrumentation.java @@ -10,7 +10,6 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext; import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; @@ -18,10 +17,8 @@ import io.opentelemetry.javaagent.instrumentation.api.concurrent.CallableWrapper import io.opentelemetry.javaagent.instrumentation.api.concurrent.ExecutorInstrumentationUtils; import io.opentelemetry.javaagent.instrumentation.api.concurrent.RunnableWrapper; import io.opentelemetry.javaagent.instrumentation.api.concurrent.State; -import io.opentelemetry.javaagent.tooling.Instrumenter; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.concurrent.Callable; @@ -31,18 +28,7 @@ import net.bytebuddy.asm.Advice; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class JavaExecutorInstrumentation extends AbstractExecutorInstrumentation { - - @Override - public Map contextStore() { - Map map = new HashMap<>(); - map.put(Runnable.class.getName(), State.class.getName()); - map.put(Callable.class.getName(), State.class.getName()); - map.put(ForkJoinTask.class.getName(), State.class.getName()); - map.put(Future.class.getName(), State.class.getName()); - return Collections.unmodifiableMap(map); - } +final class JavaExecutorInstrumentation extends AbstractExecutorInstrumentation { @Override public Map, String> transformers() { diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/JavaForkJoinTaskInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/JavaForkJoinTaskInstrumentation.java index 4870e67fe8..6a2e6a73bf 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/JavaForkJoinTaskInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/JavaForkJoinTaskInstrumentation.java @@ -12,15 +12,12 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import com.google.auto.service.AutoService; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext; import io.opentelemetry.javaagent.instrumentation.api.concurrent.AdviceUtils; import io.opentelemetry.javaagent.instrumentation.api.concurrent.State; -import io.opentelemetry.javaagent.tooling.Instrumenter; -import java.util.Collections; -import java.util.HashMap; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; import java.util.concurrent.Callable; import java.util.concurrent.ForkJoinPool; @@ -36,27 +33,13 @@ import net.bytebuddy.matcher.ElementMatcher; *

Note: There are quite a few separate implementations of {@code ForkJoinTask}/{@code * ForkJoinPool}: JVM, Akka, Scala, Netty to name a few. This class handles JVM version. */ -@AutoService(Instrumenter.class) -public final class JavaForkJoinTaskInstrumentation extends Instrumenter.Default { - - public JavaForkJoinTaskInstrumentation() { - super(AbstractExecutorInstrumentation.EXEC_NAME); - } +final class JavaForkJoinTaskInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { return extendsClass(named(ForkJoinTask.class.getName())); } - @Override - public Map contextStore() { - Map map = new HashMap<>(); - map.put(Runnable.class.getName(), State.class.getName()); - map.put(Callable.class.getName(), State.class.getName()); - map.put(ForkJoinTask.class.getName(), State.class.getName()); - return Collections.unmodifiableMap(map); - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/NonStandardExecutorInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/NonStandardExecutorInstrumentation.java deleted file mode 100644 index f7b2c35ce9..0000000000 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/NonStandardExecutorInstrumentation.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.javaconcurrent; - -import static java.util.Collections.singletonMap; -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import static net.bytebuddy.matcher.ElementMatchers.takesArguments; - -import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.instrumentation.api.concurrent.State; -import io.opentelemetry.javaagent.tooling.Instrumenter; -import java.util.HashMap; -import java.util.Map; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.matcher.ElementMatcher; - -@AutoService(Instrumenter.class) -public final class NonStandardExecutorInstrumentation extends AbstractExecutorInstrumentation { - - public NonStandardExecutorInstrumentation() { - super(EXEC_NAME + ".other"); - } - - @Override - public Map contextStore() { - return singletonMap(Runnable.class.getName(), State.class.getName()); - } - - @Override - public Map, String> transformers() { - Map, String> transformers = new HashMap<>(); - - transformers.put( // org.eclipse.jetty.util.thread.QueuedThreadPool - named("dispatch").and(takesArguments(1)).and(takesArgument(0, Runnable.class)), - JavaExecutorInstrumentation.class.getName() + "$SetExecuteRunnableStateAdvice"); - return transformers; - } -} diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/NonStandardExecutorsInstrumentationModule.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/NonStandardExecutorsInstrumentationModule.java new file mode 100644 index 0000000000..4920c0d441 --- /dev/null +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/NonStandardExecutorsInstrumentationModule.java @@ -0,0 +1,52 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.javaconcurrent; + +import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; +import static net.bytebuddy.matcher.ElementMatchers.takesArguments; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.instrumentation.api.concurrent.State; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.matcher.ElementMatcher; + +@AutoService(InstrumentationModule.class) +public final class NonStandardExecutorsInstrumentationModule extends InstrumentationModule { + + public NonStandardExecutorsInstrumentationModule() { + super("java_concurrent.other"); + } + + @Override + public List typeInstrumentations() { + return singletonList(new OtherExecutorsInstrumentation()); + } + + @Override + public Map contextStore() { + return singletonMap(Runnable.class.getName(), State.class.getName()); + } + + private static final class OtherExecutorsInstrumentation extends AbstractExecutorInstrumentation { + @Override + public Map, String> transformers() { + Map, String> transformers = new HashMap<>(); + + transformers.put( // org.eclipse.jetty.util.thread.QueuedThreadPool + named("dispatch").and(takesArguments(1)).and(takesArgument(0, Runnable.class)), + JavaExecutorInstrumentation.class.getName() + "$SetExecuteRunnableStateAdvice"); + return transformers; + } + } +} diff --git a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/RunnableInstrumentation.java b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/RunnableInstrumentation.java index 9533065a56..cd80dcdc9a 100644 --- a/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/RunnableInstrumentation.java +++ b/instrumentation/java-concurrent/src/main/java/io/opentelemetry/javaagent/instrumentation/javaconcurrent/RunnableInstrumentation.java @@ -11,37 +11,25 @@ import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import com.google.auto.service.AutoService; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext; import io.opentelemetry.javaagent.instrumentation.api.concurrent.AdviceUtils; import io.opentelemetry.javaagent.instrumentation.api.concurrent.State; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -/** Instrument {@link Runnable} and {@Callable} */ -@AutoService(Instrumenter.class) -public final class RunnableInstrumentation extends Instrumenter.Default { - - public RunnableInstrumentation() { - super(AbstractExecutorInstrumentation.EXEC_NAME); - } +final class RunnableInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { return implementsInterface(named(Runnable.class.getName())); } - @Override - public Map contextStore() { - return singletonMap(Runnable.class.getName(), State.class.getName()); - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/instrumentation/java-httpclient/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpClientInstrumentation.java b/instrumentation/java-httpclient/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpClientInstrumentation.java index aef445762d..8051ab61f9 100644 --- a/instrumentation/java-httpclient/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpClientInstrumentation.java +++ b/instrumentation/java-httpclient/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpClientInstrumentation.java @@ -16,11 +16,10 @@ import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.CallDepthThreadLocalMap.Depth; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.util.HashMap; @@ -31,12 +30,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public class HttpClientInstrumentation extends Instrumenter.Default { - - public HttpClientInstrumentation() { - super("httpclient"); - } +final class HttpClientInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -52,15 +46,6 @@ public class HttpClientInstrumentation extends Instrumenter.Default { .and(extendsClass(named("java.net.http.HttpClient"))); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".HttpHeadersInjectAdapter", - packageName + ".JdkHttpClientTracer", - packageName + ".ResponseConsumer" - }; - } - @Override public Map, String> transformers() { Map, String> transformers = new HashMap<>(); @@ -103,7 +88,7 @@ public class HttpClientInstrumentation extends Instrumenter.Default { @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void methodExit( - @Advice.Return HttpResponse result, + @Advice.Return HttpResponse result, @Advice.Thrown Throwable throwable, @Advice.Local("otelSpan") Span span, @Advice.Local("otelScope") Scope scope, diff --git a/instrumentation/java-httpclient/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpClientInstrumentationModule.java b/instrumentation/java-httpclient/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpClientInstrumentationModule.java new file mode 100644 index 0000000000..4df192b883 --- /dev/null +++ b/instrumentation/java-httpclient/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpClientInstrumentationModule.java @@ -0,0 +1,34 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.httpclient; + +import static java.util.Arrays.asList; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; + +@AutoService(InstrumentationModule.class) +public class HttpClientInstrumentationModule extends InstrumentationModule { + public HttpClientInstrumentationModule() { + super("httpclient"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + packageName + ".HttpHeadersInjectAdapter", + packageName + ".JdkHttpClientTracer", + packageName + ".ResponseConsumer" + }; + } + + @Override + public List typeInstrumentations() { + return asList(new HttpClientInstrumentation(), new HttpHeadersInstrumentation()); + } +} diff --git a/instrumentation/java-httpclient/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpHeadersInstrumentation.java b/instrumentation/java-httpclient/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpHeadersInstrumentation.java index ead235e0dc..567149d806 100644 --- a/instrumentation/java-httpclient/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpHeadersInstrumentation.java +++ b/instrumentation/java-httpclient/src/main/java/io/opentelemetry/javaagent/instrumentation/httpclient/HttpHeadersInstrumentation.java @@ -12,9 +12,8 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; -import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.net.http.HttpHeaders; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -22,12 +21,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public class HttpHeadersInstrumentation extends Instrumenter.Default { - - public HttpHeadersInstrumentation() { - super("httpclient"); - } +final class HttpHeadersInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { @@ -36,13 +30,6 @@ public class HttpHeadersInstrumentation extends Instrumenter.Default { .and(extendsClass(named("java.net.http.HttpRequest"))); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".HttpHeadersInjectAdapter", packageName + ".JdkHttpClientTracer" - }; - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/instrumentation/jaxrs-client/jaxrs-client-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v1_1/JaxRsClientV1Instrumentation.java b/instrumentation/jaxrs-client/jaxrs-client-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v1_1/JaxRsClientInstrumentationModule.java similarity index 66% rename from instrumentation/jaxrs-client/jaxrs-client-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v1_1/JaxRsClientV1Instrumentation.java rename to instrumentation/jaxrs-client/jaxrs-client-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v1_1/JaxRsClientInstrumentationModule.java index eaed90cc3a..5f65a0be85 100644 --- a/instrumentation/jaxrs-client/jaxrs-client-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v1_1/JaxRsClientV1Instrumentation.java +++ b/instrumentation/jaxrs-client/jaxrs-client-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v1_1/JaxRsClientInstrumentationModule.java @@ -10,6 +10,7 @@ import static io.opentelemetry.javaagent.instrumentation.jaxrsclient.v1_1.JaxRsC import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; +import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.returns; @@ -21,31 +22,22 @@ import com.sun.jersey.api.client.ClientRequest; import com.sun.jersey.api.client.ClientResponse; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; import java.util.Map; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class JaxRsClientV1Instrumentation extends Instrumenter.Default { +@AutoService(InstrumentationModule.class) +public final class JaxRsClientInstrumentationModule extends InstrumentationModule { - public JaxRsClientV1Instrumentation() { + public JaxRsClientInstrumentationModule() { super("jax-rs", "jaxrs", "jax-rs-client"); } - @Override - public ElementMatcher classLoaderMatcher() { - // Optimization for expensive typeMatcher. - return hasClassesNamed("com.sun.jersey.api.client.ClientHandler"); - } - - @Override - public ElementMatcher typeMatcher() { - return implementsInterface(named("com.sun.jersey.api.client.ClientHandler")); - } - @Override public String[] helperClassNames() { return new String[] { @@ -54,12 +46,30 @@ public final class JaxRsClientV1Instrumentation extends Instrumenter.Default { } @Override - public Map, String> transformers() { - return singletonMap( - named("handle") - .and(takesArgument(0, extendsClass(named("com.sun.jersey.api.client.ClientRequest")))) - .and(returns(extendsClass(named("com.sun.jersey.api.client.ClientResponse")))), - JaxRsClientV1Instrumentation.class.getName() + "$HandleAdvice"); + public List typeInstrumentations() { + return singletonList(new ClientHandlerInstrumentation()); + } + + private static final class ClientHandlerInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return hasClassesNamed("com.sun.jersey.api.client.ClientHandler"); + } + + @Override + public ElementMatcher typeMatcher() { + return implementsInterface(named("com.sun.jersey.api.client.ClientHandler")); + } + + @Override + public Map, String> transformers() { + return singletonMap( + named("handle") + .and(takesArgument(0, extendsClass(named("com.sun.jersey.api.client.ClientRequest")))) + .and(returns(extendsClass(named("com.sun.jersey.api.client.ClientResponse")))), + JaxRsClientInstrumentationModule.class.getName() + "$HandleAdvice"); + } } public static class HandleAdvice { diff --git a/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-jersey-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/JerseyClientConnectionErrorInstrumentation.java b/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-jersey-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/JerseyClientInstrumentationModule.java similarity index 73% rename from instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-jersey-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/JerseyClientConnectionErrorInstrumentation.java rename to instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-jersey-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/JerseyClientInstrumentationModule.java index 883b8deefa..9c606c8059 100644 --- a/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-jersey-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/JerseyClientConnectionErrorInstrumentation.java +++ b/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-jersey-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/JerseyClientInstrumentationModule.java @@ -13,8 +13,11 @@ import static net.bytebuddy.matcher.ElementMatchers.returns; import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.Collections; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; @@ -30,18 +33,13 @@ import org.glassfish.jersey.client.ClientRequest; * JAX-RS Client API doesn't define a good point where we can handle connection failures, so we must * handle these errors at the implementation level. */ -@AutoService(Instrumenter.class) -public final class JerseyClientConnectionErrorInstrumentation extends Instrumenter.Default { +@AutoService(InstrumentationModule.class) +public final class JerseyClientInstrumentationModule extends InstrumentationModule { - public JerseyClientConnectionErrorInstrumentation() { + public JerseyClientInstrumentationModule() { super("jax-rs", "jaxrs", "jax-rs-client"); } - @Override - public ElementMatcher typeMatcher() { - return named("org.glassfish.jersey.client.JerseyInvocation"); - } - @Override public String[] helperClassNames() { return new String[] { @@ -52,18 +50,31 @@ public final class JerseyClientConnectionErrorInstrumentation extends Instrument } @Override - public Map, String> transformers() { - Map, String> transformers = new HashMap<>(); + public List typeInstrumentations() { + return Collections.singletonList(new JerseyClientConnectionErrorInstrumentation()); + } - transformers.put( - isMethod().and(isPublic()).and(named("invoke")), - JerseyClientConnectionErrorInstrumentation.class.getName() + "$InvokeAdvice"); + private static final class JerseyClientConnectionErrorInstrumentation + implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return named("org.glassfish.jersey.client.JerseyInvocation"); + } - transformers.put( - isMethod().and(isPublic()).and(named("submit")).and(returns(Future.class)), - JerseyClientConnectionErrorInstrumentation.class.getName() + "$SubmitAdvice"); + @Override + public Map, String> transformers() { + Map, String> transformers = new HashMap<>(); - return transformers; + transformers.put( + isMethod().and(isPublic()).and(named("invoke")), + JerseyClientInstrumentationModule.class.getName() + "$InvokeAdvice"); + + transformers.put( + isMethod().and(isPublic()).and(named("submit")).and(returns(Future.class)), + JerseyClientInstrumentationModule.class.getName() + "$SubmitAdvice"); + + return transformers; + } } public static class InvokeAdvice { diff --git a/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-resteasy-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/ResteasyClientConnectionErrorInstrumentation.java b/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-resteasy-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/ResteasyClientInstrumentationModule.java similarity index 67% rename from instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-resteasy-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/ResteasyClientConnectionErrorInstrumentation.java rename to instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-resteasy-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/ResteasyClientInstrumentationModule.java index 4e72649420..99404e52ef 100644 --- a/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-resteasy-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/ResteasyClientConnectionErrorInstrumentation.java +++ b/instrumentation/jaxrs-client/jaxrs-client-2.0/jaxrs-client-2.0-resteasy-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/ResteasyClientInstrumentationModule.java @@ -6,6 +6,8 @@ package io.opentelemetry.javaagent.instrumentation.jaxrsclient.v2_0; import static io.opentelemetry.javaagent.instrumentation.jaxrsclient.v2_0.ResteasyClientTracer.tracer; +import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -14,8 +16,9 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.tooling.Instrumenter; -import java.util.HashMap; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; import java.util.Map; import javax.ws.rs.core.Response; import net.bytebuddy.asm.Advice; @@ -29,21 +32,16 @@ import org.jboss.resteasy.client.jaxrs.internal.ClientInvocation; * all requests through single point. Both sync ADN async! This allows for easy instrumentation and * proper scope handling. * - *

This specific instrumentation will not conflict with {@link JaxRsClientInstrumentation}, + *

This specific instrumentation will not conflict with {@link JaxRsClientInstrumentationModule}, * because {@link JaxRsClientTracer} used by the latter checks against double client spans. */ -@AutoService(Instrumenter.class) -public final class ResteasyClientConnectionErrorInstrumentation extends Instrumenter.Default { +@AutoService(InstrumentationModule.class) +public final class ResteasyClientInstrumentationModule extends InstrumentationModule { - public ResteasyClientConnectionErrorInstrumentation() { + public ResteasyClientInstrumentationModule() { super("jax-rs", "jaxrs", "jax-rs-client"); } - @Override - public ElementMatcher typeMatcher() { - return named("org.jboss.resteasy.client.jaxrs.internal.ClientInvocation"); - } - @Override public String[] helperClassNames() { return new String[] { @@ -52,14 +50,23 @@ public final class ResteasyClientConnectionErrorInstrumentation extends Instrume } @Override - public Map, String> transformers() { - Map, String> transformers = new HashMap<>(); + public List typeInstrumentations() { + return singletonList(new ResteasyClientConnectionErrorInstrumentation()); + } - transformers.put( - isMethod().and(isPublic()).and(named("invoke")).and(takesArguments(0)), - ResteasyClientConnectionErrorInstrumentation.class.getName() + "$InvokeAdvice"); + private static final class ResteasyClientConnectionErrorInstrumentation + implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return named("org.jboss.resteasy.client.jaxrs.internal.ClientInvocation"); + } - return transformers; + @Override + public Map, String> transformers() { + return singletonMap( + isMethod().and(isPublic()).and(named("invoke")).and(takesArguments(0)), + ResteasyClientInstrumentationModule.class.getName() + "$InvokeAdvice"); + } } public static class InvokeAdvice { diff --git a/instrumentation/jaxrs-client/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/JaxRsClientInstrumentation.java b/instrumentation/jaxrs-client/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/JaxRsClientInstrumentationModule.java similarity index 58% rename from instrumentation/jaxrs-client/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/JaxRsClientInstrumentation.java rename to instrumentation/jaxrs-client/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/JaxRsClientInstrumentationModule.java index cc98a9fe10..dc336c311a 100644 --- a/instrumentation/jaxrs-client/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/JaxRsClientInstrumentation.java +++ b/instrumentation/jaxrs-client/jaxrs-client-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrsclient/v2_0/JaxRsClientInstrumentationModule.java @@ -8,12 +8,15 @@ package io.opentelemetry.javaagent.instrumentation.jaxrsclient.v2_0; import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.extendsClass; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.hasInterface; +import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.returns; import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; import java.util.Map; import javax.ws.rs.client.Client; import net.bytebuddy.asm.Advice; @@ -22,24 +25,13 @@ import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.implementation.bytecode.assign.Assigner; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class JaxRsClientInstrumentation extends Instrumenter.Default { +@AutoService(InstrumentationModule.class) +public final class JaxRsClientInstrumentationModule extends InstrumentationModule { - public JaxRsClientInstrumentation() { + public JaxRsClientInstrumentationModule() { super("jax-rs", "jaxrs", "jax-rs-client"); } - @Override - public ElementMatcher classLoaderMatcher() { - // Optimization for expensive typeMatcher. - return hasClassesNamed("javax.ws.rs.client.ClientBuilder"); - } - - @Override - public ElementMatcher typeMatcher() { - return extendsClass(named("javax.ws.rs.client.ClientBuilder")); - } - @Override public String[] helperClassNames() { return new String[] { @@ -51,10 +43,28 @@ public final class JaxRsClientInstrumentation extends Instrumenter.Default { } @Override - public Map, String> transformers() { - return singletonMap( - named("build").and(returns(hasInterface(named("javax.ws.rs.client.Client")))), - JaxRsClientInstrumentation.class.getName() + "$ClientBuilderAdvice"); + public List typeInstrumentations() { + return singletonList(new ClientBuilderInstrumentation()); + } + + private static final class ClientBuilderInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return hasClassesNamed("javax.ws.rs.client.ClientBuilder"); + } + + @Override + public ElementMatcher typeMatcher() { + return extendsClass(named("javax.ws.rs.client.ClientBuilder")); + } + + @Override + public Map, String> transformers() { + return singletonMap( + named("build").and(returns(hasInterface(named("javax.ws.rs.client.Client")))), + JaxRsClientInstrumentationModule.class.getName() + "$ClientBuilderAdvice"); + } } public static class ClientBuilderAdvice { diff --git a/instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxRsAnnotationsInstrumentation.java b/instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxRsAnnotationsInstrumentation.java index 1dc747d38f..5e5d8fd937 100644 --- a/instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxRsAnnotationsInstrumentation.java +++ b/instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxRsAnnotationsInstrumentation.java @@ -15,13 +15,11 @@ import static net.bytebuddy.matcher.ElementMatchers.declaresMethod; import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.javaagent.instrumentation.api.CallDepthThreadLocalMap; import io.opentelemetry.javaagent.instrumentation.api.SpanWithScope; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.lang.reflect.Method; import java.util.Map; import javax.ws.rs.Path; @@ -30,19 +28,12 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class JaxRsAnnotationsInstrumentation extends Instrumenter.Default { +final class JaxRsAnnotationsInstrumentation implements TypeInstrumentation { - public JaxRsAnnotationsInstrumentation() { - super("jax-rs", "jaxrs", "jax-rs-annotations"); - } - - // this is required to make sure instrumentation won't apply to jax-rs 2 @Override public ElementMatcher classLoaderMatcher() { - return not(hasClassesNamed("javax.ws.rs.container.AsyncResponse")) - // Optimization for expensive typeMatcher. - .and(hasClassesNamed("javax.ws.rs.Path")); + // Optimization for expensive typeMatcher. + return hasClassesNamed("javax.ws.rs.Path"); } @Override @@ -52,15 +43,6 @@ public final class JaxRsAnnotationsInstrumentation extends Instrumenter.Default .or(declaresMethod(isAnnotatedWith(named("javax.ws.rs.Path"))))); } - @Override - public String[] helperClassNames() { - return new String[] { - "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable", - "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable$ClassIterator", - packageName + ".JaxRsAnnotationsTracer", - }; - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxRsInstrumentationModule.java b/instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxRsInstrumentationModule.java new file mode 100644 index 0000000000..bd6b2d0288 --- /dev/null +++ b/instrumentation/jaxrs/jaxrs-1.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v1_0/JaxRsInstrumentationModule.java @@ -0,0 +1,43 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.jaxrs.v1_0; + +import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; +import static java.util.Collections.singletonList; +import static net.bytebuddy.matcher.ElementMatchers.not; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; +import net.bytebuddy.matcher.ElementMatcher; + +@AutoService(InstrumentationModule.class) +public class JaxRsInstrumentationModule extends InstrumentationModule { + public JaxRsInstrumentationModule() { + super("jax-rs", "jaxrs"); + } + + // this is required to make sure instrumentation won't apply to jax-rs 2 + @Override + public ElementMatcher.Junction classLoaderMatcher() { + return not(hasClassesNamed("javax.ws.rs.container.AsyncResponse")); + } + + @Override + public String[] helperClassNames() { + return new String[] { + "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable", + "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable$ClassIterator", + packageName + ".JaxRsAnnotationsTracer", + }; + } + + @Override + public List typeInstrumentations() { + return singletonList(new JaxRsAnnotationsInstrumentation()); + } +} diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/AbstractRequestContextInstrumentation.java b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/AbstractRequestContextInstrumentation.java index f86fc9b64b..09e1cab954 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/AbstractRequestContextInstrumentation.java +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/AbstractRequestContextInstrumentation.java @@ -5,7 +5,6 @@ package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0; -import static io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0.JaxRsAnnotationsTracer.tracer; import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; import static java.util.Collections.singletonMap; @@ -14,24 +13,13 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.api.trace.Span; -import io.opentelemetry.context.Context; -import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.tracer.BaseTracer; -import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; -import io.opentelemetry.javaagent.tooling.Instrumenter; -import java.lang.reflect.Method; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; -import javax.ws.rs.container.ContainerRequestContext; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -public abstract class AbstractRequestContextInstrumentation extends Instrumenter.Default { - public AbstractRequestContextInstrumentation() { - super("jax-rs", "jaxrs", "jax-rs-filter"); - } - +public abstract class AbstractRequestContextInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. @@ -43,16 +31,6 @@ public abstract class AbstractRequestContextInstrumentation extends Instrumenter return implementsInterface(named("javax.ws.rs.container.ContainerRequestContext")); } - @Override - public String[] helperClassNames() { - return new String[] { - "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable", - "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable$ClassIterator", - packageName + ".JaxRsAnnotationsTracer", - AbstractRequestContextInstrumentation.class.getName() + "$RequestFilterHelper", - }; - } - @Override public Map, String> transformers() { return singletonMap( @@ -60,44 +38,8 @@ public abstract class AbstractRequestContextInstrumentation extends Instrumenter .and(named("abortWith")) .and(takesArguments(1)) .and(takesArgument(0, named("javax.ws.rs.core.Response"))), - getClass().getName() + "$ContainerRequestContextAdvice"); + abortAdviceName()); } - public static class RequestFilterHelper { - public static Span createOrUpdateAbortSpan( - ContainerRequestContext requestContext, Class resourceClass, Method method) { - - if (method != null && resourceClass != null) { - requestContext.setProperty(JaxRsAnnotationsTracer.ABORT_HANDLED, true); - Context context = Java8BytecodeBridge.currentContext(); - Span serverSpan = BaseTracer.getCurrentServerSpan(context); - Span currentSpan = Java8BytecodeBridge.spanFromContext(context); - - // if there's no current span or it's the same as the server (servlet) span we need to start - // a JAX-RS one - // in other case, DefaultRequestContextInstrumentation must have already run so it's enough - // to just update the names - if (currentSpan == null || currentSpan == serverSpan) { - return tracer().startSpan(resourceClass, method); - } else { - tracer().updateSpanNames(context, currentSpan, serverSpan, resourceClass, method); - } - } - return null; - } - - public static void closeSpanAndScope(Span span, Scope scope, Throwable throwable) { - if (span == null || scope == null) { - return; - } - - if (throwable != null) { - tracer().endExceptionally(span, throwable); - } else { - tracer().end(span); - } - - scope.close(); - } - } + protected abstract String abortAdviceName(); } diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/ContainerRequestFilterInstrumentation.java b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/ContainerRequestFilterInstrumentation.java index 98a2b8f152..7af4d2d7e7 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/ContainerRequestFilterInstrumentation.java +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/ContainerRequestFilterInstrumentation.java @@ -13,8 +13,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ContainerRequestFilter; @@ -27,12 +26,7 @@ import net.bytebuddy.matcher.ElementMatcher; * This adds the filter class name to the request properties. The class name is used by * DefaultRequestContextInstrumentation */ -@AutoService(Instrumenter.class) -public class ContainerRequestFilterInstrumentation extends Instrumenter.Default { - - public ContainerRequestFilterInstrumentation() { - super("jax-rs", "jaxrs", "jax-rs-filter"); - } +class ContainerRequestFilterInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/DefaultRequestContextInstrumentation.java b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/DefaultRequestContextInstrumentation.java index 05d834e9e1..c76fe620ac 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/DefaultRequestContextInstrumentation.java +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/DefaultRequestContextInstrumentation.java @@ -7,10 +7,8 @@ package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0; import static io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0.JaxRsAnnotationsTracer.tracer; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.tooling.Instrumenter; import java.lang.reflect.Method; import javax.ws.rs.container.ContainerRequestContext; import net.bytebuddy.asm.Advice; @@ -25,8 +23,12 @@ import net.bytebuddy.asm.Advice.Local; *

This default instrumentation uses the class name of the filter to create the span. More * specific instrumentations may override this value. */ -@AutoService(Instrumenter.class) -public class DefaultRequestContextInstrumentation extends AbstractRequestContextInstrumentation { +final class DefaultRequestContextInstrumentation extends AbstractRequestContextInstrumentation { + @Override + protected String abortAdviceName() { + return ContainerRequestContextAdvice.class.getName(); + } + public static class ContainerRequestContextAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void createGenericSpan( @@ -54,7 +56,7 @@ public class DefaultRequestContextInstrumentation extends AbstractRequestContext @Local("otelSpan") Span span, @Local("otelScope") Scope scope, @Advice.Thrown Throwable throwable) { - RequestFilterHelper.closeSpanAndScope(span, scope, throwable); + RequestContextHelper.closeSpanAndScope(span, scope, throwable); } } } diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxRsAnnotationsInstrumentation.java b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxRsAnnotationsInstrumentation.java index a7135676a7..e45df075d6 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxRsAnnotationsInstrumentation.java +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxRsAnnotationsInstrumentation.java @@ -16,13 +16,12 @@ import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.CallDepthThreadLocalMap; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.lang.reflect.Method; import java.util.Map; import java.util.concurrent.CompletionStage; @@ -34,17 +33,7 @@ import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.implementation.bytecode.assign.Assigner.Typing; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class JaxRsAnnotationsInstrumentation extends Instrumenter.Default { - public JaxRsAnnotationsInstrumentation() { - super("jax-rs", "jaxrs", "jax-rs-annotations"); - } - - @Override - public Map contextStore() { - return singletonMap("javax.ws.rs.container.AsyncResponse", Span.class.getName()); - } - +final class JaxRsAnnotationsInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { // Optimization for expensive typeMatcher. @@ -58,16 +47,6 @@ public final class JaxRsAnnotationsInstrumentation extends Instrumenter.Default .or(declaresMethod(isAnnotatedWith(named("javax.ws.rs.Path"))))); } - @Override - public String[] helperClassNames() { - return new String[] { - "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable", - "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable$ClassIterator", - packageName + ".JaxRsAnnotationsTracer", - packageName + ".CompletionStageFinishCallback" - }; - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxRsAsyncResponseInstrumentation.java b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxRsAsyncResponseInstrumentation.java index 467725c416..90e15de511 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxRsAsyncResponseInstrumentation.java +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxRsAsyncResponseInstrumentation.java @@ -8,16 +8,14 @@ package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0; import static io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0.JaxRsAnnotationsTracer.tracer; import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; -import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.HashMap; import java.util.Map; import javax.ws.rs.container.AsyncResponse; @@ -26,17 +24,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class JaxRsAsyncResponseInstrumentation extends Instrumenter.Default { - - public JaxRsAsyncResponseInstrumentation() { - super("jax-rs", "jaxrs", "jax-rs-annotations"); - } - - @Override - public Map contextStore() { - return singletonMap("javax.ws.rs.container.AsyncResponse", Span.class.getName()); - } +final class JaxRsAsyncResponseInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -49,15 +37,6 @@ public final class JaxRsAsyncResponseInstrumentation extends Instrumenter.Defaul return implementsInterface(named("javax.ws.rs.container.AsyncResponse")); } - @Override - public String[] helperClassNames() { - return new String[] { - "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable", - "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable$ClassIterator", - packageName + ".JaxRsAnnotationsTracer", - }; - } - @Override public Map, String> transformers() { Map, String> transformers = new HashMap<>(); diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxRsInstrumentationModule.java b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxRsInstrumentationModule.java new file mode 100644 index 0000000000..f844b5fdaf --- /dev/null +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JaxRsInstrumentationModule.java @@ -0,0 +1,56 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0; + +import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; +import static java.util.Arrays.asList; +import static java.util.Collections.singletonMap; + +import com.google.auto.service.AutoService; +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; +import java.util.Map; +import net.bytebuddy.matcher.ElementMatcher; + +@AutoService(InstrumentationModule.class) +public class JaxRsInstrumentationModule extends InstrumentationModule { + public JaxRsInstrumentationModule() { + super("jax-rs", "jaxrs"); + } + + // require jax-rs 2 + @Override + public ElementMatcher.Junction classLoaderMatcher() { + return hasClassesNamed("javax.ws.rs.container.AsyncResponse"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable", + "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable$ClassIterator", + packageName + ".JaxRsAnnotationsTracer", + packageName + ".CompletionStageFinishCallback", + packageName + ".RequestContextHelper" + }; + } + + @Override + public List typeInstrumentations() { + return asList( + new ContainerRequestFilterInstrumentation(), + new DefaultRequestContextInstrumentation(), + new JaxRsAnnotationsInstrumentation(), + new JaxRsAsyncResponseInstrumentation()); + } + + @Override + public Map contextStore() { + return singletonMap("javax.ws.rs.container.AsyncResponse", Span.class.getName()); + } +} diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/RequestContextHelper.java b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/RequestContextHelper.java new file mode 100644 index 0000000000..eeefec4b1d --- /dev/null +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-common/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/RequestContextHelper.java @@ -0,0 +1,56 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0; + +import static io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0.JaxRsAnnotationsTracer.tracer; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.context.Context; +import io.opentelemetry.context.Scope; +import io.opentelemetry.instrumentation.api.tracer.BaseTracer; +import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; +import java.lang.reflect.Method; +import javax.ws.rs.container.ContainerRequestContext; + +public final class RequestContextHelper { + public static Span createOrUpdateAbortSpan( + ContainerRequestContext requestContext, Class resourceClass, Method method) { + + if (method != null && resourceClass != null) { + requestContext.setProperty(JaxRsAnnotationsTracer.ABORT_HANDLED, true); + Context context = Java8BytecodeBridge.currentContext(); + Span serverSpan = BaseTracer.getCurrentServerSpan(context); + Span currentSpan = Java8BytecodeBridge.spanFromContext(context); + + // if there's no current span or it's the same as the server (servlet) span we need to start + // a JAX-RS one + // in other case, DefaultRequestContextInstrumentation must have already run so it's enough + // to just update the names + if (currentSpan == null || currentSpan == serverSpan) { + return tracer().startSpan(resourceClass, method); + } else { + tracer().updateSpanNames(context, currentSpan, serverSpan, resourceClass, method); + } + } + return null; + } + + public static void closeSpanAndScope(Span span, Scope scope, Throwable throwable) { + if (span == null || scope == null) { + return; + } + + if (throwable != null) { + tracer().endExceptionally(span, throwable); + } else { + tracer().end(span); + } + + scope.close(); + } + + private RequestContextHelper() {} +} diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-jersey-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JerseyInstrumentationModule.java b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-jersey-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JerseyInstrumentationModule.java new file mode 100644 index 0000000000..ff6994d9fd --- /dev/null +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-jersey-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JerseyInstrumentationModule.java @@ -0,0 +1,34 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0; + +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; + +@AutoService(InstrumentationModule.class) +public class JerseyInstrumentationModule extends InstrumentationModule { + public JerseyInstrumentationModule() { + super("jax-rs", "jaxrs", "jersey"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable", + "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable$ClassIterator", + packageName + ".JaxRsAnnotationsTracer", + packageName + ".RequestContextHelper" + }; + } + + @Override + public List typeInstrumentations() { + return Collections.singletonList(new JerseyRequestContextInstrumentation()); + } +} diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-jersey-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JerseyRequestContextInstrumentation.java b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-jersey-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JerseyRequestContextInstrumentation.java index 0b79921db3..22f7880de2 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-jersey-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JerseyRequestContextInstrumentation.java +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-jersey-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/JerseyRequestContextInstrumentation.java @@ -7,10 +7,8 @@ package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0; import static io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0.JaxRsAnnotationsTracer.tracer; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.tooling.Instrumenter; import java.lang.reflect.Method; import javax.ws.rs.container.ContainerRequestContext; import javax.ws.rs.container.ResourceInfo; @@ -27,8 +25,12 @@ import net.bytebuddy.asm.Advice.Local; *

In the Jersey implementation, UriInfo implements ResourceInfo. The * matched resource method can be retrieved from that object */ -@AutoService(Instrumenter.class) -public class JerseyRequestContextInstrumentation extends AbstractRequestContextInstrumentation { +final class JerseyRequestContextInstrumentation extends AbstractRequestContextInstrumentation { + @Override + protected String abortAdviceName() { + return ContainerRequestContextAdvice.class.getName(); + } + public static class ContainerRequestContextAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void decorateAbortSpan( @@ -44,7 +46,7 @@ public class JerseyRequestContextInstrumentation extends AbstractRequestContextI Method method = resourceInfo.getResourceMethod(); Class resourceClass = resourceInfo.getResourceClass(); - span = RequestFilterHelper.createOrUpdateAbortSpan(context, resourceClass, method); + span = RequestContextHelper.createOrUpdateAbortSpan(context, resourceClass, method); if (span != null) { scope = tracer().startScope(span); } @@ -56,7 +58,7 @@ public class JerseyRequestContextInstrumentation extends AbstractRequestContextI @Local("otelSpan") Span span, @Local("otelScope") Scope scope, @Advice.Thrown Throwable throwable) { - RequestFilterHelper.closeSpanAndScope(span, scope, throwable); + RequestContextHelper.closeSpanAndScope(span, scope, throwable); } } } diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy30InstrumentationModule.java b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy30InstrumentationModule.java new file mode 100644 index 0000000000..7f7d366a32 --- /dev/null +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy30InstrumentationModule.java @@ -0,0 +1,34 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0; + +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; + +@AutoService(InstrumentationModule.class) +public class Resteasy30InstrumentationModule extends InstrumentationModule { + public Resteasy30InstrumentationModule() { + super("jax-rs", "jaxrs", "resteasy"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable", + "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable$ClassIterator", + packageName + ".JaxRsAnnotationsTracer", + packageName + ".RequestContextHelper" + }; + } + + @Override + public List typeInstrumentations() { + return Collections.singletonList(new Resteasy30RequestContextInstrumentation()); + } +} diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy30RequestContextInstrumentation.java b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy30RequestContextInstrumentation.java index 3d9af8a174..0a904c06b6 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy30RequestContextInstrumentation.java +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy30RequestContextInstrumentation.java @@ -7,10 +7,8 @@ package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0; import static io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0.JaxRsAnnotationsTracer.tracer; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.tooling.Instrumenter; import java.lang.reflect.Method; import javax.ws.rs.container.ContainerRequestContext; import net.bytebuddy.asm.Advice; @@ -28,8 +26,12 @@ import org.jboss.resteasy.core.interception.PostMatchContainerRequestContext; * PostMatchContainerRequestContext. This class provides a way to get the matched resource * method through getResourceMethod(). */ -@AutoService(Instrumenter.class) -public class Resteasy30RequestContextInstrumentation extends AbstractRequestContextInstrumentation { +final class Resteasy30RequestContextInstrumentation extends AbstractRequestContextInstrumentation { + @Override + protected String abortAdviceName() { + return ContainerRequestContextAdvice.class.getName(); + } + public static class ContainerRequestContextAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void decorateAbortSpan( @@ -44,7 +46,7 @@ public class Resteasy30RequestContextInstrumentation extends AbstractRequestCont Method method = resourceMethodInvoker.getMethod(); Class resourceClass = resourceMethodInvoker.getResourceClass(); - span = RequestFilterHelper.createOrUpdateAbortSpan(context, resourceClass, method); + span = RequestContextHelper.createOrUpdateAbortSpan(context, resourceClass, method); if (span != null) { scope = tracer().startScope(span); } @@ -56,7 +58,7 @@ public class Resteasy30RequestContextInstrumentation extends AbstractRequestCont @Local("otelSpan") Span span, @Local("otelScope") Scope scope, @Advice.Thrown Throwable throwable) { - RequestFilterHelper.closeSpanAndScope(span, scope, throwable); + RequestContextHelper.closeSpanAndScope(span, scope, throwable); } } } diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy31InstrumentationModule.java b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy31InstrumentationModule.java new file mode 100644 index 0000000000..b1d7a032b9 --- /dev/null +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy31InstrumentationModule.java @@ -0,0 +1,34 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0; + +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; + +@AutoService(InstrumentationModule.class) +public class Resteasy31InstrumentationModule extends InstrumentationModule { + public Resteasy31InstrumentationModule() { + super("jax-rs", "jaxrs", "resteasy"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable", + "io.opentelemetry.javaagent.tooling.ClassHierarchyIterable$ClassIterator", + packageName + ".JaxRsAnnotationsTracer", + packageName + ".RequestContextHelper" + }; + } + + @Override + public List typeInstrumentations() { + return Collections.singletonList(new Resteasy31RequestContextInstrumentation()); + } +} diff --git a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy31RequestContextInstrumentation.java b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy31RequestContextInstrumentation.java index a5225864fc..1045f7b13d 100644 --- a/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy31RequestContextInstrumentation.java +++ b/instrumentation/jaxrs/jaxrs-2.0/jaxrs-2.0-resteasy-3.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jaxrs/v2_0/Resteasy31RequestContextInstrumentation.java @@ -7,10 +7,8 @@ package io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0; import static io.opentelemetry.javaagent.instrumentation.jaxrs.v2_0.JaxRsAnnotationsTracer.tracer; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.tooling.Instrumenter; import java.lang.reflect.Method; import javax.ws.rs.container.ContainerRequestContext; import net.bytebuddy.asm.Advice; @@ -28,8 +26,12 @@ import org.jboss.resteasy.core.interception.jaxrs.PostMatchContainerRequestConte * PostMatchContainerRequestContext. This class provides a way to get the matched resource * method through getResourceMethod(). */ -@AutoService(Instrumenter.class) -public class Resteasy31RequestContextInstrumentation extends AbstractRequestContextInstrumentation { +final class Resteasy31RequestContextInstrumentation extends AbstractRequestContextInstrumentation { + @Override + protected String abortAdviceName() { + return ContainerRequestContextAdvice.class.getName(); + } + public static class ContainerRequestContextAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void decorateAbortSpan( @@ -44,7 +46,7 @@ public class Resteasy31RequestContextInstrumentation extends AbstractRequestCont Method method = resourceMethodInvoker.getMethod(); Class resourceClass = resourceMethodInvoker.getResourceClass(); - span = RequestFilterHelper.createOrUpdateAbortSpan(context, resourceClass, method); + span = RequestContextHelper.createOrUpdateAbortSpan(context, resourceClass, method); if (span != null) { scope = tracer().startScope(span); } @@ -56,7 +58,7 @@ public class Resteasy31RequestContextInstrumentation extends AbstractRequestCont @Local("otelSpan") Span span, @Local("otelScope") Scope scope, @Advice.Thrown Throwable throwable) { - RequestFilterHelper.closeSpanAndScope(span, scope, throwable); + RequestContextHelper.closeSpanAndScope(span, scope, throwable); } } } diff --git a/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/ConnectionInstrumentation.java b/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/ConnectionInstrumentation.java index 10af8ca254..abd871a5d7 100644 --- a/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/ConnectionInstrumentation.java +++ b/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/ConnectionInstrumentation.java @@ -14,8 +14,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.sql.PreparedStatement; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -23,12 +22,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class ConnectionInstrumentation extends Instrumenter.Default { - - public ConnectionInstrumentation() { - super("jdbc"); - } +final class ConnectionInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -40,36 +34,6 @@ public final class ConnectionInstrumentation extends Instrumenter.Default { return implementsInterface(named("java.sql.Connection")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".DataSourceTracer", - packageName + ".DBInfo", - packageName + ".DBInfo$Builder", - packageName + ".JDBCConnectionUrlParser", - packageName + ".JDBCConnectionUrlParser$1", - packageName + ".JDBCConnectionUrlParser$2", - packageName + ".JDBCConnectionUrlParser$3", - packageName + ".JDBCConnectionUrlParser$4", - packageName + ".JDBCConnectionUrlParser$5", - packageName + ".JDBCConnectionUrlParser$6", - packageName + ".JDBCConnectionUrlParser$7", - packageName + ".JDBCConnectionUrlParser$8", - packageName + ".JDBCConnectionUrlParser$9", - packageName + ".JDBCConnectionUrlParser$10", - packageName + ".JDBCConnectionUrlParser$11", - packageName + ".JDBCConnectionUrlParser$12", - packageName + ".JDBCConnectionUrlParser$13", - packageName + ".JDBCConnectionUrlParser$14", - packageName + ".JDBCConnectionUrlParser$15", - packageName + ".JDBCConnectionUrlParser$16", - packageName + ".JDBCConnectionUrlParser$17", - packageName + ".JDBCMaps", - packageName + ".JdbcTracer", - packageName + ".JDBCUtils", - }; - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/DriverInstrumentation.java b/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/DriverInstrumentation.java index 069f09b218..79a63eb70a 100644 --- a/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/DriverInstrumentation.java +++ b/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/DriverInstrumentation.java @@ -13,8 +13,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.returns; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.sql.Connection; import java.util.Map; import java.util.Properties; @@ -23,12 +22,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class DriverInstrumentation extends Instrumenter.Default { - - public DriverInstrumentation() { - super("jdbc"); - } +final class DriverInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -40,34 +34,6 @@ public final class DriverInstrumentation extends Instrumenter.Default { return implementsInterface(named("java.sql.Driver")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".DBInfo", - packageName + ".DBInfo$Builder", - packageName + ".JDBCConnectionUrlParser", - packageName + ".JDBCConnectionUrlParser$1", - packageName + ".JDBCConnectionUrlParser$2", - packageName + ".JDBCConnectionUrlParser$3", - packageName + ".JDBCConnectionUrlParser$4", - packageName + ".JDBCConnectionUrlParser$5", - packageName + ".JDBCConnectionUrlParser$6", - packageName + ".JDBCConnectionUrlParser$7", - packageName + ".JDBCConnectionUrlParser$8", - packageName + ".JDBCConnectionUrlParser$9", - packageName + ".JDBCConnectionUrlParser$10", - packageName + ".JDBCConnectionUrlParser$11", - packageName + ".JDBCConnectionUrlParser$12", - packageName + ".JDBCConnectionUrlParser$13", - packageName + ".JDBCConnectionUrlParser$14", - packageName + ".JDBCConnectionUrlParser$15", - packageName + ".JDBCConnectionUrlParser$16", - packageName + ".JDBCConnectionUrlParser$17", - packageName + ".JDBCMaps", - packageName + ".JDBCUtils", - }; - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/DataSourceInstrumentation.java b/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcDataSourceInstrumentationModule.java similarity index 78% rename from instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/DataSourceInstrumentation.java rename to instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcDataSourceInstrumentationModule.java index d4de960cb5..5439fe2f84 100644 --- a/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/DataSourceInstrumentation.java +++ b/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcDataSourceInstrumentationModule.java @@ -8,6 +8,7 @@ package io.opentelemetry.javaagent.instrumentation.jdbc; import static io.opentelemetry.api.trace.Span.Kind.CLIENT; import static io.opentelemetry.javaagent.instrumentation.jdbc.DataSourceTracer.tracer; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; +import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -15,7 +16,9 @@ import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; import java.util.Map; import javax.sql.DataSource; import net.bytebuddy.asm.Advice; @@ -23,17 +26,12 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class DataSourceInstrumentation extends Instrumenter.Default { - public DataSourceInstrumentation() { +@AutoService(InstrumentationModule.class) +public final class JdbcDataSourceInstrumentationModule extends InstrumentationModule { + public JdbcDataSourceInstrumentationModule() { super("jdbc-datasource"); } - @Override - public boolean defaultEnabled() { - return false; - } - @Override public String[] helperClassNames() { return new String[] { @@ -64,13 +62,25 @@ public final class DataSourceInstrumentation extends Instrumenter.Default { } @Override - public ElementMatcher typeMatcher() { - return implementsInterface(named("javax.sql.DataSource")); + public List typeInstrumentations() { + return singletonList(new DataSourceInstrumentation()); } @Override - public Map, String> transformers() { - return singletonMap(named("getConnection"), GetConnectionAdvice.class.getName()); + public boolean defaultEnabled() { + return false; + } + + private static final class DataSourceInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return implementsInterface(named("javax.sql.DataSource")); + } + + @Override + public Map, String> transformers() { + return singletonMap(named("getConnection"), GetConnectionAdvice.class.getName()); + } } public static class GetConnectionAdvice { diff --git a/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcInstrumentationModule.java b/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcInstrumentationModule.java new file mode 100644 index 0000000000..910ea5ed78 --- /dev/null +++ b/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcInstrumentationModule.java @@ -0,0 +1,58 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.jdbc; + +import static java.util.Arrays.asList; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; + +@AutoService(InstrumentationModule.class) +public class JdbcInstrumentationModule extends InstrumentationModule { + public JdbcInstrumentationModule() { + super("jdbc"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + packageName + ".DBInfo", + packageName + ".DBInfo$Builder", + packageName + ".JDBCConnectionUrlParser", + packageName + ".JDBCConnectionUrlParser$1", + packageName + ".JDBCConnectionUrlParser$2", + packageName + ".JDBCConnectionUrlParser$3", + packageName + ".JDBCConnectionUrlParser$4", + packageName + ".JDBCConnectionUrlParser$5", + packageName + ".JDBCConnectionUrlParser$6", + packageName + ".JDBCConnectionUrlParser$7", + packageName + ".JDBCConnectionUrlParser$8", + packageName + ".JDBCConnectionUrlParser$9", + packageName + ".JDBCConnectionUrlParser$10", + packageName + ".JDBCConnectionUrlParser$11", + packageName + ".JDBCConnectionUrlParser$12", + packageName + ".JDBCConnectionUrlParser$13", + packageName + ".JDBCConnectionUrlParser$14", + packageName + ".JDBCConnectionUrlParser$15", + packageName + ".JDBCConnectionUrlParser$16", + packageName + ".JDBCConnectionUrlParser$17", + packageName + ".JDBCMaps", + packageName + ".JdbcTracer", + packageName + ".JDBCUtils", + }; + } + + @Override + public List typeInstrumentations() { + return asList( + new ConnectionInstrumentation(), + new DriverInstrumentation(), + new PreparedStatementInstrumentation(), + new StatementInstrumentation()); + } +} diff --git a/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/PreparedStatementInstrumentation.java b/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/PreparedStatementInstrumentation.java index 9d160b8af5..47cb068ba1 100644 --- a/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/PreparedStatementInstrumentation.java +++ b/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/PreparedStatementInstrumentation.java @@ -14,11 +14,10 @@ import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.CallDepthThreadLocalMap.Depth; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.sql.PreparedStatement; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -26,12 +25,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class PreparedStatementInstrumentation extends Instrumenter.Default { - - public PreparedStatementInstrumentation() { - super("jdbc"); - } +final class PreparedStatementInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -43,36 +37,6 @@ public final class PreparedStatementInstrumentation extends Instrumenter.Default return implementsInterface(named("java.sql.PreparedStatement")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".DataSourceTracer", - packageName + ".DBInfo", - packageName + ".DBInfo$Builder", - packageName + ".JDBCConnectionUrlParser", - packageName + ".JDBCConnectionUrlParser$1", - packageName + ".JDBCConnectionUrlParser$2", - packageName + ".JDBCConnectionUrlParser$3", - packageName + ".JDBCConnectionUrlParser$4", - packageName + ".JDBCConnectionUrlParser$5", - packageName + ".JDBCConnectionUrlParser$6", - packageName + ".JDBCConnectionUrlParser$7", - packageName + ".JDBCConnectionUrlParser$8", - packageName + ".JDBCConnectionUrlParser$9", - packageName + ".JDBCConnectionUrlParser$10", - packageName + ".JDBCConnectionUrlParser$11", - packageName + ".JDBCConnectionUrlParser$12", - packageName + ".JDBCConnectionUrlParser$13", - packageName + ".JDBCConnectionUrlParser$14", - packageName + ".JDBCConnectionUrlParser$15", - packageName + ".JDBCConnectionUrlParser$16", - packageName + ".JDBCConnectionUrlParser$17", - packageName + ".JDBCMaps", - packageName + ".JdbcTracer", - packageName + ".JDBCUtils", - }; - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/StatementInstrumentation.java b/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/StatementInstrumentation.java index 27a9c51ac9..cdb48286a2 100644 --- a/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/StatementInstrumentation.java +++ b/instrumentation/jdbc/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/StatementInstrumentation.java @@ -14,11 +14,10 @@ import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.CallDepthThreadLocalMap.Depth; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.sql.Statement; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -26,12 +25,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class StatementInstrumentation extends Instrumenter.Default { - - public StatementInstrumentation() { - super("jdbc"); - } +final class StatementInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -43,36 +37,6 @@ public final class StatementInstrumentation extends Instrumenter.Default { return implementsInterface(named("java.sql.Statement")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".DataSourceTracer", - packageName + ".DBInfo", - packageName + ".DBInfo$Builder", - packageName + ".JDBCConnectionUrlParser", - packageName + ".JDBCConnectionUrlParser$1", - packageName + ".JDBCConnectionUrlParser$2", - packageName + ".JDBCConnectionUrlParser$3", - packageName + ".JDBCConnectionUrlParser$4", - packageName + ".JDBCConnectionUrlParser$5", - packageName + ".JDBCConnectionUrlParser$6", - packageName + ".JDBCConnectionUrlParser$7", - packageName + ".JDBCConnectionUrlParser$8", - packageName + ".JDBCConnectionUrlParser$9", - packageName + ".JDBCConnectionUrlParser$10", - packageName + ".JDBCConnectionUrlParser$11", - packageName + ".JDBCConnectionUrlParser$12", - packageName + ".JDBCConnectionUrlParser$13", - packageName + ".JDBCConnectionUrlParser$14", - packageName + ".JDBCConnectionUrlParser$15", - packageName + ".JDBCConnectionUrlParser$16", - packageName + ".JDBCConnectionUrlParser$17", - packageName + ".JDBCMaps", - packageName + ".JdbcTracer", - packageName + ".JDBCUtils", - }; - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/instrumentation/jedis/jedis-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisInstrumentation.java b/instrumentation/jedis/jedis-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisInstrumentationModule.java similarity index 69% rename from instrumentation/jedis/jedis-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisInstrumentation.java rename to instrumentation/jedis/jedis-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisInstrumentationModule.java index 27246364c5..ab5ceb9003 100644 --- a/instrumentation/jedis/jedis-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisInstrumentation.java +++ b/instrumentation/jedis/jedis-1.4/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v1_4/JedisInstrumentationModule.java @@ -7,6 +7,7 @@ package io.opentelemetry.javaagent.instrumentation.jedis.v1_4; import static io.opentelemetry.javaagent.instrumentation.jedis.v1_4.JedisClientTracer.tracer; import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; +import static java.util.Collections.singletonList; import static net.bytebuddy.matcher.ElementMatchers.is; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -19,8 +20,10 @@ import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.CallDepthThreadLocalMap; import io.opentelemetry.javaagent.instrumentation.jedis.v1_4.JedisClientTracer.CommandWithArgs; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.HashMap; +import java.util.List; import java.util.Map; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.method.MethodDescription; @@ -29,24 +32,19 @@ import net.bytebuddy.matcher.ElementMatcher; import redis.clients.jedis.Connection; import redis.clients.jedis.Protocol.Command; -@AutoService(Instrumenter.class) -public final class JedisInstrumentation extends Instrumenter.Default { +@AutoService(InstrumentationModule.class) +public final class JedisInstrumentationModule extends InstrumentationModule { - public JedisInstrumentation() { + public JedisInstrumentationModule() { super("jedis", "redis"); } @Override - public ElementMatcher classLoaderMatcher() { + public ElementMatcher.Junction classLoaderMatcher() { // Avoid matching 3.x return not(hasClassesNamed("redis.clients.jedis.commands.ProtocolCommand")); } - @Override - public ElementMatcher typeMatcher() { - return named("redis.clients.jedis.Connection"); - } - @Override public String[] helperClassNames() { return new String[] { @@ -55,23 +53,36 @@ public final class JedisInstrumentation extends Instrumenter.Default { } @Override - public Map, String> transformers() { - // FIXME: This instrumentation only incorporates sending the command, not processing the result. - Map, String> transformers = new HashMap<>(); - transformers.put( - isMethod() - .and(named("sendCommand")) - .and(takesArguments(1)) - .and(takesArgument(0, named("redis.clients.jedis.Protocol$Command"))), - JedisInstrumentation.class.getName() + "$JedisNoArgsAdvice"); - transformers.put( - isMethod() - .and(named("sendCommand")) - .and(takesArguments(2)) - .and(takesArgument(0, named("redis.clients.jedis.Protocol$Command"))) - .and(takesArgument(1, is(byte[][].class))), - JedisInstrumentation.class.getName() + "$JedisArgsAdvice"); - return transformers; + public List typeInstrumentations() { + return singletonList(new ConnectionInstrumentation()); + } + + private static final class ConnectionInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return named("redis.clients.jedis.Connection"); + } + + @Override + public Map, String> transformers() { + // FIXME: This instrumentation only incorporates sending the command, not processing the + // result. + Map, String> transformers = new HashMap<>(); + transformers.put( + isMethod() + .and(named("sendCommand")) + .and(takesArguments(1)) + .and(takesArgument(0, named("redis.clients.jedis.Protocol$Command"))), + JedisInstrumentationModule.class.getName() + "$JedisNoArgsAdvice"); + transformers.put( + isMethod() + .and(named("sendCommand")) + .and(takesArguments(2)) + .and(takesArgument(0, named("redis.clients.jedis.Protocol$Command"))) + .and(takesArgument(1, is(byte[][].class))), + JedisInstrumentationModule.class.getName() + "$JedisArgsAdvice"); + return transformers; + } } public static class JedisNoArgsAdvice { diff --git a/instrumentation/jedis/jedis-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisInstrumentation.java b/instrumentation/jedis/jedis-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisInstrumentationModule.java similarity index 64% rename from instrumentation/jedis/jedis-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisInstrumentation.java rename to instrumentation/jedis/jedis-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisInstrumentationModule.java index 00afb7ae1d..e236d74104 100644 --- a/instrumentation/jedis/jedis-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisInstrumentation.java +++ b/instrumentation/jedis/jedis-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/JedisInstrumentationModule.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.jedis.v3_0; import static io.opentelemetry.javaagent.instrumentation.jedis.v3_0.JedisClientTracer.tracer; +import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.is; import static net.bytebuddy.matcher.ElementMatchers.isMethod; @@ -17,7 +18,9 @@ import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.jedis.v3_0.JedisClientTracer.CommandWithArgs; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; import java.util.Map; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.method.MethodDescription; @@ -26,18 +29,13 @@ import net.bytebuddy.matcher.ElementMatcher; import redis.clients.jedis.Connection; import redis.clients.jedis.commands.ProtocolCommand; -@AutoService(Instrumenter.class) -public final class JedisInstrumentation extends Instrumenter.Default { +@AutoService(InstrumentationModule.class) +public final class JedisInstrumentationModule extends InstrumentationModule { - public JedisInstrumentation() { + public JedisInstrumentationModule() { super("jedis", "redis"); } - @Override - public ElementMatcher typeMatcher() { - return named("redis.clients.jedis.Connection"); - } - @Override public String[] helperClassNames() { return new String[] { @@ -46,15 +44,28 @@ public final class JedisInstrumentation extends Instrumenter.Default { } @Override - public Map, String> transformers() { - return singletonMap( - isMethod() - .and(named("sendCommand")) - .and(takesArguments(2)) - .and(takesArgument(0, named("redis.clients.jedis.commands.ProtocolCommand"))) - .and(takesArgument(1, is(byte[][].class))), - JedisInstrumentation.class.getName() + "$JedisAdvice"); - // FIXME: This instrumentation only incorporates sending the command, not processing the result. + public List typeInstrumentations() { + return singletonList(new ConnectionInstrumentation()); + } + + private static final class ConnectionInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return named("redis.clients.jedis.Connection"); + } + + @Override + public Map, String> transformers() { + return singletonMap( + isMethod() + .and(named("sendCommand")) + .and(takesArguments(2)) + .and(takesArgument(0, named("redis.clients.jedis.commands.ProtocolCommand"))) + .and(takesArgument(1, is(byte[][].class))), + JedisInstrumentationModule.class.getName() + "$JedisAdvice"); + // FIXME: This instrumentation only incorporates sending the command, not processing the + // result. + } } public static class JedisAdvice { diff --git a/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/JettyHandlerInstrumentation.java b/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/JettyHandlerInstrumentation.java deleted file mode 100644 index 35cbcc66a7..0000000000 --- a/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/JettyHandlerInstrumentation.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.jetty; - -import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; -import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; -import static java.util.Collections.singletonMap; -import static net.bytebuddy.matcher.ElementMatchers.isPublic; -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; - -import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.tooling.Instrumenter; -import java.util.Map; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -@AutoService(Instrumenter.class) -public final class JettyHandlerInstrumentation extends Instrumenter.Default { - - public JettyHandlerInstrumentation() { - super("jetty", "jetty-8"); - } - - @Override - public ElementMatcher classLoaderMatcher() { - // Optimization for expensive typeMatcher. - return hasClassesNamed("org.eclipse.jetty.server.Handler"); - } - - @Override - public ElementMatcher typeMatcher() { - // skipping built-in handlers, so that for servlets there will be no span started by jetty. - // this is so that the servlet instrumentation will capture contextPath and servletPath - // normally, which the jetty instrumentation does not capture since jetty doesn't populate - // contextPath and servletPath until right before calling the servlet - // (another option is to instrument ServletHolder.handle() to capture those fields) - return not(named("org.eclipse.jetty.server.handler.HandlerWrapper")) - .and(not(named("org.eclipse.jetty.server.handler.ScopedHandler"))) - .and(not(named("org.eclipse.jetty.server.handler.ContextHandler"))) - .and(not(named("org.eclipse.jetty.servlet.ServletHandler"))) - .and(implementsInterface(named("org.eclipse.jetty.server.Handler"))); - } - - @Override - public String[] helperClassNames() { - // order matters here because subclasses (e.g. JettyHttpServerTracer) need to be injected into - // the class loader after their super classes (e.g. Servlet3HttpServerTracer) - return new String[] { - "io.opentelemetry.instrumentation.servlet.HttpServletRequestGetter", - "io.opentelemetry.instrumentation.servlet.ServletHttpServerTracer", - "io.opentelemetry.javaagent.instrumentation.servlet.v3_0.Servlet3HttpServerTracer", - "io.opentelemetry.javaagent.instrumentation.servlet.v3_0.TagSettingAsyncListener", - packageName + ".JettyHttpServerTracer", - }; - } - - @Override - public Map, String> transformers() { - return singletonMap( - named("handle") - // need to capture doHandle() for handlers that extend built-in handlers excluded above - .or(named("doHandle")) - .and(takesArgument(0, named("java.lang.String"))) - .and(takesArgument(1, named("org.eclipse.jetty.server.Request"))) - .and(takesArgument(2, named("javax.servlet.http.HttpServletRequest"))) - .and(takesArgument(3, named("javax.servlet.http.HttpServletResponse"))) - .and(isPublic()), - packageName + ".JettyHandlerAdvice"); - } -} diff --git a/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/JettyInstrumentationModule.java b/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/JettyInstrumentationModule.java new file mode 100644 index 0000000000..dabc4bccd0 --- /dev/null +++ b/instrumentation/jetty-8.0/src/main/java/io/opentelemetry/javaagent/instrumentation/jetty/JettyInstrumentationModule.java @@ -0,0 +1,87 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.jetty; + +import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; +import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; +import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; +import static net.bytebuddy.matcher.ElementMatchers.isPublic; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.not; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +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) +public final class JettyInstrumentationModule extends InstrumentationModule { + + public JettyInstrumentationModule() { + super("jetty", "jetty-8"); + } + + @Override + public String[] helperClassNames() { + // order matters here because subclasses (e.g. JettyHttpServerTracer) need to be injected into + // the class loader after their super classes (e.g. Servlet3HttpServerTracer) + return new String[] { + "io.opentelemetry.instrumentation.servlet.HttpServletRequestGetter", + "io.opentelemetry.instrumentation.servlet.ServletHttpServerTracer", + "io.opentelemetry.javaagent.instrumentation.servlet.v3_0.Servlet3HttpServerTracer", + "io.opentelemetry.javaagent.instrumentation.servlet.v3_0.TagSettingAsyncListener", + packageName + ".JettyHttpServerTracer", + }; + } + + @Override + public List typeInstrumentations() { + return singletonList(new HandlerInstrumentation()); + } + + private static final class HandlerInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return hasClassesNamed("org.eclipse.jetty.server.Handler"); + } + + @Override + public ElementMatcher typeMatcher() { + // skipping built-in handlers, so that for servlets there will be no span started by jetty. + // this is so that the servlet instrumentation will capture contextPath and servletPath + // normally, which the jetty instrumentation does not capture since jetty doesn't populate + // contextPath and servletPath until right before calling the servlet + // (another option is to instrument ServletHolder.handle() to capture those fields) + return not(named("org.eclipse.jetty.server.handler.HandlerWrapper")) + .and(not(named("org.eclipse.jetty.server.handler.ScopedHandler"))) + .and(not(named("org.eclipse.jetty.server.handler.ContextHandler"))) + .and(not(named("org.eclipse.jetty.servlet.ServletHandler"))) + .and(implementsInterface(named("org.eclipse.jetty.server.Handler"))); + } + + @Override + public Map, String> transformers() { + return singletonMap( + named("handle") + // need to capture doHandle() for handlers that extend built-in handlers excluded + // above + .or(named("doHandle")) + .and(takesArgument(0, named("java.lang.String"))) + .and(takesArgument(1, named("org.eclipse.jetty.server.Request"))) + .and(takesArgument(2, named("javax.servlet.http.HttpServletRequest"))) + .and(takesArgument(3, named("javax.servlet.http.HttpServletResponse"))) + .and(isPublic()), + JettyHandlerAdvice.class.getName()); + } + } +} diff --git a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSMessageConsumerInstrumentation.java b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSMessageConsumerInstrumentation.java index e0d9cfef0b..6cfaf3a011 100644 --- a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSMessageConsumerInstrumentation.java +++ b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSMessageConsumerInstrumentation.java @@ -8,15 +8,13 @@ package io.opentelemetry.javaagent.instrumentation.jms; import static io.opentelemetry.javaagent.instrumentation.jms.JMSTracer.tracer; import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; import static io.opentelemetry.javaagent.tooling.bytebuddy.matcher.AgentElementMatchers.implementsInterface; -import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.HashMap; import java.util.Map; import javax.jms.Message; @@ -26,12 +24,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class JMSMessageConsumerInstrumentation extends Instrumenter.Default { - - public JMSMessageConsumerInstrumentation() { - super("jms", "jms-1", "jms-2"); - } +final class JMSMessageConsumerInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -44,16 +37,6 @@ public final class JMSMessageConsumerInstrumentation extends Instrumenter.Defaul return implementsInterface(named("javax.jms.MessageConsumer")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".MessageDestination", - packageName + ".JMSTracer", - packageName + ".MessageExtractAdapter", - packageName + ".MessageInjectAdapter" - }; - } - @Override public Map, String> transformers() { Map, String> transformers = new HashMap<>(); @@ -66,13 +49,6 @@ public final class JMSMessageConsumerInstrumentation extends Instrumenter.Defaul return transformers; } - @Override - public Map contextStore() { - return singletonMap( - "javax.jms.MessageConsumer", - "io.opentelemetry.javaagent.instrumentation.jms.MessageDestination"); - } - public static class ConsumerAdvice { @Advice.OnMethodEnter diff --git a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSMessageListenerInstrumentation.java b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSMessageListenerInstrumentation.java index 4b6695f6af..ce425614d1 100644 --- a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSMessageListenerInstrumentation.java +++ b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSMessageListenerInstrumentation.java @@ -13,10 +13,9 @@ import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; import javax.jms.Message; import net.bytebuddy.asm.Advice; @@ -24,12 +23,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class JMSMessageListenerInstrumentation extends Instrumenter.Default { - - public JMSMessageListenerInstrumentation() { - super("jms", "jms-1", "jms-2"); - } +final class JMSMessageListenerInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -42,16 +36,6 @@ public final class JMSMessageListenerInstrumentation extends Instrumenter.Defaul return implementsInterface(named("javax.jms.MessageListener")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".MessageDestination", - packageName + ".JMSTracer", - packageName + ".MessageExtractAdapter", - packageName + ".MessageInjectAdapter" - }; - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSMessageProducerInstrumentation.java b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSMessageProducerInstrumentation.java index 20b9581c56..f8cd721b30 100644 --- a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSMessageProducerInstrumentation.java +++ b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSMessageProducerInstrumentation.java @@ -12,11 +12,10 @@ import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.CallDepthThreadLocalMap; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.HashMap; import java.util.Map; import javax.jms.Destination; @@ -28,12 +27,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class JMSMessageProducerInstrumentation extends Instrumenter.Default { - - public JMSMessageProducerInstrumentation() { - super("jms", "jms-1", "jms-2"); - } +final class JMSMessageProducerInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -46,16 +40,6 @@ public final class JMSMessageProducerInstrumentation extends Instrumenter.Defaul return implementsInterface(named("javax.jms.MessageProducer")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".MessageDestination", - packageName + ".JMSTracer", - packageName + ".MessageExtractAdapter", - packageName + ".MessageInjectAdapter" - }; - } - @Override public Map, String> transformers() { Map, String> transformers = new HashMap<>(); diff --git a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSSessionInstrumentation.java b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSSessionInstrumentation.java index 94ad3f5082..31576bfea4 100644 --- a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSSessionInstrumentation.java +++ b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JMSSessionInstrumentation.java @@ -12,9 +12,8 @@ import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; import javax.jms.Destination; import javax.jms.MessageConsumer; @@ -23,12 +22,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class JMSSessionInstrumentation extends Instrumenter.Default { - - public JMSSessionInstrumentation() { - super("jms", "jms-1", "jms-2"); - } +final class JMSSessionInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -41,16 +35,6 @@ public final class JMSSessionInstrumentation extends Instrumenter.Default { return implementsInterface(named("javax.jms.Session")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".MessageDestination", - packageName + ".JMSTracer", - packageName + ".MessageExtractAdapter", - packageName + ".MessageInjectAdapter" - }; - } - @Override public Map, String> transformers() { return singletonMap( @@ -60,13 +44,6 @@ public final class JMSSessionInstrumentation extends Instrumenter.Default { JMSSessionInstrumentation.class.getName() + "$ConsumerAdvice"); } - @Override - public Map contextStore() { - return singletonMap( - "javax.jms.MessageConsumer", - "io.opentelemetry.javaagent.instrumentation.jms.MessageDestination"); - } - public static class ConsumerAdvice { @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) diff --git a/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JmsInstrumentationModule.java b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JmsInstrumentationModule.java new file mode 100644 index 0000000000..c15b9cb7b2 --- /dev/null +++ b/instrumentation/jms-1.1/src/main/java/io/opentelemetry/javaagent/instrumentation/jms/JmsInstrumentationModule.java @@ -0,0 +1,46 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.jms; + +import static java.util.Arrays.asList; +import static java.util.Collections.singletonMap; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; +import java.util.Map; + +@AutoService(InstrumentationModule.class) +public class JmsInstrumentationModule extends InstrumentationModule { + public JmsInstrumentationModule() { + super("jms", "jms-1", "jms-2"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + packageName + ".MessageDestination", + packageName + ".JMSTracer", + packageName + ".MessageExtractAdapter", + packageName + ".MessageInjectAdapter" + }; + } + + @Override + public List typeInstrumentations() { + return asList( + new JMSMessageConsumerInstrumentation(), + new JMSMessageListenerInstrumentation(), + new JMSMessageProducerInstrumentation(), + new JMSSessionInstrumentation()); + } + + @Override + public Map contextStore() { + return singletonMap("javax.jms.MessageConsumer", MessageDestination.class.getName()); + } +} diff --git a/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JSPInstrumentation.java b/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/HttpJspPageInstrumentation.java similarity index 85% rename from instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JSPInstrumentation.java rename to instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/HttpJspPageInstrumentation.java index d3051fe207..332d8c2708 100644 --- a/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JSPInstrumentation.java +++ b/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/HttpJspPageInstrumentation.java @@ -13,11 +13,10 @@ import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.Span.Kind; import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; import javax.servlet.http.HttpServletRequest; import net.bytebuddy.asm.Advice; @@ -25,12 +24,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public final class JSPInstrumentation extends Instrumenter.Default { - - public JSPInstrumentation() { - super("jsp", "jsp-render"); - } +final class HttpJspPageInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -43,13 +37,6 @@ public final class JSPInstrumentation extends Instrumenter.Default { return implementsInterface(named("javax.servlet.jsp.HttpJspPage")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".JSPTracer", - }; - } - @Override public Map, String> transformers() { return singletonMap( @@ -57,7 +44,7 @@ public final class JSPInstrumentation extends Instrumenter.Default { .and(takesArgument(0, named("javax.servlet.http.HttpServletRequest"))) .and(takesArgument(1, named("javax.servlet.http.HttpServletResponse"))) .and(isPublic()), - JSPInstrumentation.class.getName() + "$HttpJspPageAdvice"); + HttpJspPageInstrumentation.class.getName() + "$HttpJspPageAdvice"); } public static class HttpJspPageAdvice { diff --git a/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JasperJSPCompilationContextInstrumentation.java b/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspCompilationContextInstrumentation.java similarity index 80% rename from instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JasperJSPCompilationContextInstrumentation.java rename to instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspCompilationContextInstrumentation.java index 557019e064..02f39b1d87 100644 --- a/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JasperJSPCompilationContextInstrumentation.java +++ b/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspCompilationContextInstrumentation.java @@ -11,11 +11,10 @@ import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.Span.Kind; import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.method.MethodDescription; @@ -23,31 +22,18 @@ import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; import org.apache.jasper.JspCompilationContext; -@AutoService(Instrumenter.class) -public final class JasperJSPCompilationContextInstrumentation extends Instrumenter.Default { - - public JasperJSPCompilationContextInstrumentation() { - super("jsp", "jsp-compile"); - } +final class JspCompilationContextInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { return named("org.apache.jasper.JspCompilationContext"); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".JSPTracer", - }; - } - @Override public Map, String> transformers() { return singletonMap( named("compile").and(takesArguments(0)).and(isPublic()), - JasperJSPCompilationContextInstrumentation.class.getName() - + "$JasperJspCompilationContext"); + JspCompilationContextInstrumentation.class.getName() + "$JasperJspCompilationContext"); } public static class JasperJspCompilationContext { diff --git a/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspInstrumentationModule.java b/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspInstrumentationModule.java new file mode 100644 index 0000000000..93fe96f9d9 --- /dev/null +++ b/instrumentation/jsp-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/jsp/JspInstrumentationModule.java @@ -0,0 +1,32 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.jsp; + +import static java.util.Arrays.asList; + +import com.google.auto.service.AutoService; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; + +@AutoService(InstrumentationModule.class) +public class JspInstrumentationModule extends InstrumentationModule { + public JspInstrumentationModule() { + super("jsp"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + packageName + ".JSPTracer", + }; + } + + @Override + public List typeInstrumentations() { + return asList(new HttpJspPageInstrumentation(), new JspCompilationContextInstrumentation()); + } +}