Skip to content

Commit 13c774e

Browse files
committed
Fix AWS integration
Handler was being added on builder return, which was too late. It appears it would have also failed if an existing handler resulted in a unmodifiable list to be returned.
1 parent 29ffdf7 commit 13c774e

File tree

2 files changed

+54
-13
lines changed

2 files changed

+54
-13
lines changed

dd-java-agent/instrumentation/aws-sdk/src/main/java/datadog/trace/instrumentation/aws/AWSClientInstrumentation.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
import io.opentracing.contrib.aws.TracingRequestHandler;
1818
import io.opentracing.util.GlobalTracer;
1919
import java.util.ArrayList;
20+
import java.util.Collections;
2021
import java.util.List;
2122
import net.bytebuddy.agent.builder.AgentBuilder;
2223
import net.bytebuddy.asm.Advice;
@@ -48,21 +49,22 @@ public AgentBuilder instrument(final AgentBuilder agentBuilder) {
4849
}
4950

5051
public static class AWSClientAdvice {
51-
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
52+
@Advice.OnMethodEnter(suppress = Throwable.class)
5253
public static void addHandler(@Advice.This final AwsClientBuilder<?, ?> builder) {
5354
List<RequestHandler2> handlers = builder.getRequestHandlers();
5455
boolean hasDDHandler = false;
5556
if (null == handlers) {
56-
handlers = new ArrayList<RequestHandler2>(1);
57+
handlers = Collections.emptyList();
5758
} else {
58-
for (RequestHandler2 handler : handlers) {
59+
for (final RequestHandler2 handler : handlers) {
5960
if (handler instanceof TracingRequestHandler) {
6061
hasDDHandler = true;
6162
break;
6263
}
6364
}
6465
}
6566
if (!hasDDHandler) {
67+
handlers = new ArrayList<>(handlers); // copy since returned list is unmodifiable
6668
handlers.add(new TracingRequestHandler(GlobalTracer.get()));
6769
builder.setRequestHandlers(handlers.toArray(new RequestHandler2[0]));
6870
}

dd-java-agent/instrumentation/aws-sdk/src/test/groovy/AWSClientTest.groovy

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
1+
import com.amazonaws.AmazonWebServiceClient
12
import com.amazonaws.auth.AWSStaticCredentialsProvider
23
import com.amazonaws.auth.AnonymousAWSCredentials
34
import com.amazonaws.client.builder.AwsClientBuilder
5+
import com.amazonaws.handlers.RequestHandler2
46
import com.amazonaws.regions.Regions
57
import com.amazonaws.services.s3.AmazonS3ClientBuilder
68
import datadog.trace.agent.test.AgentTestRunner
@@ -16,14 +18,22 @@ class AWSClientTest extends AgentTestRunner {
1618

1719
def "request handler is hooked up"() {
1820
setup:
19-
def client = AmazonS3ClientBuilder.standard()
21+
def builder = AmazonS3ClientBuilder.standard()
2022
.withRegion(Regions.US_EAST_1)
21-
client.build()
23+
if (addHandler) {
24+
builder.withRequestHandlers(new RequestHandler2() {})
25+
}
26+
AmazonWebServiceClient client = builder.build()
2227

2328
expect:
24-
client.getRequestHandlers() != null
25-
client.getRequestHandlers().size() == 1
26-
client.getRequestHandlers().get(0).getClass().getSimpleName() == "TracingRequestHandler"
29+
client.requestHandler2s != null
30+
client.requestHandler2s.size() == size
31+
client.requestHandler2s.get(position).getClass().getSimpleName() == "TracingRequestHandler"
32+
33+
where:
34+
addHandler | size | position
35+
true | 2 | 1
36+
false | 1 | 0
2737
}
2838

2939
def "send request with mocked back end"() {
@@ -39,7 +49,7 @@ class AWSClientTest extends AgentTestRunner {
3949
}
4050
AwsClientBuilder.EndpointConfiguration endpoint = new AwsClientBuilder.EndpointConfiguration("http://localhost:$server.address.port", "us-west-2");
4151

42-
def client = AmazonS3ClientBuilder
52+
AmazonWebServiceClient client = AmazonS3ClientBuilder
4353
.standard()
4454
.withPathStyleAccessEnabled(true)
4555
.withEndpointConfiguration(endpoint)
@@ -51,12 +61,13 @@ class AWSClientTest extends AgentTestRunner {
5161
expect:
5262
bucket != null
5363

54-
receivedHeaders.get().get("x-datadog-trace-id") == null
55-
receivedHeaders.get().get("x-datadog-parent-id") == null
64+
client.requestHandler2s != null
65+
client.requestHandler2s.size() == 1
66+
client.requestHandler2s.get(0).getClass().getSimpleName() == "TracingRequestHandler"
5667

57-
TEST_WRITER.size() == 1
68+
TEST_WRITER.size() == 2
5869

59-
def trace = TEST_WRITER.firstTrace()
70+
def trace = TEST_WRITER.get(0)
6071
trace.size() == 2
6172

6273
and: // span 0 - from apache-httpclient instrumentation
@@ -97,6 +108,34 @@ class AWSClientTest extends AgentTestRunner {
97108
tags2[DDTags.THREAD_ID] != null
98109
tags2.size() == 8
99110

111+
and:
112+
113+
def trace2 = TEST_WRITER.get(1)
114+
trace2.size() == 1
115+
116+
and: // span 0 - from aws instrumentation
117+
def span = trace2[0]
118+
119+
span.context().operationName == "Amazon S3"
120+
span.serviceName == "unnamed-java-app"
121+
span.resourceName == "Amazon S3"
122+
span.type == null
123+
!span.context().getErrorFlag()
124+
span.context().parentId == 0
125+
126+
def tags = span.context().tags
127+
tags["component"] == "java-aws-sdk"
128+
tags2[Tags.SPAN_KIND.key] == Tags.SPAN_KIND_CLIENT
129+
tags2[Tags.HTTP_METHOD.key] == "PUT"
130+
tags2[Tags.HTTP_URL.key] == "http://localhost:$server.address.port/testbucket/"
131+
tags2[Tags.HTTP_STATUS.key] == 200
132+
tags["thread.name"] != null
133+
tags["thread.id"] != null
134+
tags.size() == 7
135+
136+
receivedHeaders.get().get("x-datadog-trace-id") == "$span.traceId"
137+
receivedHeaders.get().get("x-datadog-parent-id") == "$span.spanId"
138+
100139
cleanup:
101140
server.close()
102141
}

0 commit comments

Comments
 (0)