Refactor Instrumenters into InstrumentationModules - N, O, P (#1575)
This commit is contained in:
parent
ef58ec1770
commit
7f36dd1617
|
@ -12,7 +12,6 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
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;
|
||||||
import io.opentelemetry.api.trace.Span.Kind;
|
import io.opentelemetry.api.trace.Span.Kind;
|
||||||
import io.opentelemetry.context.Context;
|
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.ContextStore;
|
||||||
import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext;
|
import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext;
|
||||||
import io.opentelemetry.javaagent.instrumentation.netty.v3_8.client.NettyHttpClientTracer;
|
import io.opentelemetry.javaagent.instrumentation.netty.v3_8.client.NettyHttpClientTracer;
|
||||||
import io.opentelemetry.javaagent.tooling.Instrumenter;
|
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
import net.bytebuddy.description.method.MethodDescription;
|
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.Channel;
|
||||||
import org.jboss.netty.channel.ChannelFuture;
|
import org.jboss.netty.channel.ChannelFuture;
|
||||||
|
|
||||||
@AutoService(Instrumenter.class)
|
final class ChannelFutureListenerInstrumentation implements TypeInstrumentation {
|
||||||
public class ChannelFutureListenerInstrumentation extends Instrumenter.Default {
|
|
||||||
|
|
||||||
public ChannelFutureListenerInstrumentation() {
|
|
||||||
super(
|
|
||||||
NettyChannelPipelineInstrumentation.INSTRUMENTATION_NAME,
|
|
||||||
NettyChannelPipelineInstrumentation.ADDITIONAL_INSTRUMENTATION_NAMES);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
||||||
|
@ -50,19 +41,6 @@ public class ChannelFutureListenerInstrumentation extends Instrumenter.Default {
|
||||||
return implementsInterface(named("org.jboss.netty.channel.ChannelFutureListener"));
|
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
|
@Override
|
||||||
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
||||||
return singletonMap(
|
return singletonMap(
|
||||||
|
@ -72,12 +50,6 @@ public class ChannelFutureListenerInstrumentation extends Instrumenter.Default {
|
||||||
ChannelFutureListenerInstrumentation.class.getName() + "$OperationCompleteAdvice");
|
ChannelFutureListenerInstrumentation.class.getName() + "$OperationCompleteAdvice");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<String, String> contextStore() {
|
|
||||||
return Collections.singletonMap(
|
|
||||||
"org.jboss.netty.channel.Channel", packageName + ".ChannelTraceContext");
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class OperationCompleteAdvice extends AbstractNettyAdvice {
|
public static class OperationCompleteAdvice extends AbstractNettyAdvice {
|
||||||
@Advice.OnMethodEnter
|
@Advice.OnMethodEnter
|
||||||
public static Scope activateScope(@Advice.Argument(0) ChannelFuture future) {
|
public static Scope activateScope(@Advice.Argument(0) ChannelFuture future) {
|
||||||
|
|
|
@ -11,14 +11,12 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
|
||||||
import io.opentelemetry.api.trace.Span;
|
import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.javaagent.instrumentation.api.ContextStore;
|
import io.opentelemetry.javaagent.instrumentation.api.ContextStore;
|
||||||
import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext;
|
import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext;
|
||||||
import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge;
|
import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge;
|
||||||
import io.opentelemetry.javaagent.tooling.Instrumenter;
|
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
|
@ -27,13 +25,7 @@ import net.bytebuddy.description.type.TypeDescription;
|
||||||
import net.bytebuddy.matcher.ElementMatcher;
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
import org.jboss.netty.channel.Channel;
|
import org.jboss.netty.channel.Channel;
|
||||||
|
|
||||||
@AutoService(Instrumenter.class)
|
final class NettyChannelInstrumentation implements TypeInstrumentation {
|
||||||
public class NettyChannelInstrumentation extends Instrumenter.Default {
|
|
||||||
public NettyChannelInstrumentation() {
|
|
||||||
super(
|
|
||||||
NettyChannelPipelineInstrumentation.INSTRUMENTATION_NAME,
|
|
||||||
NettyChannelPipelineInstrumentation.ADDITIONAL_INSTRUMENTATION_NAMES);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
||||||
|
@ -46,17 +38,6 @@ public class NettyChannelInstrumentation extends Instrumenter.Default {
|
||||||
return implementsInterface(named("org.jboss.netty.channel.Channel"));
|
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
|
@Override
|
||||||
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
||||||
Map<ElementMatcher<? super MethodDescription>, String> transformers = new HashMap<>();
|
Map<ElementMatcher<? super MethodDescription>, String> transformers = new HashMap<>();
|
||||||
|
@ -68,12 +49,6 @@ public class NettyChannelInstrumentation extends Instrumenter.Default {
|
||||||
return transformers;
|
return transformers;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<String, String> contextStore() {
|
|
||||||
return Collections.singletonMap(
|
|
||||||
"org.jboss.netty.channel.Channel", ChannelTraceContext.class.getName());
|
|
||||||
}
|
|
||||||
|
|
||||||
public static class ChannelConnectAdvice extends AbstractNettyAdvice {
|
public static class ChannelConnectAdvice extends AbstractNettyAdvice {
|
||||||
@Advice.OnMethodEnter
|
@Advice.OnMethodEnter
|
||||||
public static void addConnectContinuation(@Advice.This Channel channel) {
|
public static void addConnectContinuation(@Advice.This Channel channel) {
|
||||||
|
|
|
@ -12,7 +12,6 @@ import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
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.CallDepthThreadLocalMap;
|
||||||
import io.opentelemetry.javaagent.instrumentation.api.ContextStore;
|
import io.opentelemetry.javaagent.instrumentation.api.ContextStore;
|
||||||
import io.opentelemetry.javaagent.instrumentation.api.InstrumentationContext;
|
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.HttpServerRequestTracingHandler;
|
||||||
import io.opentelemetry.javaagent.instrumentation.netty.v3_8.server.HttpServerResponseTracingHandler;
|
import io.opentelemetry.javaagent.instrumentation.netty.v3_8.server.HttpServerResponseTracingHandler;
|
||||||
import io.opentelemetry.javaagent.instrumentation.netty.v3_8.server.HttpServerTracingHandler;
|
import io.opentelemetry.javaagent.instrumentation.netty.v3_8.server.HttpServerTracingHandler;
|
||||||
import io.opentelemetry.javaagent.tooling.Instrumenter;
|
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
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.HttpResponseEncoder;
|
||||||
import org.jboss.netty.handler.codec.http.HttpServerCodec;
|
import org.jboss.netty.handler.codec.http.HttpServerCodec;
|
||||||
|
|
||||||
@AutoService(Instrumenter.class)
|
final class NettyChannelPipelineInstrumentation implements TypeInstrumentation {
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
||||||
|
@ -61,30 +51,6 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
|
||||||
return implementsInterface(named("org.jboss.netty.channel.ChannelPipeline"));
|
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
|
@Override
|
||||||
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
||||||
Map<ElementMatcher<? super MethodDescription>, String> transformers = new HashMap<>();
|
Map<ElementMatcher<? super MethodDescription>, String> transformers = new HashMap<>();
|
||||||
|
@ -101,12 +67,6 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
|
||||||
return transformers;
|
return transformers;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<String, String> 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
|
* 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
|
* handlers. If those handlers are later removed, we may want to remove our handlers. That is not
|
||||||
|
|
|
@ -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<TypeInstrumentation> typeInstrumentations() {
|
||||||
|
return asList(
|
||||||
|
new ChannelFutureListenerInstrumentation(),
|
||||||
|
new NettyChannelInstrumentation(),
|
||||||
|
new NettyChannelPipelineInstrumentation());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<String, String> contextStore() {
|
||||||
|
return Collections.singletonMap(
|
||||||
|
"org.jboss.netty.channel.Channel", ChannelTraceContext.class.getName());
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,28 +12,20 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
|
||||||
import io.netty.channel.ChannelFuture;
|
import io.netty.channel.ChannelFuture;
|
||||||
import io.opentelemetry.api.trace.Span;
|
import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.api.trace.Span.Kind;
|
import io.opentelemetry.api.trace.Span.Kind;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.javaagent.instrumentation.netty.v4_0.client.NettyHttpClientTracer;
|
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 java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
import net.bytebuddy.description.method.MethodDescription;
|
import net.bytebuddy.description.method.MethodDescription;
|
||||||
import net.bytebuddy.description.type.TypeDescription;
|
import net.bytebuddy.description.type.TypeDescription;
|
||||||
import net.bytebuddy.matcher.ElementMatcher;
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
|
||||||
@AutoService(Instrumenter.class)
|
final class ChannelFutureListenerInstrumentation implements TypeInstrumentation {
|
||||||
public class ChannelFutureListenerInstrumentation extends Instrumenter.Default {
|
|
||||||
|
|
||||||
public ChannelFutureListenerInstrumentation() {
|
|
||||||
super(
|
|
||||||
NettyChannelPipelineInstrumentation.INSTRUMENTATION_NAME,
|
|
||||||
NettyChannelPipelineInstrumentation.ADDITIONAL_INSTRUMENTATION_NAMES);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
||||||
|
@ -46,26 +38,6 @@ public class ChannelFutureListenerInstrumentation extends Instrumenter.Default {
|
||||||
return implementsInterface(named("io.netty.channel.ChannelFutureListener"));
|
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
|
@Override
|
||||||
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
||||||
return singletonMap(
|
return singletonMap(
|
||||||
|
|
|
@ -13,7 +13,6 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
|
||||||
import io.netty.channel.ChannelHandler;
|
import io.netty.channel.ChannelHandler;
|
||||||
import io.netty.channel.ChannelPipeline;
|
import io.netty.channel.ChannelPipeline;
|
||||||
import io.netty.handler.codec.http.HttpClientCodec;
|
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.HttpServerRequestTracingHandler;
|
||||||
import io.opentelemetry.javaagent.instrumentation.netty.v4_0.server.HttpServerResponseTracingHandler;
|
import io.opentelemetry.javaagent.instrumentation.netty.v4_0.server.HttpServerResponseTracingHandler;
|
||||||
import io.opentelemetry.javaagent.instrumentation.netty.v4_0.server.HttpServerTracingHandler;
|
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.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
|
@ -40,15 +39,7 @@ import net.bytebuddy.description.method.MethodDescription;
|
||||||
import net.bytebuddy.description.type.TypeDescription;
|
import net.bytebuddy.description.type.TypeDescription;
|
||||||
import net.bytebuddy.matcher.ElementMatcher;
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
|
||||||
@AutoService(Instrumenter.class)
|
final class NettyChannelPipelineInstrumentation implements TypeInstrumentation {
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
||||||
|
@ -61,26 +52,6 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
|
||||||
return implementsInterface(named("io.netty.channel.ChannelPipeline"));
|
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
|
@Override
|
||||||
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
||||||
Map<ElementMatcher<? super MethodDescription>, String> transformers = new HashMap<>();
|
Map<ElementMatcher<? super MethodDescription>, String> transformers = new HashMap<>();
|
||||||
|
|
|
@ -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<TypeInstrumentation> typeInstrumentations() {
|
||||||
|
return asList(
|
||||||
|
new ChannelFutureListenerInstrumentation(), new NettyChannelPipelineInstrumentation());
|
||||||
|
}
|
||||||
|
}
|
|
@ -12,28 +12,20 @@ import static net.bytebuddy.matcher.ElementMatchers.isMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
|
||||||
import io.netty.channel.ChannelFuture;
|
import io.netty.channel.ChannelFuture;
|
||||||
import io.opentelemetry.api.trace.Span;
|
import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.api.trace.Span.Kind;
|
import io.opentelemetry.api.trace.Span.Kind;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.javaagent.instrumentation.netty.v4_1.client.NettyHttpClientTracer;
|
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 java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
import net.bytebuddy.description.method.MethodDescription;
|
import net.bytebuddy.description.method.MethodDescription;
|
||||||
import net.bytebuddy.description.type.TypeDescription;
|
import net.bytebuddy.description.type.TypeDescription;
|
||||||
import net.bytebuddy.matcher.ElementMatcher;
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
|
||||||
@AutoService(Instrumenter.class)
|
final class ChannelFutureListenerInstrumentation implements TypeInstrumentation {
|
||||||
public class ChannelFutureListenerInstrumentation extends Instrumenter.Default {
|
|
||||||
|
|
||||||
public ChannelFutureListenerInstrumentation() {
|
|
||||||
super(
|
|
||||||
NettyChannelPipelineInstrumentation.INSTRUMENTATION_NAME,
|
|
||||||
NettyChannelPipelineInstrumentation.ADDITIONAL_INSTRUMENTATION_NAMES);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
||||||
|
@ -46,26 +38,6 @@ public class ChannelFutureListenerInstrumentation extends Instrumenter.Default {
|
||||||
return implementsInterface(named("io.netty.channel.ChannelFutureListener"));
|
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
|
@Override
|
||||||
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
||||||
return singletonMap(
|
return singletonMap(
|
||||||
|
|
|
@ -13,7 +13,6 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
import static net.bytebuddy.matcher.ElementMatchers.returns;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
|
||||||
import io.netty.channel.ChannelHandler;
|
import io.netty.channel.ChannelHandler;
|
||||||
import io.netty.channel.ChannelPipeline;
|
import io.netty.channel.ChannelPipeline;
|
||||||
import io.netty.handler.codec.http.HttpClientCodec;
|
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.HttpServerRequestTracingHandler;
|
||||||
import io.opentelemetry.javaagent.instrumentation.netty.v4_1.server.HttpServerResponseTracingHandler;
|
import io.opentelemetry.javaagent.instrumentation.netty.v4_1.server.HttpServerResponseTracingHandler;
|
||||||
import io.opentelemetry.javaagent.instrumentation.netty.v4_1.server.HttpServerTracingHandler;
|
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.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
|
@ -40,15 +39,7 @@ import net.bytebuddy.description.method.MethodDescription;
|
||||||
import net.bytebuddy.description.type.TypeDescription;
|
import net.bytebuddy.description.type.TypeDescription;
|
||||||
import net.bytebuddy.matcher.ElementMatcher;
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
|
||||||
@AutoService(Instrumenter.class)
|
final class NettyChannelPipelineInstrumentation implements TypeInstrumentation {
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
||||||
|
@ -61,26 +52,6 @@ public class NettyChannelPipelineInstrumentation extends Instrumenter.Default {
|
||||||
return implementsInterface(named("io.netty.channel.ChannelPipeline"));
|
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
|
@Override
|
||||||
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
||||||
Map<ElementMatcher<? super MethodDescription>, String> transformers = new HashMap<>();
|
Map<ElementMatcher<? super MethodDescription>, String> transformers = new HashMap<>();
|
||||||
|
|
|
@ -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<TypeInstrumentation> typeInstrumentations() {
|
||||||
|
return asList(
|
||||||
|
new ChannelFutureListenerInstrumentation(), new NettyChannelPipelineInstrumentation());
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,31 +5,29 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.okhttp.v2_2;
|
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.isConstructor;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import com.squareup.okhttp.Interceptor;
|
import com.squareup.okhttp.Interceptor;
|
||||||
import com.squareup.okhttp.OkHttpClient;
|
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.Collections;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
import net.bytebuddy.description.method.MethodDescription;
|
import net.bytebuddy.description.method.MethodDescription;
|
||||||
import net.bytebuddy.description.type.TypeDescription;
|
import net.bytebuddy.description.type.TypeDescription;
|
||||||
import net.bytebuddy.matcher.ElementMatcher;
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
|
||||||
@AutoService(Instrumenter.class)
|
@AutoService(InstrumentationModule.class)
|
||||||
public class OkHttp2Instrumentation extends Instrumenter.Default {
|
public class OkHttp2InstrumentationModule extends InstrumentationModule {
|
||||||
public OkHttp2Instrumentation() {
|
public OkHttp2InstrumentationModule() {
|
||||||
super("okhttp", "okhttp-2");
|
super("okhttp", "okhttp-2");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
|
||||||
return named("com.squareup.okhttp.OkHttpClient");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String[] helperClassNames() {
|
public String[] helperClassNames() {
|
||||||
return new String[] {
|
return new String[] {
|
||||||
|
@ -40,9 +38,21 @@ public class OkHttp2Instrumentation extends Instrumenter.Default {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
public List<TypeInstrumentation> typeInstrumentations() {
|
||||||
return Collections.singletonMap(
|
return singletonList(new OkHttpClientInstrumentation());
|
||||||
isConstructor(), OkHttp2Instrumentation.class.getName() + "$OkHttp2ClientAdvice");
|
}
|
||||||
|
|
||||||
|
private static final class OkHttpClientInstrumentation implements TypeInstrumentation {
|
||||||
|
@Override
|
||||||
|
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
||||||
|
return named("com.squareup.okhttp.OkHttpClient");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
||||||
|
return Collections.singletonMap(
|
||||||
|
isConstructor(), OkHttp2InstrumentationModule.class.getName() + "$OkHttp2ClientAdvice");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class OkHttp2ClientAdvice {
|
public static class OkHttp2ClientAdvice {
|
|
@ -5,13 +5,16 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.okhttp.v3_0;
|
package io.opentelemetry.javaagent.instrumentation.okhttp.v3_0;
|
||||||
|
|
||||||
|
import static java.util.Collections.singletonList;
|
||||||
import static java.util.Collections.singletonMap;
|
import static java.util.Collections.singletonMap;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isConstructor;
|
import static net.bytebuddy.matcher.ElementMatchers.isConstructor;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
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 java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
import net.bytebuddy.description.method.MethodDescription;
|
import net.bytebuddy.description.method.MethodDescription;
|
||||||
|
@ -20,18 +23,13 @@ import net.bytebuddy.matcher.ElementMatcher;
|
||||||
import okhttp3.Interceptor;
|
import okhttp3.Interceptor;
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
|
|
||||||
@AutoService(Instrumenter.class)
|
@AutoService(InstrumentationModule.class)
|
||||||
public class OkHttp3Instrumentation extends Instrumenter.Default {
|
public class OkHttp3InstrumentationModule extends InstrumentationModule {
|
||||||
|
|
||||||
public OkHttp3Instrumentation() {
|
public OkHttp3InstrumentationModule() {
|
||||||
super("okhttp", "okhttp-3");
|
super("okhttp", "okhttp-3");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ElementMatcher<TypeDescription> typeMatcher() {
|
|
||||||
return named("okhttp3.OkHttpClient");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String[] helperClassNames() {
|
public String[] helperClassNames() {
|
||||||
return new String[] {
|
return new String[] {
|
||||||
|
@ -42,10 +40,22 @@ public class OkHttp3Instrumentation extends Instrumenter.Default {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
public List<TypeInstrumentation> typeInstrumentations() {
|
||||||
return singletonMap(
|
return singletonList(new OkHttpClientInstrumentation());
|
||||||
isConstructor().and(takesArgument(0, named("okhttp3.OkHttpClient$Builder"))),
|
}
|
||||||
OkHttp3Instrumentation.class.getName() + "$OkHttp3Advice");
|
|
||||||
|
private static final class OkHttpClientInstrumentation implements TypeInstrumentation {
|
||||||
|
@Override
|
||||||
|
public ElementMatcher<TypeDescription> typeMatcher() {
|
||||||
|
return named("okhttp3.OkHttpClient");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
||||||
|
return singletonMap(
|
||||||
|
isConstructor().and(takesArgument(0, named("okhttp3.OkHttpClient$Builder"))),
|
||||||
|
OkHttp3InstrumentationModule.class.getName() + "$OkHttp3Advice");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class OkHttp3Advice {
|
public static class OkHttp3Advice {
|
|
@ -12,9 +12,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import application.io.opentelemetry.context.Context;
|
import application.io.opentelemetry.context.Context;
|
||||||
import com.google.auto.service.AutoService;
|
|
||||||
import io.opentelemetry.api.baggage.Baggage;
|
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.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
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
|
// TODO: Actually bridge correlation context. We currently just stub out withBaggage
|
||||||
// to have minimum functionality with SDK shim implementations.
|
// to have minimum functionality with SDK shim implementations.
|
||||||
// https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/973
|
// https://github.com/open-telemetry/opentelemetry-java-instrumentation/issues/973
|
||||||
@AutoService(Instrumenter.class)
|
final class BaggageUtilsInstrumentation implements TypeInstrumentation {
|
||||||
public class BaggageUtilsInstrumentation extends AbstractInstrumentation {
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
||||||
return named("application.io.opentelemetry.api.baggage.BaggageUtils");
|
return named("application.io.opentelemetry.api.baggage.BaggageUtils");
|
||||||
|
|
|
@ -11,9 +11,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
|
||||||
import application.io.opentelemetry.context.Context;
|
import application.io.opentelemetry.context.Context;
|
||||||
import application.io.opentelemetry.context.ContextStorage;
|
import application.io.opentelemetry.context.ContextStorage;
|
||||||
import com.google.auto.service.AutoService;
|
|
||||||
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.context.AgentContextStorage;
|
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.Collections;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
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
|
* 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.
|
* it's required for instrumentation in the agent to work properly.
|
||||||
*/
|
*/
|
||||||
@AutoService(Instrumenter.class)
|
final class ContextInstrumentation implements TypeInstrumentation {
|
||||||
public class ContextInstrumentation extends AbstractInstrumentation {
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
||||||
|
|
|
@ -10,9 +10,8 @@ import static net.bytebuddy.matcher.ElementMatchers.isStatic;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.named;
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
|
||||||
import application.io.opentelemetry.context.ContextStorage;
|
import application.io.opentelemetry.context.ContextStorage;
|
||||||
import com.google.auto.service.AutoService;
|
|
||||||
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.context.AgentContextStorage;
|
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.Collections;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
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
|
* 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.
|
* it's required for instrumentation in the agent to work properly.
|
||||||
*/
|
*/
|
||||||
@AutoService(Instrumenter.class)
|
final class ContextStorageInstrumentation implements TypeInstrumentation {
|
||||||
public class ContextStorageInstrumentation extends AbstractInstrumentation {
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
||||||
|
|
|
@ -5,10 +5,16 @@
|
||||||
|
|
||||||
package io.opentelemetry.javaagent.instrumentation.opentelemetryapi;
|
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 {
|
import com.google.auto.service.AutoService;
|
||||||
public AbstractInstrumentation() {
|
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");
|
super("opentelemetry-api");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -80,4 +86,14 @@ public abstract class AbstractInstrumentation extends Instrumenter.Default {
|
||||||
packageName + ".LabelBridging"
|
packageName + ".LabelBridging"
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<TypeInstrumentation> typeInstrumentations() {
|
||||||
|
return asList(
|
||||||
|
new BaggageUtilsInstrumentation(),
|
||||||
|
new ContextInstrumentation(),
|
||||||
|
new ContextStorageInstrumentation(),
|
||||||
|
new OpenTelemetryInstrumentation(),
|
||||||
|
new SpanInstrumentation());
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -12,11 +12,10 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import application.io.opentelemetry.api.metrics.MeterProvider;
|
import application.io.opentelemetry.api.metrics.MeterProvider;
|
||||||
import application.io.opentelemetry.context.propagation.ContextPropagators;
|
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.context.propagation.ApplicationContextPropagators;
|
||||||
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.metrics.ApplicationMeterProvider;
|
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.metrics.ApplicationMeterProvider;
|
||||||
import io.opentelemetry.javaagent.instrumentation.opentelemetryapi.trace.ApplicationTracerProvider;
|
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.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
|
@ -24,8 +23,7 @@ import net.bytebuddy.description.method.MethodDescription;
|
||||||
import net.bytebuddy.description.type.TypeDescription;
|
import net.bytebuddy.description.type.TypeDescription;
|
||||||
import net.bytebuddy.matcher.ElementMatcher;
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
|
||||||
@AutoService(Instrumenter.class)
|
final class OpenTelemetryInstrumentation implements TypeInstrumentation {
|
||||||
public class OpenTelemetryApiInstrumentation extends AbstractInstrumentation {
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
||||||
|
@ -37,13 +35,13 @@ public class OpenTelemetryApiInstrumentation extends AbstractInstrumentation {
|
||||||
Map<ElementMatcher<? super MethodDescription>, String> transformers = new HashMap<>();
|
Map<ElementMatcher<? super MethodDescription>, String> transformers = new HashMap<>();
|
||||||
transformers.put(
|
transformers.put(
|
||||||
isMethod().and(isPublic()).and(named("getGlobalTracerProvider")).and(takesArguments(0)),
|
isMethod().and(isPublic()).and(named("getGlobalTracerProvider")).and(takesArguments(0)),
|
||||||
OpenTelemetryApiInstrumentation.class.getName() + "$GetTracerProviderAdvice");
|
OpenTelemetryInstrumentation.class.getName() + "$GetTracerProviderAdvice");
|
||||||
transformers.put(
|
transformers.put(
|
||||||
isMethod().and(isPublic()).and(named("getGlobalMeterProvider")).and(takesArguments(0)),
|
isMethod().and(isPublic()).and(named("getGlobalMeterProvider")).and(takesArguments(0)),
|
||||||
OpenTelemetryApiInstrumentation.class.getName() + "$GetMeterProviderAdvice");
|
OpenTelemetryInstrumentation.class.getName() + "$GetMeterProviderAdvice");
|
||||||
transformers.put(
|
transformers.put(
|
||||||
isMethod().and(isPublic()).and(named("getGlobalPropagators")).and(takesArguments(0)),
|
isMethod().and(isPublic()).and(named("getGlobalPropagators")).and(takesArguments(0)),
|
||||||
OpenTelemetryApiInstrumentation.class.getName() + "$GetPropagatorsAdvice");
|
OpenTelemetryInstrumentation.class.getName() + "$GetPropagatorsAdvice");
|
||||||
return transformers;
|
return transformers;
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,9 +11,8 @@ import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
|
||||||
import application.io.opentelemetry.api.trace.Span;
|
import application.io.opentelemetry.api.trace.Span;
|
||||||
import application.io.opentelemetry.api.trace.SpanContext;
|
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.instrumentation.opentelemetryapi.trace.Bridging;
|
||||||
import io.opentelemetry.javaagent.tooling.Instrumenter;
|
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
|
@ -21,8 +20,7 @@ import net.bytebuddy.description.method.MethodDescription;
|
||||||
import net.bytebuddy.description.type.TypeDescription;
|
import net.bytebuddy.description.type.TypeDescription;
|
||||||
import net.bytebuddy.matcher.ElementMatcher;
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
|
||||||
@AutoService(Instrumenter.class)
|
final class SpanInstrumentation implements TypeInstrumentation {
|
||||||
public class SpanInstrumentation extends AbstractInstrumentation {
|
|
||||||
@Override
|
@Override
|
||||||
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
||||||
return named("application.io.opentelemetry.api.trace.PropagatedSpan");
|
return named("application.io.opentelemetry.api.trace.PropagatedSpan");
|
||||||
|
|
|
@ -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<MethodDescription> configureExcludedMethods() {
|
|
||||||
ElementMatcher.Junction<MethodDescription> result = none();
|
|
||||||
|
|
||||||
Map<String, Set<String>> excludedMethods =
|
|
||||||
MethodsConfigurationParser.parse(
|
|
||||||
Config.get().getProperty(TRACE_ANNOTATED_METHODS_EXCLUDE_CONFIG));
|
|
||||||
for (Map.Entry<String, Set<String>> entry : excludedMethods.entrySet()) {
|
|
||||||
String className = entry.getKey();
|
|
||||||
ElementMatcher.Junction<ByteCodeElement> classMather =
|
|
||||||
isDeclaredBy(ElementMatchers.<TypeDescription>named(className));
|
|
||||||
|
|
||||||
ElementMatcher.Junction<MethodDescription> excludedMethodsMatcher = none();
|
|
||||||
for (String methodName : entry.getValue()) {
|
|
||||||
excludedMethodsMatcher = excludedMethodsMatcher.or(ElementMatchers.named(methodName));
|
|
||||||
}
|
|
||||||
|
|
||||||
result = result.or(classMather.and(excludedMethodsMatcher));
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -16,7 +16,7 @@ import net.bytebuddy.asm.Advice;
|
||||||
/**
|
/**
|
||||||
* Instrumentation for methods annotated with {@link WithSpan} annotation.
|
* Instrumentation for methods annotated with {@link WithSpan} annotation.
|
||||||
*
|
*
|
||||||
* @see WithSpanAnnotationInstrumentation
|
* @see WithSpanAnnotationInstrumentationModule
|
||||||
*/
|
*/
|
||||||
public class WithSpanAdvice {
|
public class WithSpanAdvice {
|
||||||
|
|
||||||
|
|
|
@ -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<AnnotationSource> annotatedMethodMatcher;
|
|
||||||
/*
|
|
||||||
This matcher matches all methods that should be excluded from transformation
|
|
||||||
*/
|
|
||||||
private final ElementMatcher.Junction<MethodDescription> excludedMethodsMatcher;
|
|
||||||
|
|
||||||
public WithSpanAnnotationInstrumentation() {
|
|
||||||
super("trace", "with-span-annotation");
|
|
||||||
annotatedMethodMatcher =
|
|
||||||
isAnnotatedWith(named("application.io.opentelemetry.extension.auto.annotations.WithSpan"));
|
|
||||||
excludedMethodsMatcher = configureExcludedMethods();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ElementMatcher<TypeDescription> typeMatcher() {
|
|
||||||
return declaresMethod(annotatedMethodMatcher);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] helperClassNames() {
|
|
||||||
return new String[] {
|
|
||||||
packageName + ".TraceAnnotationTracer",
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
|
||||||
return singletonMap(
|
|
||||||
annotatedMethodMatcher.and(not(excludedMethodsMatcher)), packageName + ".WithSpanAdvice");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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<TypeInstrumentation> typeInstrumentations() {
|
||||||
|
return singletonList(new AnnotatedMethodInstrumentation());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class AnnotatedMethodInstrumentation implements TypeInstrumentation {
|
||||||
|
private final ElementMatcher.Junction<AnnotationSource> annotatedMethodMatcher;
|
||||||
|
/** This matcher matches all methods that should be excluded from transformation */
|
||||||
|
private final ElementMatcher.Junction<MethodDescription> excludedMethodsMatcher;
|
||||||
|
|
||||||
|
AnnotatedMethodInstrumentation() {
|
||||||
|
annotatedMethodMatcher =
|
||||||
|
isAnnotatedWith(
|
||||||
|
named("application.io.opentelemetry.extension.auto.annotations.WithSpan"));
|
||||||
|
excludedMethodsMatcher = configureExcludedMethods();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ElementMatcher<TypeDescription> typeMatcher() {
|
||||||
|
return declaresMethod(annotatedMethodMatcher);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<? extends ElementMatcher<? super MethodDescription>, 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<MethodDescription> configureExcludedMethods() {
|
||||||
|
ElementMatcher.Junction<MethodDescription> result = none();
|
||||||
|
|
||||||
|
Map<String, Set<String>> excludedMethods =
|
||||||
|
MethodsConfigurationParser.parse(
|
||||||
|
Config.get().getProperty(TRACE_ANNOTATED_METHODS_EXCLUDE_CONFIG));
|
||||||
|
for (Map.Entry<String, Set<String>> entry : excludedMethods.entrySet()) {
|
||||||
|
String className = entry.getKey();
|
||||||
|
ElementMatcher.Junction<ByteCodeElement> classMather =
|
||||||
|
isDeclaredBy(ElementMatchers.named(className));
|
||||||
|
|
||||||
|
ElementMatcher.Junction<MethodDescription> excludedMethodsMatcher = none();
|
||||||
|
for (String methodName : entry.getValue()) {
|
||||||
|
excludedMethodsMatcher = excludedMethodsMatcher.or(ElementMatchers.named(methodName));
|
||||||
|
}
|
||||||
|
|
||||||
|
result = result.or(classMather.and(excludedMethodsMatcher));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -6,6 +6,7 @@
|
||||||
package io.opentelemetry.javaagent.instrumentation.oshi;
|
package io.opentelemetry.javaagent.instrumentation.oshi;
|
||||||
|
|
||||||
import static io.opentelemetry.javaagent.tooling.ClassLoaderMatcher.hasClassesNamed;
|
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.isMethod;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.isStatic;
|
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 com.google.auto.service.AutoService;
|
||||||
import io.opentelemetry.instrumentation.oshi.SystemMetrics;
|
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.Collections;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
import net.bytebuddy.description.method.MethodDescription;
|
import net.bytebuddy.description.method.MethodDescription;
|
||||||
import net.bytebuddy.description.type.TypeDescription;
|
import net.bytebuddy.description.type.TypeDescription;
|
||||||
import net.bytebuddy.matcher.ElementMatcher;
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
|
||||||
@AutoService(Instrumenter.class)
|
@AutoService(InstrumentationModule.class)
|
||||||
public class OshiInstrumentation extends Instrumenter.Default {
|
public class OshiInstrumentationModule extends InstrumentationModule {
|
||||||
|
|
||||||
public OshiInstrumentation() {
|
public OshiInstrumentationModule() {
|
||||||
super("oshi");
|
super("oshi");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
|
||||||
return hasClassesNamed("oshi.SystemInfo");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
|
||||||
return named("oshi.SystemInfo");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final String[] helperClassNames() {
|
public final String[] helperClassNames() {
|
||||||
return new String[] {
|
return new String[] {
|
||||||
|
@ -53,10 +46,27 @@ public class OshiInstrumentation extends Instrumenter.Default {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
public List<TypeInstrumentation> typeInstrumentations() {
|
||||||
return Collections.singletonMap(
|
return singletonList(new SystemInfoInstrumentation());
|
||||||
isMethod().and(isPublic()).and(isStatic()).and(named("getCurrentPlatformEnum")),
|
}
|
||||||
OshiInstrumentation.class.getName() + "$OshiInstrumentationAdvice");
|
|
||||||
|
private static final class SystemInfoInstrumentation implements TypeInstrumentation {
|
||||||
|
@Override
|
||||||
|
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
||||||
|
return hasClassesNamed("oshi.SystemInfo");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ElementMatcher<? super TypeDescription> typeMatcher() {
|
||||||
|
return named("oshi.SystemInfo");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
||||||
|
return Collections.singletonMap(
|
||||||
|
isMethod().and(isPublic()).and(isStatic()).and(named("getCurrentPlatformEnum")),
|
||||||
|
OshiInstrumentationModule.class.getName() + "$OshiInstrumentationAdvice");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class OshiInstrumentationAdvice {
|
public static class OshiInstrumentationAdvice {
|
|
@ -6,27 +6,49 @@
|
||||||
package io.opentelemetry.javaagent.instrumentation.playws.v1_0;
|
package io.opentelemetry.javaagent.instrumentation.playws.v1_0;
|
||||||
|
|
||||||
import static io.opentelemetry.javaagent.instrumentation.playws.PlayWSClientTracer.tracer;
|
import static io.opentelemetry.javaagent.instrumentation.playws.PlayWSClientTracer.tracer;
|
||||||
|
import static java.util.Collections.singletonList;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import io.opentelemetry.api.trace.Span;
|
import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.context.Context;
|
import io.opentelemetry.context.Context;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge;
|
import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge;
|
||||||
import io.opentelemetry.javaagent.instrumentation.playws.BasePlayWSClientInstrumentation;
|
import io.opentelemetry.javaagent.instrumentation.playws.AsyncHttpClientInstrumentation;
|
||||||
import io.opentelemetry.javaagent.tooling.Instrumenter;
|
import io.opentelemetry.javaagent.tooling.InstrumentationModule;
|
||||||
|
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
|
||||||
|
import java.util.List;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
import play.shaded.ahc.org.asynchttpclient.AsyncHandler;
|
import play.shaded.ahc.org.asynchttpclient.AsyncHandler;
|
||||||
import play.shaded.ahc.org.asynchttpclient.Request;
|
import play.shaded.ahc.org.asynchttpclient.Request;
|
||||||
import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler;
|
import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler;
|
||||||
import play.shaded.ahc.org.asynchttpclient.ws.WebSocketUpgradeHandler;
|
import play.shaded.ahc.org.asynchttpclient.ws.WebSocketUpgradeHandler;
|
||||||
|
|
||||||
@AutoService(Instrumenter.class)
|
@AutoService(InstrumentationModule.class)
|
||||||
public class PlayWSClientInstrumentation extends BasePlayWSClientInstrumentation {
|
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<TypeInstrumentation> typeInstrumentations() {
|
||||||
|
return singletonList(new AsyncHttpClientInstrumentation(ClientAdvice.class.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
public static class ClientAdvice {
|
public static class ClientAdvice {
|
||||||
@Advice.OnMethodEnter(suppress = Throwable.class)
|
@Advice.OnMethodEnter(suppress = Throwable.class)
|
||||||
public static void methodEnter(
|
public static void methodEnter(
|
||||||
@Advice.Argument(0) Request request,
|
@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("otelSpan") Span span,
|
||||||
@Advice.Local("otelScope") Scope scope) {
|
@Advice.Local("otelScope") Scope scope) {
|
||||||
Context parentContext = Java8BytecodeBridge.currentContext();
|
Context parentContext = Java8BytecodeBridge.currentContext();
|
||||||
|
@ -37,7 +59,7 @@ public class PlayWSClientInstrumentation extends BasePlayWSClientInstrumentation
|
||||||
if (asyncHandler instanceof StreamedAsyncHandler) {
|
if (asyncHandler instanceof StreamedAsyncHandler) {
|
||||||
asyncHandler =
|
asyncHandler =
|
||||||
new StreamedAsyncHandlerWrapper(
|
new StreamedAsyncHandlerWrapper(
|
||||||
(StreamedAsyncHandler) asyncHandler, span, parentContext);
|
(StreamedAsyncHandler<?>) asyncHandler, span, parentContext);
|
||||||
} else if (!(asyncHandler instanceof WebSocketUpgradeHandler)) {
|
} else if (!(asyncHandler instanceof WebSocketUpgradeHandler)) {
|
||||||
// websocket upgrade handlers aren't supported
|
// websocket upgrade handlers aren't supported
|
||||||
asyncHandler = new AsyncHandlerWrapper(asyncHandler, span, parentContext);
|
asyncHandler = new AsyncHandlerWrapper(asyncHandler, span, parentContext);
|
|
@ -6,25 +6,47 @@
|
||||||
package io.opentelemetry.javaagent.instrumentation.playws.v2_0;
|
package io.opentelemetry.javaagent.instrumentation.playws.v2_0;
|
||||||
|
|
||||||
import static io.opentelemetry.javaagent.instrumentation.playws.PlayWSClientTracer.tracer;
|
import static io.opentelemetry.javaagent.instrumentation.playws.PlayWSClientTracer.tracer;
|
||||||
|
import static java.util.Collections.singletonList;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import io.opentelemetry.api.trace.Span;
|
import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.javaagent.instrumentation.playws.BasePlayWSClientInstrumentation;
|
import io.opentelemetry.javaagent.instrumentation.playws.AsyncHttpClientInstrumentation;
|
||||||
import io.opentelemetry.javaagent.tooling.Instrumenter;
|
import io.opentelemetry.javaagent.tooling.InstrumentationModule;
|
||||||
|
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
|
||||||
|
import java.util.List;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
import play.shaded.ahc.org.asynchttpclient.AsyncHandler;
|
import play.shaded.ahc.org.asynchttpclient.AsyncHandler;
|
||||||
import play.shaded.ahc.org.asynchttpclient.Request;
|
import play.shaded.ahc.org.asynchttpclient.Request;
|
||||||
import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler;
|
import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler;
|
||||||
import play.shaded.ahc.org.asynchttpclient.ws.WebSocketUpgradeHandler;
|
import play.shaded.ahc.org.asynchttpclient.ws.WebSocketUpgradeHandler;
|
||||||
|
|
||||||
@AutoService(Instrumenter.class)
|
@AutoService(InstrumentationModule.class)
|
||||||
public class PlayWSClientInstrumentation extends BasePlayWSClientInstrumentation {
|
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<TypeInstrumentation> typeInstrumentations() {
|
||||||
|
return singletonList(new AsyncHttpClientInstrumentation(ClientAdvice.class.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
public static class ClientAdvice {
|
public static class ClientAdvice {
|
||||||
@Advice.OnMethodEnter(suppress = Throwable.class)
|
@Advice.OnMethodEnter(suppress = Throwable.class)
|
||||||
public static void methodEnter(
|
public static void methodEnter(
|
||||||
@Advice.Argument(0) Request request,
|
@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("otelSpan") Span span) {
|
||||||
|
|
||||||
span = tracer().startSpan(request);
|
span = tracer().startSpan(request);
|
||||||
|
@ -33,7 +55,8 @@ public class PlayWSClientInstrumentation extends BasePlayWSClientInstrumentation
|
||||||
scope.close();
|
scope.close();
|
||||||
|
|
||||||
if (asyncHandler instanceof StreamedAsyncHandler) {
|
if (asyncHandler instanceof StreamedAsyncHandler) {
|
||||||
asyncHandler = new StreamedAsyncHandlerWrapper((StreamedAsyncHandler) asyncHandler, span);
|
asyncHandler =
|
||||||
|
new StreamedAsyncHandlerWrapper((StreamedAsyncHandler<?>) asyncHandler, span);
|
||||||
} else if (!(asyncHandler instanceof WebSocketUpgradeHandler)) {
|
} else if (!(asyncHandler instanceof WebSocketUpgradeHandler)) {
|
||||||
// websocket upgrade handlers aren't supported
|
// websocket upgrade handlers aren't supported
|
||||||
asyncHandler = new AsyncHandlerWrapper(asyncHandler, span);
|
asyncHandler = new AsyncHandlerWrapper(asyncHandler, span);
|
|
@ -6,25 +6,47 @@
|
||||||
package io.opentelemetry.javaagent.instrumentation.playws.v2_1;
|
package io.opentelemetry.javaagent.instrumentation.playws.v2_1;
|
||||||
|
|
||||||
import static io.opentelemetry.javaagent.instrumentation.playws.PlayWSClientTracer.tracer;
|
import static io.opentelemetry.javaagent.instrumentation.playws.PlayWSClientTracer.tracer;
|
||||||
|
import static java.util.Collections.singletonList;
|
||||||
|
|
||||||
import com.google.auto.service.AutoService;
|
import com.google.auto.service.AutoService;
|
||||||
import io.opentelemetry.api.trace.Span;
|
import io.opentelemetry.api.trace.Span;
|
||||||
import io.opentelemetry.context.Scope;
|
import io.opentelemetry.context.Scope;
|
||||||
import io.opentelemetry.javaagent.instrumentation.playws.BasePlayWSClientInstrumentation;
|
import io.opentelemetry.javaagent.instrumentation.playws.AsyncHttpClientInstrumentation;
|
||||||
import io.opentelemetry.javaagent.tooling.Instrumenter;
|
import io.opentelemetry.javaagent.tooling.InstrumentationModule;
|
||||||
|
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
|
||||||
|
import java.util.List;
|
||||||
import net.bytebuddy.asm.Advice;
|
import net.bytebuddy.asm.Advice;
|
||||||
import play.shaded.ahc.org.asynchttpclient.AsyncHandler;
|
import play.shaded.ahc.org.asynchttpclient.AsyncHandler;
|
||||||
import play.shaded.ahc.org.asynchttpclient.Request;
|
import play.shaded.ahc.org.asynchttpclient.Request;
|
||||||
import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler;
|
import play.shaded.ahc.org.asynchttpclient.handler.StreamedAsyncHandler;
|
||||||
import play.shaded.ahc.org.asynchttpclient.ws.WebSocketUpgradeHandler;
|
import play.shaded.ahc.org.asynchttpclient.ws.WebSocketUpgradeHandler;
|
||||||
|
|
||||||
@AutoService(Instrumenter.class)
|
@AutoService(InstrumentationModule.class)
|
||||||
public class PlayWSClientInstrumentation extends BasePlayWSClientInstrumentation {
|
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<TypeInstrumentation> typeInstrumentations() {
|
||||||
|
return singletonList(new AsyncHttpClientInstrumentation(ClientAdvice.class.getName()));
|
||||||
|
}
|
||||||
|
|
||||||
public static class ClientAdvice {
|
public static class ClientAdvice {
|
||||||
@Advice.OnMethodEnter(suppress = Throwable.class)
|
@Advice.OnMethodEnter(suppress = Throwable.class)
|
||||||
public static void methodEnter(
|
public static void methodEnter(
|
||||||
@Advice.Argument(0) Request request,
|
@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("otelSpan") Span span) {
|
||||||
|
|
||||||
span = tracer().startSpan(request);
|
span = tracer().startSpan(request);
|
||||||
|
@ -33,7 +55,8 @@ public class PlayWSClientInstrumentation extends BasePlayWSClientInstrumentation
|
||||||
scope.close();
|
scope.close();
|
||||||
|
|
||||||
if (asyncHandler instanceof StreamedAsyncHandler) {
|
if (asyncHandler instanceof StreamedAsyncHandler) {
|
||||||
asyncHandler = new StreamedAsyncHandlerWrapper((StreamedAsyncHandler) asyncHandler, span);
|
asyncHandler =
|
||||||
|
new StreamedAsyncHandlerWrapper((StreamedAsyncHandler<?>) asyncHandler, span);
|
||||||
} else if (!(asyncHandler instanceof WebSocketUpgradeHandler)) {
|
} else if (!(asyncHandler instanceof WebSocketUpgradeHandler)) {
|
||||||
// websocket upgrade handlers aren't supported
|
// websocket upgrade handlers aren't supported
|
||||||
asyncHandler = new AsyncHandlerWrapper(asyncHandler, span);
|
asyncHandler = new AsyncHandlerWrapper(asyncHandler, span);
|
|
@ -15,15 +15,17 @@ import static net.bytebuddy.matcher.ElementMatchers.not;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
|
||||||
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
import io.opentelemetry.javaagent.tooling.Instrumenter;
|
import io.opentelemetry.javaagent.tooling.TypeInstrumentation;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import net.bytebuddy.description.method.MethodDescription;
|
import net.bytebuddy.description.method.MethodDescription;
|
||||||
import net.bytebuddy.description.type.TypeDescription;
|
import net.bytebuddy.description.type.TypeDescription;
|
||||||
import net.bytebuddy.matcher.ElementMatcher;
|
import net.bytebuddy.matcher.ElementMatcher;
|
||||||
|
|
||||||
public abstract class BasePlayWSClientInstrumentation extends Instrumenter.Default {
|
public class AsyncHttpClientInstrumentation implements TypeInstrumentation {
|
||||||
public BasePlayWSClientInstrumentation() {
|
private final String adviceName;
|
||||||
super("play-ws");
|
|
||||||
|
public AsyncHttpClientInstrumentation(String adviceName) {
|
||||||
|
this.adviceName = adviceName;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -50,16 +52,6 @@ public abstract class BasePlayWSClientInstrumentation extends Instrumenter.Defau
|
||||||
.and(takesArguments(2))
|
.and(takesArguments(2))
|
||||||
.and(takesArgument(0, named("play.shaded.ahc.org.asynchttpclient.Request")))
|
.and(takesArgument(0, named("play.shaded.ahc.org.asynchttpclient.Request")))
|
||||||
.and(takesArgument(1, named("play.shaded.ahc.org.asynchttpclient.AsyncHandler"))),
|
.and(takesArgument(1, named("play.shaded.ahc.org.asynchttpclient.AsyncHandler"))),
|
||||||
getClass().getName() + "$ClientAdvice");
|
adviceName);
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] helperClassNames() {
|
|
||||||
return new String[] {
|
|
||||||
"io.opentelemetry.javaagent.instrumentation.playws.PlayWSClientTracer",
|
|
||||||
"io.opentelemetry.javaagent.instrumentation.playws.HeadersInjectAdapter",
|
|
||||||
packageName + ".AsyncHandlerWrapper",
|
|
||||||
packageName + ".StreamedAsyncHandlerWrapper"
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -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<ClassLoader> classLoaderMatcher() {
|
|
||||||
// Optimization for expensive typeMatcher.
|
|
||||||
return hasClassesNamed("play.api.mvc.Action");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ElementMatcher<TypeDescription> typeMatcher() {
|
|
||||||
return implementsInterface(named("play.api.mvc.Action"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] helperClassNames() {
|
|
||||||
return new String[] {packageName + ".PlayTracer", packageName + ".RequestCompleteCallback"};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
|
||||||
return singletonMap(
|
|
||||||
named("apply")
|
|
||||||
.and(takesArgument(0, named("play.api.mvc.Request")))
|
|
||||||
.and(returns(named("scala.concurrent.Future"))),
|
|
||||||
packageName + ".PlayAdvice");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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<TypeInstrumentation> typeInstrumentations() {
|
||||||
|
return singletonList(new ActionInstrumentation());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class ActionInstrumentation implements TypeInstrumentation {
|
||||||
|
@Override
|
||||||
|
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
||||||
|
// Optimization for expensive typeMatcher.
|
||||||
|
return hasClassesNamed("play.api.mvc.Action");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ElementMatcher<TypeDescription> typeMatcher() {
|
||||||
|
return implementsInterface(named("play.api.mvc.Action"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
||||||
|
return singletonMap(
|
||||||
|
named("apply")
|
||||||
|
.and(takesArgument(0, named("play.api.mvc.Request")))
|
||||||
|
.and(returns(named("scala.concurrent.Future"))),
|
||||||
|
PlayAdvice.class.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<ClassLoader> classLoaderMatcher() {
|
|
||||||
// Optimization for expensive typeMatcher.
|
|
||||||
return hasClassesNamed("play.api.mvc.Action");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ElementMatcher<TypeDescription> typeMatcher() {
|
|
||||||
return implementsInterface(named("play.api.mvc.Action"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] helperClassNames() {
|
|
||||||
return new String[] {packageName + ".PlayTracer", packageName + ".RequestCompleteCallback"};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
|
||||||
return singletonMap(
|
|
||||||
named("apply")
|
|
||||||
.and(takesArgument(0, named("play.api.mvc.Request")))
|
|
||||||
.and(returns(named("scala.concurrent.Future"))),
|
|
||||||
packageName + ".PlayAdvice");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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<TypeInstrumentation> typeInstrumentations() {
|
||||||
|
return singletonList(new ActionInstrumentation());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class ActionInstrumentation implements TypeInstrumentation {
|
||||||
|
@Override
|
||||||
|
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
||||||
|
// Optimization for expensive typeMatcher.
|
||||||
|
return hasClassesNamed("play.api.mvc.Action");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ElementMatcher<TypeDescription> typeMatcher() {
|
||||||
|
return implementsInterface(named("play.api.mvc.Action"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
||||||
|
return singletonMap(
|
||||||
|
named("apply")
|
||||||
|
.and(takesArgument(0, named("play.api.mvc.Request")))
|
||||||
|
.and(returns(named("scala.concurrent.Future"))),
|
||||||
|
PlayAdvice.class.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -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<ClassLoader> classLoaderMatcher() {
|
|
||||||
// Optimization for expensive typeMatcher.
|
|
||||||
return hasClassesNamed("play.api.mvc.Action");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ElementMatcher<TypeDescription> typeMatcher() {
|
|
||||||
return implementsInterface(named("play.api.mvc.Action"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String[] helperClassNames() {
|
|
||||||
return new String[] {packageName + ".PlayTracer", packageName + ".RequestCompleteCallback"};
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
|
||||||
return singletonMap(
|
|
||||||
named("apply")
|
|
||||||
.and(takesArgument(0, named("play.api.mvc.Request")))
|
|
||||||
.and(returns(named("scala.concurrent.Future"))),
|
|
||||||
packageName + ".PlayAdvice");
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -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<TypeInstrumentation> typeInstrumentations() {
|
||||||
|
return singletonList(new ActionInstrumentation());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class ActionInstrumentation implements TypeInstrumentation {
|
||||||
|
@Override
|
||||||
|
public ElementMatcher<ClassLoader> classLoaderMatcher() {
|
||||||
|
// Optimization for expensive typeMatcher.
|
||||||
|
return hasClassesNamed("play.api.mvc.Action");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ElementMatcher<TypeDescription> typeMatcher() {
|
||||||
|
return implementsInterface(named("play.api.mvc.Action"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<? extends ElementMatcher<? super MethodDescription>, String> transformers() {
|
||||||
|
return singletonMap(
|
||||||
|
named("apply")
|
||||||
|
.and(takesArgument(0, named("play.api.mvc.Request")))
|
||||||
|
.and(returns(named("scala.concurrent.Future"))),
|
||||||
|
PlayAdvice.class.getName());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue