Migrate aws instrumentation to byte buddy.
This commit is contained in:
parent
e5924b3fe9
commit
e96c084b51
|
@ -21,6 +21,7 @@ dependencies {
|
||||||
compile project(':dd-java-agent:tooling')
|
compile project(':dd-java-agent:tooling')
|
||||||
compile project(':dd-trace-annotations')
|
compile project(':dd-trace-annotations')
|
||||||
|
|
||||||
|
compile project(':dd-java-agent:integrations:aws-sdk')
|
||||||
compile project(':dd-java-agent:integrations:servlet-2')
|
compile project(':dd-java-agent:integrations:servlet-2')
|
||||||
compile project(':dd-java-agent:integrations:servlet-3')
|
compile project(':dd-java-agent:integrations:servlet-3')
|
||||||
compile project(':dd-java-agent:integrations:spring-web')
|
compile project(':dd-java-agent:integrations:spring-web')
|
||||||
|
|
|
@ -12,3 +12,18 @@ versionScan {
|
||||||
"com.amazonaws.http.request.HttpRequestFactory": null,
|
"com.amazonaws.http.request.HttpRequestFactory": null,
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
apply from: "${rootDir}/gradle/java.gradle"
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
compileOnly group: 'com.amazonaws', name: 'aws-java-sdk-core', version: '1.11.119'
|
||||||
|
|
||||||
|
compile project(':dd-trace')
|
||||||
|
compile project(':dd-java-agent:tooling')
|
||||||
|
|
||||||
|
compile deps.bytebuddy
|
||||||
|
compile deps.opentracing
|
||||||
|
|
||||||
|
compile group: 'io.opentracing.contrib', name: 'opentracing-aws-sdk', version: '0.0.2'
|
||||||
|
compile group: 'com.google.auto.service', name: 'auto-service', version: '1.0-rc3'
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,59 @@
|
||||||
|
package dd.inst.aws;
|
||||||
|
|
||||||
|
import static dd.trace.ClassLoaderHasClassMatcher.classLoaderHasClasses;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.named;
|
||||||
|
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
|
||||||
|
|
||||||
|
import com.amazonaws.client.builder.AwsClientBuilder;
|
||||||
|
import com.amazonaws.handlers.RequestHandler2;
|
||||||
|
import com.google.auto.service.AutoService;
|
||||||
|
import dd.trace.Instrumenter;
|
||||||
|
import io.opentracing.contrib.aws.TracingRequestHandler;
|
||||||
|
import io.opentracing.util.GlobalTracer;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.List;
|
||||||
|
import net.bytebuddy.agent.builder.AgentBuilder;
|
||||||
|
import net.bytebuddy.asm.Advice;
|
||||||
|
|
||||||
|
@AutoService(Instrumenter.class)
|
||||||
|
public final class AWSClientInstrumentation implements Instrumenter {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AgentBuilder instrument(final AgentBuilder agentBuilder) {
|
||||||
|
return agentBuilder
|
||||||
|
.type(
|
||||||
|
named("com.amazonaws.client.builder.AwsSyncClientBuilder")
|
||||||
|
.or(named("com.amazonaws.client.builder.AwsAsyncClientBuilder")),
|
||||||
|
classLoaderHasClasses(
|
||||||
|
"com.amazonaws.http.client.HttpClientFactory",
|
||||||
|
"com.amazonaws.http.apache.utils.ApacheUtils"))
|
||||||
|
.transform(
|
||||||
|
new AgentBuilder.Transformer.ForAdvice()
|
||||||
|
.advice(
|
||||||
|
named("build").and(takesArguments(0)).and(isPublic()),
|
||||||
|
AWSClientAdvice.class.getName()))
|
||||||
|
.asDecorator();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static class AWSClientAdvice {
|
||||||
|
|
||||||
|
@Advice.OnMethodExit(onThrowable = Throwable.class)
|
||||||
|
public static void addHandler(@Advice.This final AwsClientBuilder builder) {
|
||||||
|
|
||||||
|
final RequestHandler2 handler = new TracingRequestHandler(GlobalTracer.get());
|
||||||
|
|
||||||
|
List<RequestHandler2> handlers = builder.getRequestHandlers();
|
||||||
|
|
||||||
|
if (handlers == null || handlers.isEmpty()) {
|
||||||
|
handlers = Arrays.asList(handler);
|
||||||
|
} else {
|
||||||
|
// Check if we already added the handler
|
||||||
|
if (!(handlers.get(0) instanceof TracingRequestHandler)) {
|
||||||
|
handlers.add(0, handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
builder.setRequestHandlers(handler);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,49 +0,0 @@
|
||||||
package com.datadoghq.agent.integration;
|
|
||||||
|
|
||||||
import com.amazonaws.client.builder.AwsClientBuilder;
|
|
||||||
import com.amazonaws.handlers.RequestHandler2;
|
|
||||||
import io.opentracing.contrib.aws.TracingRequestHandler;
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
import org.jboss.byteman.rule.Rule;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Patch the AWS Client during the building steps. This opentracing integration is compatible with
|
|
||||||
* the latest release of the AWS SDK
|
|
||||||
*/
|
|
||||||
public class AWSClientHelper extends DDAgentTracingHelper<AwsClientBuilder> {
|
|
||||||
|
|
||||||
public AWSClientHelper(Rule rule) {
|
|
||||||
super(rule);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Strategy: we add a tracing handler to the client when it has just been built. We intercept the
|
|
||||||
* return value of the com.amazonaws.client.builder.AwsClientBuilder.build() method and add the
|
|
||||||
* handler.
|
|
||||||
*
|
|
||||||
* @param client The fresh AWS client instance
|
|
||||||
* @return The same instance, but patched
|
|
||||||
* @throws Exception
|
|
||||||
*/
|
|
||||||
protected AwsClientBuilder doPatch(AwsClientBuilder client) throws Exception {
|
|
||||||
|
|
||||||
RequestHandler2 handler = new TracingRequestHandler(tracer);
|
|
||||||
|
|
||||||
Field field = AwsClientBuilder.class.getDeclaredField("requestHandlers");
|
|
||||||
field.setAccessible(true);
|
|
||||||
List<RequestHandler2> handlers = (List<RequestHandler2>) field.get(client);
|
|
||||||
|
|
||||||
if (handlers == null || handlers.isEmpty()) {
|
|
||||||
handlers = Arrays.asList(handler);
|
|
||||||
} else {
|
|
||||||
// Check if we already added the handler
|
|
||||||
if (!(handlers.get(0) instanceof TracingRequestHandler)) {
|
|
||||||
handlers.add(0, handler);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
client.setRequestHandlers((RequestHandler2[]) handlers.toArray());
|
|
||||||
return client;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -13,18 +13,6 @@
|
||||||
#ENDRULE
|
#ENDRULE
|
||||||
|
|
||||||
|
|
||||||
# Instrument AWS SDK client
|
|
||||||
# ==========================
|
|
||||||
RULE AwsClientBuilder-init
|
|
||||||
CLASS ^com.amazonaws.client.builder.AwsClientBuilder
|
|
||||||
METHOD <init>
|
|
||||||
AT EXIT
|
|
||||||
IF TRUE
|
|
||||||
DO
|
|
||||||
com.datadoghq.agent.InstrumentationRulesManager.registerClassLoad($0);
|
|
||||||
ENDRULE
|
|
||||||
|
|
||||||
|
|
||||||
# Instrument Cassandra client
|
# Instrument Cassandra client
|
||||||
# ===========================
|
# ===========================
|
||||||
RULE Cluster$Manager-init
|
RULE Cluster$Manager-init
|
||||||
|
|
|
@ -21,20 +21,6 @@ DO
|
||||||
ENDRULE
|
ENDRULE
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Instrument AWS SDK client
|
|
||||||
# ==========================
|
|
||||||
RULE opentracing-aws-sdk
|
|
||||||
CLASS ^com.amazonaws.client.builder.AwsClientBuilder
|
|
||||||
METHOD build()
|
|
||||||
HELPER com.datadoghq.agent.integration.AWSClientHelper
|
|
||||||
AT ENTRY
|
|
||||||
IF TRUE
|
|
||||||
DO
|
|
||||||
patch($0);
|
|
||||||
ENDRULE
|
|
||||||
|
|
||||||
|
|
||||||
# Instrument Cassandra client
|
# Instrument Cassandra client
|
||||||
# ===========================
|
# ===========================
|
||||||
RULE opentracing-cassandra-driver
|
RULE opentracing-cassandra-driver
|
||||||
|
|
Loading…
Reference in New Issue