Skip to content

Commit 306086b

Browse files
authored
Merge pull request #143 from DataDog/tyler/trace-annotation
Use byte buddy for @trace instead of byteman
2 parents 161d77b + cacba43 commit 306086b

File tree

6 files changed

+65
-204
lines changed

6 files changed

+65
-204
lines changed

dd-java-agent-ittests/src/test/java/com/datadoghq/agent/TraceAnnotationsManagerTest.java renamed to dd-java-agent-ittests/src/test/java/com/datadoghq/agent/instrumentation/annotation/TraceAnnotationsTest.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.datadoghq.agent;
1+
package com.datadoghq.agent.instrumentation.annotation;
22

33
import static org.assertj.core.api.Assertions.assertThat;
44

@@ -14,7 +14,7 @@
1414
import org.junit.Before;
1515
import org.junit.Test;
1616

17-
public class TraceAnnotationsManagerTest {
17+
public class TraceAnnotationsTest {
1818

1919
private final ListWriter writer = new ListWriter();
2020
private final DDTracer tracer = new DDTracer(writer);
@@ -39,7 +39,8 @@ public void testSimpleCaseAnnotations() {
3939
SayTracedHello.sayHello();
4040

4141
assertThat(writer.firstTrace().size()).isEqualTo(1);
42-
assertThat(writer.firstTrace().get(0).getOperationName()).isEqualTo("SAY_HELLO");
42+
assertThat(writer.firstTrace().get(0).getOperationName())
43+
.isEqualTo("com.datadoghq.agent.test.SayTracedHello.sayHello");
4344
assertThat(writer.firstTrace().get(0).getServiceName()).isEqualTo("test");
4445
}
4546

@@ -56,7 +57,8 @@ public void testComplexCaseAnnotations() {
5657
assertThat(writer.firstTrace().get(0).context().getParentId()).isEqualTo(0);
5758
assertThat(writer.firstTrace().get(0).getServiceName()).isEqualTo("test2");
5859

59-
assertThat(writer.firstTrace().get(1).getOperationName()).isEqualTo("SAY_HELLO");
60+
assertThat(writer.firstTrace().get(1).getOperationName())
61+
.isEqualTo("com.datadoghq.agent.test.SayTracedHello.sayHello");
6062
assertThat(writer.firstTrace().get(1).getServiceName()).isEqualTo("test");
6163
assertThat(writer.firstTrace().get(1).getParentId()).isEqualTo(parentId);
6264

@@ -82,7 +84,7 @@ public void testExceptionExit() {
8284

8385
final DDBaseSpan<?> span = writer.firstTrace().get(0);
8486
assertThat(span.getOperationName()).isEqualTo("ERROR");
85-
assertThat(span.getTags().get("error")).isEqualTo("true");
87+
assertThat(span.getTags().get("error")).isEqualTo(true);
8688
assertThat(span.getTags().get("error.msg")).isEqualTo(error.getMessage());
8789
assertThat(span.getTags().get("error.type")).isEqualTo(error.getClass().getName());
8890
assertThat(span.getTags().get("error.stack")).isEqualTo(errorString.toString());

dd-java-agent-ittests/src/test/java/com/datadoghq/agent/test/SayTracedHello.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
public class SayTracedHello {
99

10-
@Trace(operationName = "SAY_HELLO")
10+
@Trace
1111
public static String sayHello() {
1212
new StringTag(DDTags.SERVICE_NAME).set(GlobalTracer.get().activeSpan(), "test");
1313
return "hello!";

dd-java-agent/dd-java-agent.gradle

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ dependencies {
2323
compile group: 'net.bytebuddy', name: 'byte-buddy', version: '1.7.6'
2424
compile group: 'org.jboss.byteman', name: 'byteman', version: '3.0.10'
2525

26-
compile group: 'org.reflections', name: 'reflections', version: '0.9.11'
2726
compile group: 'com.google.auto.service', name: 'auto-service', version: '1.0-rc3'
2827
compile deps.slf4j
2928

@@ -87,9 +86,7 @@ shadowJar {
8786
relocate 'org.msgpack', 'dd.deps.org.msgpack'
8887
relocate 'com.fasterxml', 'dd.deps.com.fasterxml'
8988

90-
relocate 'javassist', 'dd.deps.javassist'
9189
relocate 'net.bytebuddy', 'dd.deps.net.bytebuddy'
92-
relocate 'org.reflections', 'dd.deps.org.reflections'
9390
relocate('org.jboss.byteman', 'dd.deps.org.jboss.byteman') {
9491
// Renaming these causes a verify error in the tests.
9592
exclude 'org.jboss.byteman.rule.*'

dd-java-agent/src/main/java/com/datadoghq/agent/AgentRulesManager.java

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,10 @@ public class AgentRulesManager {
3232
protected final Retransformer transformer;
3333
protected final TracingAgentConfig agentTracerConfig;
3434
protected final InstrumentationRulesManager instrumentationRulesManager;
35-
protected final TraceAnnotationsManager traceAnnotationsManager;
3635

3736
public AgentRulesManager(final Retransformer trans, final TracingAgentConfig config) {
3837
transformer = trans;
3938
agentTracerConfig = config;
40-
traceAnnotationsManager = new TraceAnnotationsManager(trans, config);
4139
instrumentationRulesManager = new InstrumentationRulesManager(trans, config, this);
4240
}
4341

@@ -62,7 +60,6 @@ public static void initialize(final Retransformer trans) {
6260
INSTANCE = manager;
6361

6462
manager.loadRules(INITIALIZER_RULES, ClassLoader.getSystemClassLoader());
65-
manager.traceAnnotationsManager.initialize();
6663
}
6764

6865
/**

dd-java-agent/src/main/java/com/datadoghq/agent/TraceAnnotationsManager.java

Lines changed: 0 additions & 192 deletions
This file was deleted.
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package com.datadoghq.agent.instrumentation.annotation;
2+
3+
import static net.bytebuddy.matcher.ElementMatchers.declaresMethod;
4+
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
5+
import static net.bytebuddy.matcher.ElementMatchers.isAnnotatedWith;
6+
7+
import com.datadoghq.agent.instrumentation.Instrumenter;
8+
import com.datadoghq.trace.Trace;
9+
import com.google.auto.service.AutoService;
10+
import io.opentracing.ActiveSpan;
11+
import io.opentracing.tag.Tags;
12+
import io.opentracing.util.GlobalTracer;
13+
import java.lang.reflect.Method;
14+
import java.sql.PreparedStatement;
15+
import java.util.Collections;
16+
import java.util.Map;
17+
import java.util.WeakHashMap;
18+
import net.bytebuddy.agent.builder.AgentBuilder;
19+
import net.bytebuddy.asm.Advice;
20+
21+
@AutoService(Instrumenter.class)
22+
public final class TraceAnnotationInstrumentation implements Instrumenter {
23+
public static final Map<PreparedStatement, String> preparedStatements = new WeakHashMap<>();
24+
25+
@Override
26+
public AgentBuilder instrument(final AgentBuilder agentBuilder) {
27+
return agentBuilder
28+
.type(hasSuperType(declaresMethod(isAnnotatedWith(Trace.class))))
29+
.transform(
30+
new AgentBuilder.Transformer.ForAdvice()
31+
.advice(isAnnotatedWith(Trace.class), TraceAdvice.class.getName()));
32+
}
33+
34+
public static class TraceAdvice {
35+
36+
@Advice.OnMethodEnter
37+
public static ActiveSpan startSpan(@Advice.Origin final Method method) {
38+
final Trace trace = method.getAnnotation(Trace.class);
39+
String operationName = trace.operationName();
40+
if (operationName == null || operationName.isEmpty()) {
41+
operationName = method.getDeclaringClass().getName() + "." + method.getName();
42+
}
43+
44+
return GlobalTracer.get().buildSpan(operationName).startActive();
45+
}
46+
47+
@Advice.OnMethodExit(onThrowable = Throwable.class)
48+
public static void stopSpan(
49+
@Advice.Enter final ActiveSpan activeSpan, @Advice.Thrown final Throwable throwable) {
50+
if (throwable != null) {
51+
Tags.ERROR.set(activeSpan, true);
52+
activeSpan.log(Collections.singletonMap("error.object", throwable));
53+
}
54+
activeSpan.deactivate();
55+
}
56+
}
57+
}

0 commit comments

Comments
 (0)