diff --git a/instrumentation/netty/netty-3.8/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/ChannelFutureListenerInstrumentation.java b/instrumentation/netty/netty-3.8/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/ChannelFutureListenerInstrumentation.java index ae0f6575dd..e70d76ae3a 100644 --- a/instrumentation/netty/netty-3.8/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/ChannelFutureListenerInstrumentation.java +++ b/instrumentation/netty/netty-3.8/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/ChannelFutureListenerInstrumentation.java @@ -12,7 +12,6 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod; 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.Context; @@ -20,8 +19,7 @@ import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext; import io.opentelemetry.javaagent.instrumentation.netty.v3_8.client.NettyHttpClientTracer; -import io.opentelemetry.javaagent.tooling.Instrumenter; -import java.util.Collections; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.method.MethodDescription; @@ -30,14 +28,7 @@ import net.bytebuddy.matcher.ElementMatcher; import org.jboss.netty.channel.Channel; import org.jboss.netty.channel.ChannelFuture; -@AutoService(Instrumenter.class) -public class ChannelFutureListenerInstrumentation extends Instrumenter.Default { - - public ChannelFutureListenerInstrumentation() { - super( - NettyChannelPipelineInstrumentation.INSTRUMENTATION_NAME, - NettyChannelPipelineInstrumentation.ADDITIONAL_INSTRUMENTATION_NAMES); - } +final class ChannelFutureListenerInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -50,19 +41,6 @@ public class ChannelFutureListenerInstrumentation extends Instrumenter.Default { return implementsInterface(named("org.jboss.netty.channel.ChannelFutureListener")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".AbstractNettyAdvice", - packageName + ".ChannelTraceContext", - packageName + ".ChannelTraceContext$Factory", - packageName + ".client.NettyHttpClientTracer", - packageName + ".client.NettyResponseInjectAdapter", - packageName + ".server.NettyHttpServerTracer", - packageName + ".server.NettyRequestExtractAdapter" - }; - } - @Override public Map, String> transformers() { return singletonMap( @@ -72,12 +50,6 @@ public class ChannelFutureListenerInstrumentation extends Instrumenter.Default { ChannelFutureListenerInstrumentation.class.getName() + "$OperationCompleteAdvice"); } - @Override - public Map contextStore() { - return Collections.singletonMap( - "org.jboss.netty.channel.Channel", packageName + ".ChannelTraceContext"); - } - public static class OperationCompleteAdvice extends AbstractNettyAdvice { @Advice.OnMethodEnter public static Scope activateScope(@Advice.Argument(0) ChannelFuture future) { diff --git a/instrumentation/netty/netty-3.8/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyChannelInstrumentation.java b/instrumentation/netty/netty-3.8/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyChannelInstrumentation.java index 3b8aea471c..93ce0065e3 100644 --- a/instrumentation/netty/netty-3.8/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyChannelInstrumentation.java +++ b/instrumentation/netty/netty-3.8/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyChannelInstrumentation.java @@ -11,14 +11,12 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.returns; -import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext; import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; -import io.opentelemetry.javaagent.tooling.Instrumenter; -import java.util.Collections; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.HashMap; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -27,13 +25,7 @@ import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; import org.jboss.netty.channel.Channel; -@AutoService(Instrumenter.class) -public class NettyChannelInstrumentation extends Instrumenter.Default { - public NettyChannelInstrumentation() { - super( - NettyChannelPipelineInstrumentation.INSTRUMENTATION_NAME, - NettyChannelPipelineInstrumentation.ADDITIONAL_INSTRUMENTATION_NAMES); - } +final class NettyChannelInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -46,17 +38,6 @@ public class NettyChannelInstrumentation extends Instrumenter.Default { return implementsInterface(named("org.jboss.netty.channel.Channel")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".server.NettyHttpServerTracer", - packageName + ".server.NettyRequestExtractAdapter", - packageName + ".AbstractNettyAdvice", - packageName + ".ChannelTraceContext", - packageName + ".ChannelTraceContext$Factory", - }; - } - @Override public Map, String> transformers() { Map, String> transformers = new HashMap<>(); @@ -68,12 +49,6 @@ public class NettyChannelInstrumentation extends Instrumenter.Default { return transformers; } - @Override - public Map contextStore() { - return Collections.singletonMap( - "org.jboss.netty.channel.Channel", ChannelTraceContext.class.getName()); - } - public static class ChannelConnectAdvice extends AbstractNettyAdvice { @Advice.OnMethodEnter public static void addConnectContinuation(@Advice.This Channel channel) { diff --git a/instrumentation/netty/netty-3.8/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyChannelPipelineInstrumentation.java b/instrumentation/netty/netty-3.8/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyChannelPipelineInstrumentation.java index 4291942aff..61271cfc14 100644 --- a/instrumentation/netty/netty-3.8/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyChannelPipelineInstrumentation.java +++ b/instrumentation/netty/netty-3.8/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyChannelPipelineInstrumentation.java @@ -12,7 +12,6 @@ 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.javaagent.instrumentation.api.CallDepthThreadLocalMap; import io.opentelemetry.javaagent.instrumentation.api.ContextStore; import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext; @@ -22,8 +21,7 @@ import io.opentelemetry.javaagent.instrumentation.netty.v3_8.client.HttpClientTr import io.opentelemetry.javaagent.instrumentation.netty.v3_8.server.HttpServerRequestTracingHandler; import io.opentelemetry.javaagent.instrumentation.netty.v3_8.server.HttpServerResponseTracingHandler; import io.opentelemetry.javaagent.instrumentation.netty.v3_8.server.HttpServerTracingHandler; -import io.opentelemetry.javaagent.tooling.Instrumenter; -import java.util.Collections; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.HashMap; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -40,15 +38,7 @@ import org.jboss.netty.handler.codec.http.HttpResponseDecoder; import org.jboss.netty.handler.codec.http.HttpResponseEncoder; import org.jboss.netty.handler.codec.http.HttpServerCodec; -@AutoService(Instrumenter.class) -public class NettyChannelPipelineInstrumentation extends Instrumenter.Default { - - static final String INSTRUMENTATION_NAME = "netty"; - static final String[] ADDITIONAL_INSTRUMENTATION_NAMES = {"netty-3.8"}; - - public NettyChannelPipelineInstrumentation() { - super(INSTRUMENTATION_NAME, ADDITIONAL_INSTRUMENTATION_NAMES); - } +final class NettyChannelPipelineInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -61,30 +51,6 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default { return implementsInterface(named("org.jboss.netty.channel.ChannelPipeline")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".AbstractNettyAdvice", - packageName + ".ChannelTraceContext", - packageName + ".ChannelTraceContext$Factory", - NettyChannelPipelineInstrumentation.class.getName() + "$ChannelPipelineAdviceUtil", - // Util - packageName + ".util.CombinedSimpleChannelHandler", - // client helpers - packageName + ".client.NettyHttpClientTracer", - packageName + ".client.NettyResponseInjectAdapter", - packageName + ".client.HttpClientRequestTracingHandler", - packageName + ".client.HttpClientResponseTracingHandler", - packageName + ".client.HttpClientTracingHandler", - // server helpers - packageName + ".server.NettyHttpServerTracer", - packageName + ".server.NettyRequestExtractAdapter", - packageName + ".server.HttpServerRequestTracingHandler", - packageName + ".server.HttpServerResponseTracingHandler", - packageName + ".server.HttpServerTracingHandler" - }; - } - @Override public Map, String> transformers() { Map, String> transformers = new HashMap<>(); @@ -101,12 +67,6 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default { return transformers; } - @Override - public Map contextStore() { - return Collections.singletonMap( - "org.jboss.netty.channel.Channel", ChannelTraceContext.class.getName()); - } - /** * When certain handlers are added to the pipeline, we want to add our corresponding tracing * handlers. If those handlers are later removed, we may want to remove our handlers. That is not diff --git a/instrumentation/netty/netty-3.8/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyInstrumentationModule.java b/instrumentation/netty/netty-3.8/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyInstrumentationModule.java new file mode 100644 index 0000000000..8ce1b4559d --- /dev/null +++ b/instrumentation/netty/netty-3.8/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v3_8/NettyInstrumentationModule.java @@ -0,0 +1,59 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.netty.v3_8; + +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.Collections; +import java.util.List; +import java.util.Map; + +@AutoService(InstrumentationModule.class) +public class NettyInstrumentationModule extends InstrumentationModule { + public NettyInstrumentationModule() { + super("netty", "netty-3.8"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + packageName + ".ChannelTraceContext", + packageName + ".ChannelTraceContext$Factory", + NettyChannelPipelineInstrumentation.class.getName() + "$ChannelPipelineAdviceUtil", + // Util + packageName + ".util.CombinedSimpleChannelHandler", + // client helpers + packageName + ".client.NettyHttpClientTracer", + packageName + ".client.NettyResponseInjectAdapter", + packageName + ".client.HttpClientRequestTracingHandler", + packageName + ".client.HttpClientResponseTracingHandler", + packageName + ".client.HttpClientTracingHandler", + // server helpers + packageName + ".server.NettyHttpServerTracer", + packageName + ".server.NettyRequestExtractAdapter", + packageName + ".server.HttpServerRequestTracingHandler", + packageName + ".server.HttpServerResponseTracingHandler", + packageName + ".server.HttpServerTracingHandler" + }; + } + + @Override + public List typeInstrumentations() { + return asList( + new ChannelFutureListenerInstrumentation(), + new NettyChannelInstrumentation(), + new NettyChannelPipelineInstrumentation()); + } + + @Override + public Map contextStore() { + return Collections.singletonMap( + "org.jboss.netty.channel.Channel", ChannelTraceContext.class.getName()); + } +} diff --git a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/ChannelFutureListenerInstrumentation.java b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/ChannelFutureListenerInstrumentation.java index d3b17c96a2..4ba4e9833d 100644 --- a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/ChannelFutureListenerInstrumentation.java +++ b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/ChannelFutureListenerInstrumentation.java @@ -12,28 +12,20 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import com.google.auto.service.AutoService; import io.netty.channel.ChannelFuture; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.Span.Kind; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.netty.v4_0.client.NettyHttpClientTracer; -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; -@AutoService(Instrumenter.class) -public class ChannelFutureListenerInstrumentation extends Instrumenter.Default { - - public ChannelFutureListenerInstrumentation() { - super( - NettyChannelPipelineInstrumentation.INSTRUMENTATION_NAME, - NettyChannelPipelineInstrumentation.ADDITIONAL_INSTRUMENTATION_NAMES); - } +final class ChannelFutureListenerInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -46,26 +38,6 @@ public class ChannelFutureListenerInstrumentation extends Instrumenter.Default { return implementsInterface(named("io.netty.channel.ChannelFutureListener")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".AttributeKeys", - packageName + ".AttributeKeys$1", - // client helpers - packageName + ".client.NettyHttpClientTracer", - packageName + ".client.NettyResponseInjectAdapter", - packageName + ".client.HttpClientRequestTracingHandler", - packageName + ".client.HttpClientResponseTracingHandler", - packageName + ".client.HttpClientTracingHandler", - // server helpers - packageName + ".server.NettyHttpServerTracer", - packageName + ".server.NettyRequestExtractAdapter", - packageName + ".server.HttpServerRequestTracingHandler", - packageName + ".server.HttpServerResponseTracingHandler", - packageName + ".server.HttpServerTracingHandler" - }; - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/NettyChannelPipelineInstrumentation.java b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/NettyChannelPipelineInstrumentation.java index 1ddbce27ed..8e5494121a 100644 --- a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/NettyChannelPipelineInstrumentation.java +++ b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/NettyChannelPipelineInstrumentation.java @@ -13,7 +13,6 @@ 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.netty.channel.ChannelHandler; import io.netty.channel.ChannelPipeline; import io.netty.handler.codec.http.HttpClientCodec; @@ -32,7 +31,7 @@ import io.opentelemetry.javaagent.instrumentation.netty.v4_0.client.HttpClientTr import io.opentelemetry.javaagent.instrumentation.netty.v4_0.server.HttpServerRequestTracingHandler; import io.opentelemetry.javaagent.instrumentation.netty.v4_0.server.HttpServerResponseTracingHandler; import io.opentelemetry.javaagent.instrumentation.netty.v4_0.server.HttpServerTracingHandler; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.HashMap; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -40,15 +39,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public class NettyChannelPipelineInstrumentation extends Instrumenter.Default { - - static final String INSTRUMENTATION_NAME = "netty"; - static final String[] ADDITIONAL_INSTRUMENTATION_NAMES = {"netty-4.0"}; - - public NettyChannelPipelineInstrumentation() { - super(INSTRUMENTATION_NAME, ADDITIONAL_INSTRUMENTATION_NAMES); - } +final class NettyChannelPipelineInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -61,26 +52,6 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default { return implementsInterface(named("io.netty.channel.ChannelPipeline")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".AttributeKeys", - packageName + ".AttributeKeys$1", - // client helpers - packageName + ".client.NettyHttpClientTracer", - packageName + ".client.NettyResponseInjectAdapter", - packageName + ".client.HttpClientRequestTracingHandler", - packageName + ".client.HttpClientResponseTracingHandler", - packageName + ".client.HttpClientTracingHandler", - // server helpers - packageName + ".server.NettyHttpServerTracer", - packageName + ".server.NettyRequestExtractAdapter", - packageName + ".server.HttpServerRequestTracingHandler", - packageName + ".server.HttpServerResponseTracingHandler", - packageName + ".server.HttpServerTracingHandler" - }; - } - @Override public Map, String> transformers() { Map, String> transformers = new HashMap<>(); diff --git a/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/NettyInstrumentationModule.java b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/NettyInstrumentationModule.java new file mode 100644 index 0000000000..b8641cac8e --- /dev/null +++ b/instrumentation/netty/netty-4.0/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_0/NettyInstrumentationModule.java @@ -0,0 +1,46 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.netty.v4_0; + +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 NettyInstrumentationModule extends InstrumentationModule { + public NettyInstrumentationModule() { + super("netty", "netty-4.0"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + packageName + ".AttributeKeys", + packageName + ".AttributeKeys$1", + // client helpers + packageName + ".client.NettyHttpClientTracer", + packageName + ".client.NettyResponseInjectAdapter", + packageName + ".client.HttpClientRequestTracingHandler", + packageName + ".client.HttpClientResponseTracingHandler", + packageName + ".client.HttpClientTracingHandler", + // server helpers + packageName + ".server.NettyHttpServerTracer", + packageName + ".server.NettyRequestExtractAdapter", + packageName + ".server.HttpServerRequestTracingHandler", + packageName + ".server.HttpServerResponseTracingHandler", + packageName + ".server.HttpServerTracingHandler" + }; + } + + @Override + public List typeInstrumentations() { + return asList( + new ChannelFutureListenerInstrumentation(), new NettyChannelPipelineInstrumentation()); + } +} diff --git a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/ChannelFutureListenerInstrumentation.java b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/ChannelFutureListenerInstrumentation.java index b6d75bc15f..821d086340 100644 --- a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/ChannelFutureListenerInstrumentation.java +++ b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/ChannelFutureListenerInstrumentation.java @@ -12,28 +12,20 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import com.google.auto.service.AutoService; import io.netty.channel.ChannelFuture; import io.opentelemetry.api.trace.Span; import io.opentelemetry.api.trace.Span.Kind; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.netty.v4_1.client.NettyHttpClientTracer; -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; -@AutoService(Instrumenter.class) -public class ChannelFutureListenerInstrumentation extends Instrumenter.Default { - - public ChannelFutureListenerInstrumentation() { - super( - NettyChannelPipelineInstrumentation.INSTRUMENTATION_NAME, - NettyChannelPipelineInstrumentation.ADDITIONAL_INSTRUMENTATION_NAMES); - } +final class ChannelFutureListenerInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -46,26 +38,6 @@ public class ChannelFutureListenerInstrumentation extends Instrumenter.Default { return implementsInterface(named("io.netty.channel.ChannelFutureListener")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".AttributeKeys", - packageName + ".AttributeKeys$1", - // client helpers - packageName + ".client.NettyHttpClientTracer", - packageName + ".client.NettyResponseInjectAdapter", - packageName + ".client.HttpClientRequestTracingHandler", - packageName + ".client.HttpClientResponseTracingHandler", - packageName + ".client.HttpClientTracingHandler", - // server helpers - packageName + ".server.NettyHttpServerTracer", - packageName + ".server.NettyRequestExtractAdapter", - packageName + ".server.HttpServerRequestTracingHandler", - packageName + ".server.HttpServerResponseTracingHandler", - packageName + ".server.HttpServerTracingHandler" - }; - } - @Override public Map, String> transformers() { return singletonMap( diff --git a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyChannelPipelineInstrumentation.java b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyChannelPipelineInstrumentation.java index 180d48a665..95d0ea9dd2 100644 --- a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyChannelPipelineInstrumentation.java +++ b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyChannelPipelineInstrumentation.java @@ -13,7 +13,6 @@ 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.netty.channel.ChannelHandler; import io.netty.channel.ChannelPipeline; import io.netty.handler.codec.http.HttpClientCodec; @@ -32,7 +31,7 @@ import io.opentelemetry.javaagent.instrumentation.netty.v4_1.client.HttpClientTr import io.opentelemetry.javaagent.instrumentation.netty.v4_1.server.HttpServerRequestTracingHandler; import io.opentelemetry.javaagent.instrumentation.netty.v4_1.server.HttpServerResponseTracingHandler; import io.opentelemetry.javaagent.instrumentation.netty.v4_1.server.HttpServerTracingHandler; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.HashMap; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -40,15 +39,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public class NettyChannelPipelineInstrumentation extends Instrumenter.Default { - - static final String INSTRUMENTATION_NAME = "netty"; - static final String[] ADDITIONAL_INSTRUMENTATION_NAMES = {"netty-4.1"}; - - public NettyChannelPipelineInstrumentation() { - super(INSTRUMENTATION_NAME, ADDITIONAL_INSTRUMENTATION_NAMES); - } +final class NettyChannelPipelineInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderMatcher() { @@ -61,26 +52,6 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default { return implementsInterface(named("io.netty.channel.ChannelPipeline")); } - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".AttributeKeys", - packageName + ".AttributeKeys$1", - // client helpers - packageName + ".client.NettyHttpClientTracer", - packageName + ".client.NettyResponseInjectAdapter", - packageName + ".client.HttpClientRequestTracingHandler", - packageName + ".client.HttpClientResponseTracingHandler", - packageName + ".client.HttpClientTracingHandler", - // server helpers - packageName + ".server.NettyHttpServerTracer", - packageName + ".server.NettyRequestExtractAdapter", - packageName + ".server.HttpServerRequestTracingHandler", - packageName + ".server.HttpServerResponseTracingHandler", - packageName + ".server.HttpServerTracingHandler" - }; - } - @Override public Map, String> transformers() { Map, String> transformers = new HashMap<>(); diff --git a/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyInstrumentationModule.java b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyInstrumentationModule.java new file mode 100644 index 0000000000..b604fa6dd4 --- /dev/null +++ b/instrumentation/netty/netty-4.1/src/main/java/io/opentelemetry/javaagent/instrumentation/netty/v4_1/NettyInstrumentationModule.java @@ -0,0 +1,46 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.netty.v4_1; + +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 NettyInstrumentationModule extends InstrumentationModule { + public NettyInstrumentationModule() { + super("netty", "netty-4.1"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + packageName + ".AttributeKeys", + packageName + ".AttributeKeys$1", + // client helpers + packageName + ".client.NettyHttpClientTracer", + packageName + ".client.NettyResponseInjectAdapter", + packageName + ".client.HttpClientRequestTracingHandler", + packageName + ".client.HttpClientResponseTracingHandler", + packageName + ".client.HttpClientTracingHandler", + // server helpers + packageName + ".server.NettyHttpServerTracer", + packageName + ".server.NettyRequestExtractAdapter", + packageName + ".server.HttpServerRequestTracingHandler", + packageName + ".server.HttpServerResponseTracingHandler", + packageName + ".server.HttpServerTracingHandler" + }; + } + + @Override + public List typeInstrumentations() { + return asList( + new ChannelFutureListenerInstrumentation(), new NettyChannelPipelineInstrumentation()); + } +} diff --git a/instrumentation/okhttp/okhttp-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttp2Instrumentation.java b/instrumentation/okhttp/okhttp-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttp2InstrumentationModule.java similarity index 57% rename from instrumentation/okhttp/okhttp-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttp2Instrumentation.java rename to instrumentation/okhttp/okhttp-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttp2InstrumentationModule.java index b1814856b7..5121ad7c91 100644 --- a/instrumentation/okhttp/okhttp-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttp2Instrumentation.java +++ b/instrumentation/okhttp/okhttp-2.2/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v2_2/OkHttp2InstrumentationModule.java @@ -5,31 +5,29 @@ package io.opentelemetry.javaagent.instrumentation.okhttp.v2_2; +import static java.util.Collections.singletonList; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import com.squareup.okhttp.Interceptor; import com.squareup.okhttp.OkHttpClient; -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.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 class OkHttp2Instrumentation extends Instrumenter.Default { - public OkHttp2Instrumentation() { +@AutoService(InstrumentationModule.class) +public class OkHttp2InstrumentationModule extends InstrumentationModule { + public OkHttp2InstrumentationModule() { super("okhttp", "okhttp-2"); } - @Override - public ElementMatcher typeMatcher() { - return named("com.squareup.okhttp.OkHttpClient"); - } - @Override public String[] helperClassNames() { return new String[] { @@ -40,9 +38,21 @@ public class OkHttp2Instrumentation extends Instrumenter.Default { } @Override - public Map, String> transformers() { - return Collections.singletonMap( - isConstructor(), OkHttp2Instrumentation.class.getName() + "$OkHttp2ClientAdvice"); + public List typeInstrumentations() { + return singletonList(new OkHttpClientInstrumentation()); + } + + private static final class OkHttpClientInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return named("com.squareup.okhttp.OkHttpClient"); + } + + @Override + public Map, String> transformers() { + return Collections.singletonMap( + isConstructor(), OkHttp2InstrumentationModule.class.getName() + "$OkHttp2ClientAdvice"); + } } public static class OkHttp2ClientAdvice { diff --git a/instrumentation/okhttp/okhttp-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Instrumentation.java b/instrumentation/okhttp/okhttp-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3InstrumentationModule.java similarity index 59% rename from instrumentation/okhttp/okhttp-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Instrumentation.java rename to instrumentation/okhttp/okhttp-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3InstrumentationModule.java index 1641766a17..ccc82103ed 100644 --- a/instrumentation/okhttp/okhttp-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3Instrumentation.java +++ b/instrumentation/okhttp/okhttp-3.0/src/main/java/io/opentelemetry/javaagent/instrumentation/okhttp/v3_0/OkHttp3InstrumentationModule.java @@ -5,13 +5,16 @@ package io.opentelemetry.javaagent.instrumentation.okhttp.v3_0; +import static java.util.Collections.singletonList; import static java.util.Collections.singletonMap; import static net.bytebuddy.matcher.ElementMatchers.isConstructor; import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; 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 net.bytebuddy.asm.Advice; import net.bytebuddy.description.method.MethodDescription; @@ -20,18 +23,13 @@ import net.bytebuddy.matcher.ElementMatcher; import okhttp3.Interceptor; import okhttp3.OkHttpClient; -@AutoService(Instrumenter.class) -public class OkHttp3Instrumentation extends Instrumenter.Default { +@AutoService(InstrumentationModule.class) +public class OkHttp3InstrumentationModule extends InstrumentationModule { - public OkHttp3Instrumentation() { + public OkHttp3InstrumentationModule() { super("okhttp", "okhttp-3"); } - @Override - public ElementMatcher typeMatcher() { - return named("okhttp3.OkHttpClient"); - } - @Override public String[] helperClassNames() { return new String[] { @@ -42,10 +40,22 @@ public class OkHttp3Instrumentation extends Instrumenter.Default { } @Override - public Map, String> transformers() { - return singletonMap( - isConstructor().and(takesArgument(0, named("okhttp3.OkHttpClient$Builder"))), - OkHttp3Instrumentation.class.getName() + "$OkHttp3Advice"); + public List typeInstrumentations() { + return singletonList(new OkHttpClientInstrumentation()); + } + + private static final class OkHttpClientInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher typeMatcher() { + return named("okhttp3.OkHttpClient"); + } + + @Override + public Map, String> transformers() { + return singletonMap( + isConstructor().and(takesArgument(0, named("okhttp3.OkHttpClient$Builder"))), + OkHttp3InstrumentationModule.class.getName() + "$OkHttp3Advice"); + } } public static class OkHttp3Advice { diff --git a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/BaggageUtilsInstrumentation.java b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/BaggageUtilsInstrumentation.java index cc5364389c..6b955a30c7 100644 --- a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/BaggageUtilsInstrumentation.java +++ b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/BaggageUtilsInstrumentation.java @@ -12,9 +12,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import application.io.opentelemetry.context.Context; -import com.google.auto.service.AutoService; import io.opentelemetry.api.baggage.Baggage; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.HashMap; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -25,8 +24,7 @@ import net.bytebuddy.matcher.ElementMatcher; // TODO: Actually bridge correlation context. We currently just stub out withBaggage // to have minimum functionality with SDK shim implementations. // https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/973 -@AutoService(Instrumenter.class) -public class BaggageUtilsInstrumentation extends AbstractInstrumentation { +final class BaggageUtilsInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { return named("application.io.opentelemetry.api.baggage.BaggageUtils"); diff --git a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/ContextInstrumentation.java b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/ContextInstrumentation.java index 5cb4f15a31..fcdcc5824f 100644 --- a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/ContextInstrumentation.java +++ b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/ContextInstrumentation.java @@ -11,9 +11,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import application.io.opentelemetry.context.Context; import application.io.opentelemetry.context.ContextStorage; -import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.context.AgentContextStorage; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Collections; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -27,8 +26,7 @@ import net.bytebuddy.matcher.ElementMatcher; * sure there is no dependency on a system property or possibility of a user overriding this since * it's required for instrumentation in the agent to work properly. */ -@AutoService(Instrumenter.class) -public class ContextInstrumentation extends AbstractInstrumentation { +final class ContextInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { diff --git a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/ContextStorageInstrumentation.java b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/ContextStorageInstrumentation.java index 0d60a66dd0..bb1d2a4667 100644 --- a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/ContextStorageInstrumentation.java +++ b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/ContextStorageInstrumentation.java @@ -10,9 +10,8 @@ import static net.bytebuddy.matcher.ElementMatchers.isStatic; import static net.bytebuddy.matcher.ElementMatchers.named; import application.io.opentelemetry.context.ContextStorage; -import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.context.AgentContextStorage; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Collections; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -26,8 +25,7 @@ import net.bytebuddy.matcher.ElementMatcher; * sure there is no dependency on a system property or possibility of a user overriding this since * it's required for instrumentation in the agent to work properly. */ -@AutoService(Instrumenter.class) -public class ContextStorageInstrumentation extends AbstractInstrumentation { +final class ContextStorageInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { diff --git a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/AbstractInstrumentation.java b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/OpenTelemetryApiInstrumentationModule.java similarity index 86% rename from instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/AbstractInstrumentation.java rename to instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/OpenTelemetryApiInstrumentationModule.java index 0728d4b849..e79a1ffecd 100644 --- a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/AbstractInstrumentation.java +++ b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/OpenTelemetryApiInstrumentationModule.java @@ -5,10 +5,16 @@ package io.opentelemetry.javaagent.instrumentation.opentelemetryapi; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import static java.util.Arrays.asList; -public abstract class AbstractInstrumentation extends Instrumenter.Default { - public AbstractInstrumentation() { +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 OpenTelemetryApiInstrumentationModule extends InstrumentationModule { + public OpenTelemetryApiInstrumentationModule() { super("opentelemetry-api"); } @@ -80,4 +86,14 @@ public abstract class AbstractInstrumentation extends Instrumenter.Default { packageName + ".LabelBridging" }; } + + @Override + public List typeInstrumentations() { + return asList( + new BaggageUtilsInstrumentation(), + new ContextInstrumentation(), + new ContextStorageInstrumentation(), + new OpenTelemetryInstrumentation(), + new SpanInstrumentation()); + } } diff --git a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/OpenTelemetryApiInstrumentation.java b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/OpenTelemetryInstrumentation.java similarity index 86% rename from instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/OpenTelemetryApiInstrumentation.java rename to instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/OpenTelemetryInstrumentation.java index 76d0f78244..42def2c824 100644 --- a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/OpenTelemetryApiInstrumentation.java +++ b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/OpenTelemetryInstrumentation.java @@ -12,11 +12,10 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import application.io.opentelemetry.api.metrics.MeterProvider; import application.io.opentelemetry.context.propagation.ContextPropagators; -import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.context.propagation.ApplicationContextPropagators; import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.metrics.ApplicationMeterProvider; import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.trace.ApplicationTracerProvider; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.HashMap; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -24,8 +23,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public class OpenTelemetryApiInstrumentation extends AbstractInstrumentation { +final class OpenTelemetryInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { @@ -37,13 +35,13 @@ public class OpenTelemetryApiInstrumentation extends AbstractInstrumentation { Map, String> transformers = new HashMap<>(); transformers.put( isMethod().and(isPublic()).and(named("getGlobalTracerProvider")).and(takesArguments(0)), - OpenTelemetryApiInstrumentation.class.getName() + "$GetTracerProviderAdvice"); + OpenTelemetryInstrumentation.class.getName() + "$GetTracerProviderAdvice"); transformers.put( isMethod().and(isPublic()).and(named("getGlobalMeterProvider")).and(takesArguments(0)), - OpenTelemetryApiInstrumentation.class.getName() + "$GetMeterProviderAdvice"); + OpenTelemetryInstrumentation.class.getName() + "$GetMeterProviderAdvice"); transformers.put( isMethod().and(isPublic()).and(named("getGlobalPropagators")).and(takesArguments(0)), - OpenTelemetryApiInstrumentation.class.getName() + "$GetPropagatorsAdvice"); + OpenTelemetryInstrumentation.class.getName() + "$GetPropagatorsAdvice"); return transformers; } diff --git a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/SpanInstrumentation.java b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/SpanInstrumentation.java index 070fce6b9c..ddf35a1a3e 100644 --- a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/SpanInstrumentation.java +++ b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/SpanInstrumentation.java @@ -11,9 +11,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import application.io.opentelemetry.api.trace.Span; import application.io.opentelemetry.api.trace.SpanContext; -import com.google.auto.service.AutoService; import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.trace.Bridging; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Collections; import java.util.Map; import net.bytebuddy.asm.Advice; @@ -21,8 +20,7 @@ import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -@AutoService(Instrumenter.class) -public class SpanInstrumentation extends AbstractInstrumentation { +final class SpanInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { return named("application.io.opentelemetry.api.trace.PropagatedSpan"); diff --git a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/anotations/AbstractTraceAnnotationInstrumentation.java b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/anotations/AbstractTraceAnnotationInstrumentation.java deleted file mode 100644 index 7ac8dab75c..0000000000 --- a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/anotations/AbstractTraceAnnotationInstrumentation.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.anotations; - -import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy; -import static net.bytebuddy.matcher.ElementMatchers.none; - -import io.opentelemetry.instrumentation.api.config.Config; -import io.opentelemetry.instrumentation.api.config.MethodsConfigurationParser; -import io.opentelemetry.javaagent.tooling.Instrumenter; -import java.util.Map; -import java.util.Set; -import net.bytebuddy.description.ByteCodeElement; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; -import net.bytebuddy.matcher.ElementMatchers; - -public abstract class AbstractTraceAnnotationInstrumentation extends Instrumenter.Default { - private static final String TRACE_ANNOTATED_METHODS_EXCLUDE_CONFIG = - "otel.trace.annotated.methods.exclude"; - - public AbstractTraceAnnotationInstrumentation( - String instrumentationName, String... additionalNames) { - super(instrumentationName, additionalNames); - } - - /* - Returns a matcher for all methods that should be excluded from auto-instrumentation by - annotation-based advices. - */ - ElementMatcher.Junction configureExcludedMethods() { - ElementMatcher.Junction result = none(); - - Map> excludedMethods = - MethodsConfigurationParser.parse( - Config.get().getProperty(TRACE_ANNOTATED_METHODS_EXCLUDE_CONFIG)); - for (Map.Entry> entry : excludedMethods.entrySet()) { - String className = entry.getKey(); - ElementMatcher.Junction classMather = - isDeclaredBy(ElementMatchers.named(className)); - - ElementMatcher.Junction excludedMethodsMatcher = none(); - for (String methodName : entry.getValue()) { - excludedMethodsMatcher = excludedMethodsMatcher.or(ElementMatchers.named(methodName)); - } - - result = result.or(classMather.and(excludedMethodsMatcher)); - } - - return result; - } -} diff --git a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/anotations/WithSpanAdvice.java b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/anotations/WithSpanAdvice.java index 3c108235f7..391720a2f7 100644 --- a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/anotations/WithSpanAdvice.java +++ b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/anotations/WithSpanAdvice.java @@ -16,7 +16,7 @@ import net.bytebuddy.asm.Advice; /** * Instrumentation for methods annotated with {@link WithSpan} annotation. * - * @see WithSpanAnnotationInstrumentation + * @see WithSpanAnnotationInstrumentationModule */ public class WithSpanAdvice { diff --git a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/anotations/WithSpanAnnotationInstrumentation.java b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/anotations/WithSpanAnnotationInstrumentation.java deleted file mode 100644 index c0dbf54a6e..0000000000 --- a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/anotations/WithSpanAnnotationInstrumentation.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.anotations; - -import static java.util.Collections.singletonMap; -import static net.bytebuddy.matcher.ElementMatchers.declaresMethod; -import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; -import static net.bytebuddy.matcher.ElementMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.not; - -import application.io.opentelemetry.extension.auto.annotations.WithSpan; -import com.google.auto.service.AutoService; -import io.opentelemetry.javaagent.tooling.Instrumenter; -import java.util.Map; -import net.bytebuddy.description.annotation.AnnotationSource; -import net.bytebuddy.description.method.MethodDescription; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -/** Instrumentation for methods annotated with {@link WithSpan} annotation. */ -@AutoService(Instrumenter.class) -public final class WithSpanAnnotationInstrumentation - extends AbstractTraceAnnotationInstrumentation { - - private final ElementMatcher.Junction annotatedMethodMatcher; - /* - This matcher matches all methods that should be excluded from transformation - */ - private final ElementMatcher.Junction excludedMethodsMatcher; - - public WithSpanAnnotationInstrumentation() { - super("trace", "with-span-annotation"); - annotatedMethodMatcher = - isAnnotatedWith(named("application.io.opentelemetry.extension.auto.annotations.WithSpan")); - excludedMethodsMatcher = configureExcludedMethods(); - } - - @Override - public ElementMatcher typeMatcher() { - return declaresMethod(annotatedMethodMatcher); - } - - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".TraceAnnotationTracer", - }; - } - - @Override - public Map, String> transformers() { - return singletonMap( - annotatedMethodMatcher.and(not(excludedMethodsMatcher)), packageName + ".WithSpanAdvice"); - } -} diff --git a/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/anotations/WithSpanAnnotationInstrumentationModule.java b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/anotations/WithSpanAnnotationInstrumentationModule.java new file mode 100644 index 0000000000..6a2523be10 --- /dev/null +++ b/instrumentation/opentelemetry-api-beta/src/main/java/io/opentelemetry/javaagent/instrumentation/opentelemetryapi/anotations/WithSpanAnnotationInstrumentationModule.java @@ -0,0 +1,105 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.opentelemetryapi.anotations; + +import static java.util.Collections.singletonList; +import static java.util.Collections.singletonMap; +import static net.bytebuddy.matcher.ElementMatchers.declaresMethod; +import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith; +import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy; +import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.none; +import static net.bytebuddy.matcher.ElementMatchers.not; + +import application.io.opentelemetry.extension.auto.annotations.WithSpan; +import com.google.auto.service.AutoService; +import io.opentelemetry.instrumentation.api.config.Config; +import io.opentelemetry.instrumentation.api.config.MethodsConfigurationParser; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; +import java.util.Map; +import java.util.Set; +import net.bytebuddy.description.ByteCodeElement; +import net.bytebuddy.description.annotation.AnnotationSource; +import net.bytebuddy.description.method.MethodDescription; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; +import net.bytebuddy.matcher.ElementMatchers; + +/** Instrumentation for methods annotated with {@link WithSpan} annotation. */ +@AutoService(InstrumentationModule.class) +public final class WithSpanAnnotationInstrumentationModule extends InstrumentationModule { + + private static final String TRACE_ANNOTATED_METHODS_EXCLUDE_CONFIG = + "otel.trace.annotated.methods.exclude"; + + public WithSpanAnnotationInstrumentationModule() { + super("trace", "with-span-annotation"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + packageName + ".TraceAnnotationTracer", + }; + } + + @Override + public List typeInstrumentations() { + return singletonList(new AnnotatedMethodInstrumentation()); + } + + private static final class AnnotatedMethodInstrumentation implements TypeInstrumentation { + private final ElementMatcher.Junction annotatedMethodMatcher; + /** This matcher matches all methods that should be excluded from transformation */ + private final ElementMatcher.Junction excludedMethodsMatcher; + + AnnotatedMethodInstrumentation() { + annotatedMethodMatcher = + isAnnotatedWith( + named("application.io.opentelemetry.extension.auto.annotations.WithSpan")); + excludedMethodsMatcher = configureExcludedMethods(); + } + + @Override + public ElementMatcher typeMatcher() { + return declaresMethod(annotatedMethodMatcher); + } + + @Override + public Map, String> transformers() { + return singletonMap( + annotatedMethodMatcher.and(not(excludedMethodsMatcher)), WithSpanAdvice.class.getName()); + } + + /* + Returns a matcher for all methods that should be excluded from auto-instrumentation by + annotation-based advices. + */ + static ElementMatcher.Junction configureExcludedMethods() { + ElementMatcher.Junction result = none(); + + Map> excludedMethods = + MethodsConfigurationParser.parse( + Config.get().getProperty(TRACE_ANNOTATED_METHODS_EXCLUDE_CONFIG)); + for (Map.Entry> entry : excludedMethods.entrySet()) { + String className = entry.getKey(); + ElementMatcher.Junction classMather = + isDeclaredBy(ElementMatchers.named(className)); + + ElementMatcher.Junction excludedMethodsMatcher = none(); + for (String methodName : entry.getValue()) { + excludedMethodsMatcher = excludedMethodsMatcher.or(ElementMatchers.named(methodName)); + } + + result = result.or(classMather.and(excludedMethodsMatcher)); + } + + return result; + } + } +} diff --git a/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiInstrumentation.java b/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiInstrumentationModule.java similarity index 59% rename from instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiInstrumentation.java rename to instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiInstrumentationModule.java index 94e161dd15..2b455b0e7a 100644 --- a/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiInstrumentation.java +++ b/instrumentation/oshi/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/oshi/OshiInstrumentationModule.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.oshi; import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed; +import static java.util.Collections.singletonList; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isPublic; import static net.bytebuddy.matcher.ElementMatchers.isStatic; @@ -13,31 +14,23 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import com.google.auto.service.AutoService; import io.opentelemetry.instrumentation.oshi.SystemMetrics; -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.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 class OshiInstrumentation extends Instrumenter.Default { +@AutoService(InstrumentationModule.class) +public class OshiInstrumentationModule extends InstrumentationModule { - public OshiInstrumentation() { + public OshiInstrumentationModule() { super("oshi"); } - @Override - public ElementMatcher classLoaderMatcher() { - return hasClassesNamed("oshi.SystemInfo"); - } - - @Override - public ElementMatcher typeMatcher() { - return named("oshi.SystemInfo"); - } - @Override public final String[] helperClassNames() { return new String[] { @@ -53,10 +46,27 @@ public class OshiInstrumentation extends Instrumenter.Default { } @Override - public Map, String> transformers() { - return Collections.singletonMap( - isMethod().and(isPublic()).and(isStatic()).and(named("getCurrentPlatformEnum")), - OshiInstrumentation.class.getName() + "$OshiInstrumentationAdvice"); + public List typeInstrumentations() { + return singletonList(new SystemInfoInstrumentation()); + } + + private static final class SystemInfoInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher classLoaderMatcher() { + return hasClassesNamed("oshi.SystemInfo"); + } + + @Override + public ElementMatcher typeMatcher() { + return named("oshi.SystemInfo"); + } + + @Override + public Map, String> transformers() { + return Collections.singletonMap( + isMethod().and(isPublic()).and(isStatic()).and(named("getCurrentPlatformEnum")), + OshiInstrumentationModule.class.getName() + "$OshiInstrumentationAdvice"); + } } public static class OshiInstrumentationAdvice { diff --git a/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayWSClientInstrumentation.java b/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayWsInstrumentationModule.java similarity index 64% rename from instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayWSClientInstrumentation.java rename to instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayWsInstrumentationModule.java index 6b4e4c1571..b9d7347fb8 100644 --- a/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayWSClientInstrumentation.java +++ b/instrumentation/play-ws/play-ws-1.0/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v1_0/PlayWsInstrumentationModule.java @@ -6,27 +6,49 @@ package io.opentelemetry.javaagent.instrumentation.playws.v1_0; import static io.opentelemetry.javaagent.instrumentation.playws.PlayWSClientTracer.tracer; +import static java.util.Collections.singletonList; import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; -import io.opentelemetry.javaagent.instrumentation.playws.BasePlayWSClientInstrumentation; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.instrumentation.playws.AsyncHttpClientInstrumentation; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; import net.bytebuddy.asm.Advice; import play.shaded.ahc.org.asynchttpclient.AsyncHandler; import play.shaded.ahc.org.asynchttpclient.Request; import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler; import play.shaded.ahc.org.asynchttpclient.ws.WebSocketUpgradeHandler; -@AutoService(Instrumenter.class) -public class PlayWSClientInstrumentation extends BasePlayWSClientInstrumentation { +@AutoService(InstrumentationModule.class) +public class PlayWsInstrumentationModule extends InstrumentationModule { + public PlayWsInstrumentationModule() { + super("play-ws"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + "io.opentelemetry.javaagent.instrumentation.playws.PlayWSClientTracer", + "io.opentelemetry.javaagent.instrumentation.playws.HeadersInjectAdapter", + packageName + ".AsyncHandlerWrapper", + packageName + ".StreamedAsyncHandlerWrapper" + }; + } + + @Override + public List typeInstrumentations() { + return singletonList(new AsyncHttpClientInstrumentation(ClientAdvice.class.getName())); + } + public static class ClientAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void methodEnter( @Advice.Argument(0) Request request, - @Advice.Argument(value = 1, readOnly = false) AsyncHandler asyncHandler, + @Advice.Argument(value = 1, readOnly = false) AsyncHandler asyncHandler, @Advice.Local("otelSpan") Span span, @Advice.Local("otelScope") Scope scope) { Context parentContext = Java8BytecodeBridge.currentContext(); @@ -37,7 +59,7 @@ public class PlayWSClientInstrumentation extends BasePlayWSClientInstrumentation if (asyncHandler instanceof StreamedAsyncHandler) { asyncHandler = new StreamedAsyncHandlerWrapper( - (StreamedAsyncHandler) asyncHandler, span, parentContext); + (StreamedAsyncHandler) asyncHandler, span, parentContext); } else if (!(asyncHandler instanceof WebSocketUpgradeHandler)) { // websocket upgrade handlers aren't supported asyncHandler = new AsyncHandlerWrapper(asyncHandler, span, parentContext); diff --git a/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayWSClientInstrumentation.java b/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayWsInstrumentationModule.java similarity index 60% rename from instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayWSClientInstrumentation.java rename to instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayWsInstrumentationModule.java index ac67fe6d01..07a884f82c 100644 --- a/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayWSClientInstrumentation.java +++ b/instrumentation/play-ws/play-ws-2.0/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v2_0/PlayWsInstrumentationModule.java @@ -6,25 +6,47 @@ package io.opentelemetry.javaagent.instrumentation.playws.v2_0; import static io.opentelemetry.javaagent.instrumentation.playws.PlayWSClientTracer.tracer; +import static java.util.Collections.singletonList; import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.instrumentation.playws.BasePlayWSClientInstrumentation; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.instrumentation.playws.AsyncHttpClientInstrumentation; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; import net.bytebuddy.asm.Advice; import play.shaded.ahc.org.asynchttpclient.AsyncHandler; import play.shaded.ahc.org.asynchttpclient.Request; import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler; import play.shaded.ahc.org.asynchttpclient.ws.WebSocketUpgradeHandler; -@AutoService(Instrumenter.class) -public class PlayWSClientInstrumentation extends BasePlayWSClientInstrumentation { +@AutoService(InstrumentationModule.class) +public class PlayWsInstrumentationModule extends InstrumentationModule { + public PlayWsInstrumentationModule() { + super("play-ws"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + "io.opentelemetry.javaagent.instrumentation.playws.PlayWSClientTracer", + "io.opentelemetry.javaagent.instrumentation.playws.HeadersInjectAdapter", + packageName + ".AsyncHandlerWrapper", + packageName + ".StreamedAsyncHandlerWrapper" + }; + } + + @Override + public List typeInstrumentations() { + return singletonList(new AsyncHttpClientInstrumentation(ClientAdvice.class.getName())); + } + public static class ClientAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void methodEnter( @Advice.Argument(0) Request request, - @Advice.Argument(value = 1, readOnly = false) AsyncHandler asyncHandler, + @Advice.Argument(value = 1, readOnly = false) AsyncHandler asyncHandler, @Advice.Local("otelSpan") Span span) { span = tracer().startSpan(request); @@ -33,7 +55,8 @@ public class PlayWSClientInstrumentation extends BasePlayWSClientInstrumentation scope.close(); if (asyncHandler instanceof StreamedAsyncHandler) { - asyncHandler = new StreamedAsyncHandlerWrapper((StreamedAsyncHandler) asyncHandler, span); + asyncHandler = + new StreamedAsyncHandlerWrapper((StreamedAsyncHandler) asyncHandler, span); } else if (!(asyncHandler instanceof WebSocketUpgradeHandler)) { // websocket upgrade handlers aren't supported asyncHandler = new AsyncHandlerWrapper(asyncHandler, span); diff --git a/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayWSClientInstrumentation.java b/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayWsInstrumentationModule.java similarity index 60% rename from instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayWSClientInstrumentation.java rename to instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayWsInstrumentationModule.java index 6a4fa06571..3c9cbe1e30 100644 --- a/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayWSClientInstrumentation.java +++ b/instrumentation/play-ws/play-ws-2.1/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/v2_1/PlayWsInstrumentationModule.java @@ -6,25 +6,47 @@ package io.opentelemetry.javaagent.instrumentation.playws.v2_1; import static io.opentelemetry.javaagent.instrumentation.playws.PlayWSClientTracer.tracer; +import static java.util.Collections.singletonList; import com.google.auto.service.AutoService; import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Scope; -import io.opentelemetry.javaagent.instrumentation.playws.BasePlayWSClientInstrumentation; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.instrumentation.playws.AsyncHttpClientInstrumentation; +import io.opentelemetry.javaagent.tooling.InstrumentationModule; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; +import java.util.List; import net.bytebuddy.asm.Advice; import play.shaded.ahc.org.asynchttpclient.AsyncHandler; import play.shaded.ahc.org.asynchttpclient.Request; import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler; import play.shaded.ahc.org.asynchttpclient.ws.WebSocketUpgradeHandler; -@AutoService(Instrumenter.class) -public class PlayWSClientInstrumentation extends BasePlayWSClientInstrumentation { +@AutoService(InstrumentationModule.class) +public class PlayWsInstrumentationModule extends InstrumentationModule { + public PlayWsInstrumentationModule() { + super("play-ws"); + } + + @Override + public String[] helperClassNames() { + return new String[] { + "io.opentelemetry.javaagent.instrumentation.playws.PlayWSClientTracer", + "io.opentelemetry.javaagent.instrumentation.playws.HeadersInjectAdapter", + packageName + ".AsyncHandlerWrapper", + packageName + ".StreamedAsyncHandlerWrapper" + }; + } + + @Override + public List typeInstrumentations() { + return singletonList(new AsyncHttpClientInstrumentation(ClientAdvice.class.getName())); + } + public static class ClientAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static void methodEnter( @Advice.Argument(0) Request request, - @Advice.Argument(value = 1, readOnly = false) AsyncHandler asyncHandler, + @Advice.Argument(value = 1, readOnly = false) AsyncHandler asyncHandler, @Advice.Local("otelSpan") Span span) { span = tracer().startSpan(request); @@ -33,7 +55,8 @@ public class PlayWSClientInstrumentation extends BasePlayWSClientInstrumentation scope.close(); if (asyncHandler instanceof StreamedAsyncHandler) { - asyncHandler = new StreamedAsyncHandlerWrapper((StreamedAsyncHandler) asyncHandler, span); + asyncHandler = + new StreamedAsyncHandlerWrapper((StreamedAsyncHandler) asyncHandler, span); } else if (!(asyncHandler instanceof WebSocketUpgradeHandler)) { // websocket upgrade handlers aren't supported asyncHandler = new AsyncHandlerWrapper(asyncHandler, span); diff --git a/instrumentation/play-ws/play-ws-common/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/BasePlayWSClientInstrumentation.java b/instrumentation/play-ws/play-ws-common/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/AsyncHttpClientInstrumentation.java similarity index 77% rename from instrumentation/play-ws/play-ws-common/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/BasePlayWSClientInstrumentation.java rename to instrumentation/play-ws/play-ws-common/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/AsyncHttpClientInstrumentation.java index 5b538b4c2c..accb0797a1 100644 --- a/instrumentation/play-ws/play-ws-common/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/BasePlayWSClientInstrumentation.java +++ b/instrumentation/play-ws/play-ws-common/src/main/java/io/opentelemetry/javaagent/instrumentation/playws/AsyncHttpClientInstrumentation.java @@ -15,15 +15,17 @@ import static net.bytebuddy.matcher.ElementMatchers.not; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import static net.bytebuddy.matcher.ElementMatchers.takesArguments; -import io.opentelemetry.javaagent.tooling.Instrumenter; +import io.opentelemetry.javaagent.tooling.TypeInstrumentation; import java.util.Map; import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -public abstract class BasePlayWSClientInstrumentation extends Instrumenter.Default { - public BasePlayWSClientInstrumentation() { - super("play-ws"); +public class AsyncHttpClientInstrumentation implements TypeInstrumentation { + private final String adviceName; + + public AsyncHttpClientInstrumentation(String adviceName) { + this.adviceName = adviceName; } @Override @@ -50,16 +52,6 @@ public abstract class BasePlayWSClientInstrumentation extends Instrumenter.Defau .and(takesArguments(2)) .and(takesArgument(0, named("play.shaded.ahc.org.asynchttpclient.Request"))) .and(takesArgument(1, named("play.shaded.ahc.org.asynchttpclient.AsyncHandler"))), - getClass().getName() + "$ClientAdvice"); - } - - @Override - public String[] helperClassNames() { - return new String[] { - "io.opentelemetry.javaagent.instrumentation.playws.PlayWSClientTracer", - "io.opentelemetry.javaagent.instrumentation.playws.HeadersInjectAdapter", - packageName + ".AsyncHandlerWrapper", - packageName + ".StreamedAsyncHandlerWrapper" - }; + adviceName); } } diff --git a/instrumentation/play/play-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_3/PlayInstrumentation.java b/instrumentation/play/play-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_3/PlayInstrumentation.java deleted file mode 100644 index 0db584d45b..0000000000 --- a/instrumentation/play/play-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_3/PlayInstrumentation.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.play.v2_3; - -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.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 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 PlayInstrumentation extends Instrumenter.Default { - - public PlayInstrumentation() { - super("play", "play-action"); - } - - @Override - public ElementMatcher classLoaderMatcher() { - // Optimization for expensive typeMatcher. - return hasClassesNamed("play.api.mvc.Action"); - } - - @Override - public ElementMatcher typeMatcher() { - return implementsInterface(named("play.api.mvc.Action")); - } - - @Override - public String[] helperClassNames() { - return new String[] {packageName + ".PlayTracer", packageName + ".RequestCompleteCallback"}; - } - - @Override - public Map, String> transformers() { - return singletonMap( - named("apply") - .and(takesArgument(0, named("play.api.mvc.Request"))) - .and(returns(named("scala.concurrent.Future"))), - packageName + ".PlayAdvice"); - } -} diff --git a/instrumentation/play/play-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_3/PlayInstrumentationModule.java b/instrumentation/play/play-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_3/PlayInstrumentationModule.java new file mode 100644 index 0000000000..8c07f8c7a2 --- /dev/null +++ b/instrumentation/play/play-2.3/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_3/PlayInstrumentationModule.java @@ -0,0 +1,63 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.play.v2_3; + +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.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.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 PlayInstrumentationModule extends InstrumentationModule { + + public PlayInstrumentationModule() { + super("play", "play-action"); + } + + @Override + public String[] helperClassNames() { + return new String[] {packageName + ".PlayTracer", packageName + ".RequestCompleteCallback"}; + } + + @Override + public List typeInstrumentations() { + return singletonList(new ActionInstrumentation()); + } + + private static final class ActionInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return hasClassesNamed("play.api.mvc.Action"); + } + + @Override + public ElementMatcher typeMatcher() { + return implementsInterface(named("play.api.mvc.Action")); + } + + @Override + public Map, String> transformers() { + return singletonMap( + named("apply") + .and(takesArgument(0, named("play.api.mvc.Request"))) + .and(returns(named("scala.concurrent.Future"))), + PlayAdvice.class.getName()); + } + } +} diff --git a/instrumentation/play/play-2.4/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/PlayInstrumentation.java b/instrumentation/play/play-2.4/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/PlayInstrumentation.java deleted file mode 100644 index 0f240a59c8..0000000000 --- a/instrumentation/play/play-2.4/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/PlayInstrumentation.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.play.v2_4; - -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.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 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 PlayInstrumentation extends Instrumenter.Default { - - public PlayInstrumentation() { - super("play"); - } - - @Override - public ElementMatcher classLoaderMatcher() { - // Optimization for expensive typeMatcher. - return hasClassesNamed("play.api.mvc.Action"); - } - - @Override - public ElementMatcher typeMatcher() { - return implementsInterface(named("play.api.mvc.Action")); - } - - @Override - public String[] helperClassNames() { - return new String[] {packageName + ".PlayTracer", packageName + ".RequestCompleteCallback"}; - } - - @Override - public Map, String> transformers() { - return singletonMap( - named("apply") - .and(takesArgument(0, named("play.api.mvc.Request"))) - .and(returns(named("scala.concurrent.Future"))), - packageName + ".PlayAdvice"); - } -} diff --git a/instrumentation/play/play-2.4/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/PlayInstrumentationModule.java b/instrumentation/play/play-2.4/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/PlayInstrumentationModule.java new file mode 100644 index 0000000000..0f141a065f --- /dev/null +++ b/instrumentation/play/play-2.4/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_4/PlayInstrumentationModule.java @@ -0,0 +1,63 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.play.v2_4; + +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.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.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 PlayInstrumentationModule extends InstrumentationModule { + + public PlayInstrumentationModule() { + super("play"); + } + + @Override + public String[] helperClassNames() { + return new String[] {packageName + ".PlayTracer", packageName + ".RequestCompleteCallback"}; + } + + @Override + public List typeInstrumentations() { + return singletonList(new ActionInstrumentation()); + } + + private static final class ActionInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return hasClassesNamed("play.api.mvc.Action"); + } + + @Override + public ElementMatcher typeMatcher() { + return implementsInterface(named("play.api.mvc.Action")); + } + + @Override + public Map, String> transformers() { + return singletonMap( + named("apply") + .and(takesArgument(0, named("play.api.mvc.Request"))) + .and(returns(named("scala.concurrent.Future"))), + PlayAdvice.class.getName()); + } + } +} diff --git a/instrumentation/play/play-2.6/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayInstrumentation.java b/instrumentation/play/play-2.6/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayInstrumentation.java deleted file mode 100644 index 57de2c25c8..0000000000 --- a/instrumentation/play/play-2.6/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayInstrumentation.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.play.v2_6; - -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.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 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 PlayInstrumentation extends Instrumenter.Default { - - public PlayInstrumentation() { - super("play"); - } - - @Override - public ElementMatcher classLoaderMatcher() { - // Optimization for expensive typeMatcher. - return hasClassesNamed("play.api.mvc.Action"); - } - - @Override - public ElementMatcher typeMatcher() { - return implementsInterface(named("play.api.mvc.Action")); - } - - @Override - public String[] helperClassNames() { - return new String[] {packageName + ".PlayTracer", packageName + ".RequestCompleteCallback"}; - } - - @Override - public Map, String> transformers() { - return singletonMap( - named("apply") - .and(takesArgument(0, named("play.api.mvc.Request"))) - .and(returns(named("scala.concurrent.Future"))), - packageName + ".PlayAdvice"); - } -} diff --git a/instrumentation/play/play-2.6/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayInstrumentationModule.java b/instrumentation/play/play-2.6/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayInstrumentationModule.java new file mode 100644 index 0000000000..8484632513 --- /dev/null +++ b/instrumentation/play/play-2.6/src/main/java/io/opentelemetry/javaagent/instrumentation/play/v2_6/PlayInstrumentationModule.java @@ -0,0 +1,63 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.play.v2_6; + +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.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.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 PlayInstrumentationModule extends InstrumentationModule { + + public PlayInstrumentationModule() { + super("play"); + } + + @Override + public String[] helperClassNames() { + return new String[] {packageName + ".PlayTracer", packageName + ".RequestCompleteCallback"}; + } + + @Override + public List typeInstrumentations() { + return singletonList(new ActionInstrumentation()); + } + + private static final class ActionInstrumentation implements TypeInstrumentation { + @Override + public ElementMatcher classLoaderMatcher() { + // Optimization for expensive typeMatcher. + return hasClassesNamed("play.api.mvc.Action"); + } + + @Override + public ElementMatcher typeMatcher() { + return implementsInterface(named("play.api.mvc.Action")); + } + + @Override + public Map, String> transformers() { + return singletonMap( + named("apply") + .and(takesArgument(0, named("play.api.mvc.Request"))) + .and(returns(named("scala.concurrent.Future"))), + PlayAdvice.class.getName()); + } + } +}