Skip to content

Commit 2986b57

Browse files
authored
Update AWS SDK request id to match semantic conventions (#12352)
1 parent ef32d13 commit 2986b57

File tree

17 files changed

+261
-99
lines changed

17 files changed

+261
-99
lines changed

instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/S3TracingTest.groovy

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification
77
import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes
8+
import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes
89
import io.opentelemetry.semconv.ServerAttributes
910
import io.opentelemetry.semconv.HttpAttributes
1011
import io.opentelemetry.semconv.NetworkAttributes
@@ -60,8 +61,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
6061
attributes {
6162
"aws.agent" "java-aws-sdk"
6263
"aws.endpoint" String
63-
"rpc.method" "CreateQueue"
6464
"aws.queue.name" queueName
65+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
66+
"rpc.method" "CreateQueue"
6567
"rpc.system" "aws-api"
6668
"rpc.service" "AmazonSQS"
6769
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
@@ -82,10 +84,10 @@ class S3TracingTest extends AgentInstrumentationSpecification {
8284
attributes {
8385
"aws.agent" "java-aws-sdk"
8486
"aws.endpoint" String
87+
"aws.bucket.name" bucketName
8588
"rpc.method" "CreateBucket"
8689
"rpc.system" "aws-api"
8790
"rpc.service" "Amazon S3"
88-
"aws.bucket.name" bucketName
8991
"$HttpAttributes.HTTP_REQUEST_METHOD" "PUT"
9092
"$HttpAttributes.HTTP_RESPONSE_STATUS_CODE" 200
9193
"$UrlAttributes.URL_FULL" { it.startsWith("http://") }
@@ -104,8 +106,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
104106
attributes {
105107
"aws.agent" "java-aws-sdk"
106108
"aws.endpoint" String
107-
"rpc.method" "GetQueueAttributes"
108109
"aws.queue.url" queueUrl
110+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
111+
"rpc.method" "GetQueueAttributes"
109112
"rpc.system" "aws-api"
110113
"rpc.service" "AmazonSQS"
111114
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
@@ -126,8 +129,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
126129
attributes {
127130
"aws.agent" "java-aws-sdk"
128131
"aws.endpoint" String
129-
"rpc.method" "SetQueueAttributes"
130132
"aws.queue.url" queueUrl
133+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
134+
"rpc.method" "SetQueueAttributes"
131135
"rpc.system" "aws-api"
132136
"rpc.service" "AmazonSQS"
133137
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
@@ -188,8 +192,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
188192
attributes {
189193
"aws.agent" "java-aws-sdk"
190194
"aws.endpoint" String
191-
"rpc.method" "ReceiveMessage"
192195
"aws.queue.url" queueUrl
196+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
197+
"rpc.method" "ReceiveMessage"
193198
"rpc.system" "aws-api"
194199
"rpc.service" "AmazonSQS"
195200
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
@@ -282,8 +287,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
282287
attributes {
283288
"aws.agent" "java-aws-sdk"
284289
"aws.endpoint" String
285-
"rpc.method" "PurgeQueue"
286290
"aws.queue.url" queueUrl
291+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
292+
"rpc.method" "PurgeQueue"
287293
"rpc.system" "aws-api"
288294
"rpc.service" "AmazonSQS"
289295
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
@@ -336,8 +342,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
336342
attributes {
337343
"aws.agent" "java-aws-sdk"
338344
"aws.endpoint" String
339-
"rpc.method" "CreateQueue"
340345
"aws.queue.name" queueName
346+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
347+
"rpc.method" "CreateQueue"
341348
"rpc.system" "aws-api"
342349
"rpc.service" "AmazonSQS"
343350
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
@@ -357,8 +364,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
357364
attributes {
358365
"aws.agent" "java-aws-sdk"
359366
"aws.endpoint" String
360-
"rpc.method" "GetQueueAttributes"
361367
"aws.queue.url" queueUrl
368+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
369+
"rpc.method" "GetQueueAttributes"
362370
"rpc.system" "aws-api"
363371
"rpc.service" "AmazonSQS"
364372
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
@@ -399,6 +407,7 @@ class S3TracingTest extends AgentInstrumentationSpecification {
399407
attributes {
400408
"aws.agent" "java-aws-sdk"
401409
"aws.endpoint" String
410+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
402411
"rpc.method" "CreateTopic"
403412
"rpc.system" "aws-api"
404413
"rpc.service" "AmazonSNS"
@@ -419,6 +428,7 @@ class S3TracingTest extends AgentInstrumentationSpecification {
419428
attributes {
420429
"aws.agent" "java-aws-sdk"
421430
"aws.endpoint" String
431+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
422432
"rpc.method" "Subscribe"
423433
"rpc.system" "aws-api"
424434
"rpc.service" "AmazonSNS"
@@ -440,8 +450,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
440450
attributes {
441451
"aws.agent" "java-aws-sdk"
442452
"aws.endpoint" String
443-
"rpc.method" "SetQueueAttributes"
444453
"aws.queue.url" queueUrl
454+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
455+
"rpc.method" "SetQueueAttributes"
445456
"rpc.system" "aws-api"
446457
"rpc.service" "AmazonSQS"
447458
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
@@ -461,6 +472,7 @@ class S3TracingTest extends AgentInstrumentationSpecification {
461472
attributes {
462473
"aws.agent" "java-aws-sdk"
463474
"aws.endpoint" String
475+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
464476
"rpc.method" "SetTopicAttributes"
465477
"rpc.system" "aws-api"
466478
"rpc.service" "AmazonSNS"
@@ -524,8 +536,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
524536
attributes {
525537
"aws.agent" "java-aws-sdk"
526538
"aws.endpoint" String
527-
"rpc.method" "ReceiveMessage"
528539
"aws.queue.url" queueUrl
540+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
541+
"rpc.method" "ReceiveMessage"
529542
"rpc.system" "aws-api"
530543
"rpc.service" "AmazonSQS"
531544
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
@@ -618,8 +631,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
618631
attributes {
619632
"aws.agent" "java-aws-sdk"
620633
"aws.endpoint" String
621-
"rpc.method" "PurgeQueue"
622634
"aws.queue.url" queueUrl
635+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
636+
"rpc.method" "PurgeQueue"
623637
"rpc.system" "aws-api"
624638
"rpc.service" "AmazonSQS"
625639
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"

instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/SnsTracingTest.groovy

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification
77
import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes
8+
import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes
89
import io.opentelemetry.semconv.ServerAttributes
910
import io.opentelemetry.semconv.HttpAttributes
1011
import io.opentelemetry.semconv.NetworkAttributes
@@ -52,8 +53,9 @@ class SnsTracingTest extends AgentInstrumentationSpecification {
5253
attributes {
5354
"aws.agent" "java-aws-sdk"
5455
"aws.endpoint" String
55-
"rpc.method" "CreateQueue"
5656
"aws.queue.name" queueName
57+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
58+
"rpc.method" "CreateQueue"
5759
"rpc.system" "aws-api"
5860
"rpc.service" "AmazonSQS"
5961
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
@@ -74,8 +76,9 @@ class SnsTracingTest extends AgentInstrumentationSpecification {
7476
attributes {
7577
"aws.agent" "java-aws-sdk"
7678
"aws.endpoint" String
77-
"rpc.method" "GetQueueAttributes"
7879
"aws.queue.url" queueUrl
80+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
81+
"rpc.method" "GetQueueAttributes"
7982
"rpc.system" "aws-api"
8083
"rpc.service" "AmazonSQS"
8184
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
@@ -96,8 +99,9 @@ class SnsTracingTest extends AgentInstrumentationSpecification {
9699
attributes {
97100
"aws.agent" "java-aws-sdk"
98101
"aws.endpoint" String
99-
"rpc.method" "SetQueueAttributes"
100102
"aws.queue.url" queueUrl
103+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
104+
"rpc.method" "SetQueueAttributes"
101105
"rpc.system" "aws-api"
102106
"rpc.service" "AmazonSQS"
103107
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
@@ -118,6 +122,7 @@ class SnsTracingTest extends AgentInstrumentationSpecification {
118122
attributes {
119123
"aws.agent" "java-aws-sdk"
120124
"aws.endpoint" String
125+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
121126
"rpc.method" "CreateTopic"
122127
"rpc.system" "aws-api"
123128
"rpc.service" "AmazonSNS"
@@ -139,6 +144,7 @@ class SnsTracingTest extends AgentInstrumentationSpecification {
139144
attributes {
140145
"aws.agent" "java-aws-sdk"
141146
"aws.endpoint" String
147+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
142148
"rpc.method" "Subscribe"
143149
"rpc.system" "aws-api"
144150
"rpc.service" "AmazonSNS"
@@ -160,6 +166,7 @@ class SnsTracingTest extends AgentInstrumentationSpecification {
160166
attributes {
161167
"aws.agent" "java-aws-sdk"
162168
"aws.endpoint" String
169+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
163170
"rpc.method" "Publish"
164171
"rpc.system" "aws-api"
165172
"rpc.service" "AmazonSNS"
@@ -180,6 +187,7 @@ class SnsTracingTest extends AgentInstrumentationSpecification {
180187
"aws.agent" "java-aws-sdk"
181188
"aws.endpoint" String
182189
"aws.queue.url" queueUrl
190+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
183191
"rpc.system" "aws-api"
184192
"rpc.service" "AmazonSQS"
185193
"rpc.method" "ReceiveMessage"

instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsExperimentalAttributes.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ final class AwsExperimentalAttributes {
1717
static final AttributeKey<String> AWS_QUEUE_NAME = stringKey("aws.queue.name");
1818
static final AttributeKey<String> AWS_STREAM_NAME = stringKey("aws.stream.name");
1919
static final AttributeKey<String> AWS_TABLE_NAME = stringKey("aws.table.name");
20-
static final AttributeKey<String> AWS_REQUEST_ID = stringKey("aws.requestId");
2120

2221
private AwsExperimentalAttributes() {}
2322
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.awssdk.v1_11;
7+
8+
import static io.opentelemetry.api.common.AttributeKey.stringKey;
9+
10+
import com.amazonaws.AmazonWebServiceResult;
11+
import com.amazonaws.Request;
12+
import com.amazonaws.Response;
13+
import com.amazonaws.ResponseMetadata;
14+
import io.opentelemetry.api.common.AttributeKey;
15+
import io.opentelemetry.api.common.AttributesBuilder;
16+
import io.opentelemetry.context.Context;
17+
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
18+
import io.opentelemetry.javaagent.tooling.muzzle.NoMuzzle;
19+
import javax.annotation.Nullable;
20+
21+
class AwsSdkAttributesExtractor implements AttributesExtractor<Request<?>, Response<?>> {
22+
private static final boolean CAN_GET_RESPONSE_METADATA = canGetResponseMetadata();
23+
private static final AttributeKey<String> AWS_REQUEST_ID = stringKey("aws.request_id");
24+
25+
// AmazonWebServiceResult is only available in v1.11.33 and later
26+
private static boolean canGetResponseMetadata() {
27+
try {
28+
Class<?> clazz = Class.forName("com.amazonaws.AmazonWebServiceResult");
29+
clazz.getMethod("getSdkResponseMetadata");
30+
return true;
31+
} catch (ClassNotFoundException | NoSuchMethodException exception) {
32+
return false;
33+
}
34+
}
35+
36+
@Override
37+
public void onStart(AttributesBuilder attributes, Context parentContext, Request<?> request) {}
38+
39+
@Override
40+
public void onEnd(
41+
AttributesBuilder attributes,
42+
Context context,
43+
Request<?> request,
44+
@Nullable Response<?> response,
45+
@Nullable Throwable error) {
46+
ResponseMetadata responseMetadata = getResponseMetadata(response);
47+
48+
if (responseMetadata != null) {
49+
String requestId = responseMetadata.getRequestId();
50+
if (requestId != null) {
51+
attributes.put(AWS_REQUEST_ID, requestId);
52+
}
53+
}
54+
}
55+
56+
@NoMuzzle
57+
private static ResponseMetadata getResponseMetadata(Response<?> response) {
58+
if (CAN_GET_RESPONSE_METADATA
59+
&& response != null
60+
&& response.getAwsResponse() instanceof AmazonWebServiceResult) {
61+
AmazonWebServiceResult<?> awsResp = (AmazonWebServiceResult<?>) response.getAwsResponse();
62+
return awsResp.getSdkResponseMetadata();
63+
}
64+
return null;
65+
}
66+
}

instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkExperimentalAttributesExtractor.java

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@
1010
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_ENDPOINT;
1111
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_QUEUE_NAME;
1212
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_QUEUE_URL;
13-
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_REQUEST_ID;
1413
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_STREAM_NAME;
1514
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_TABLE_NAME;
1615

17-
import com.amazonaws.AmazonWebServiceResponse;
1816
import com.amazonaws.Request;
1917
import com.amazonaws.Response;
2018
import io.opentelemetry.api.common.AttributeKey;
@@ -58,13 +56,5 @@ public void onEnd(
5856
Context context,
5957
Request<?> request,
6058
@Nullable Response<?> response,
61-
@Nullable Throwable error) {
62-
if (response != null && response.getAwsResponse() instanceof AmazonWebServiceResponse) {
63-
AmazonWebServiceResponse<?> awsResp = (AmazonWebServiceResponse<?>) response.getAwsResponse();
64-
String requestId = awsResp.getRequestId();
65-
if (requestId != null) {
66-
attributes.put(AWS_REQUEST_ID, requestId);
67-
}
68-
}
69-
}
59+
@Nullable Throwable error) {}
7060
}

instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkInstrumenterFactory.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,18 +39,14 @@ final class AwsSdkInstrumenterFactory {
3939
RpcClientAttributesExtractor.create(AwsSdkRpcAttributesGetter.INSTANCE);
4040
private static final AwsSdkExperimentalAttributesExtractor experimentalAttributesExtractor =
4141
new AwsSdkExperimentalAttributesExtractor();
42+
private static final AwsSdkAttributesExtractor sdkAttributesExtractor =
43+
new AwsSdkAttributesExtractor();
4244
private static final SnsAttributesExtractor snsAttributesExtractor = new SnsAttributesExtractor();
4345

4446
private static final List<AttributesExtractor<Request<?>, Response<?>>>
45-
defaultAttributesExtractors =
46-
Arrays.asList(httpAttributesExtractor, rpcAttributesExtractor, snsAttributesExtractor);
47+
defaultAttributesExtractors = createAttributesExtractors(false);
4748
private static final List<AttributesExtractor<Request<?>, Response<?>>>
48-
extendedAttributesExtractors =
49-
Arrays.asList(
50-
httpAttributesExtractor,
51-
rpcAttributesExtractor,
52-
snsAttributesExtractor,
53-
experimentalAttributesExtractor);
49+
extendedAttributesExtractors = createAttributesExtractors(true);
5450
private static final AwsSdkSpanNameExtractor spanName = new AwsSdkSpanNameExtractor();
5551

5652
private final OpenTelemetry openTelemetry;
@@ -69,6 +65,21 @@ final class AwsSdkInstrumenterFactory {
6965
this.messagingReceiveInstrumentationEnabled = messagingReceiveInstrumentationEnabled;
7066
}
7167

68+
private static List<AttributesExtractor<Request<?>, Response<?>>> createAttributesExtractors(
69+
boolean includeExperimental) {
70+
List<AttributesExtractor<Request<?>, Response<?>>> extractors =
71+
new ArrayList<>(
72+
Arrays.asList(
73+
httpAttributesExtractor,
74+
rpcAttributesExtractor,
75+
snsAttributesExtractor,
76+
sdkAttributesExtractor));
77+
if (includeExperimental) {
78+
extractors.add(experimentalAttributesExtractor);
79+
}
80+
return extractors;
81+
}
82+
7283
Instrumenter<Request<?>, Response<?>> requestInstrumenter() {
7384
return createInstrumenter(
7485
openTelemetry,

instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractAws1ClientTest.groovy

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ import io.opentelemetry.api.trace.Span
3333
import io.opentelemetry.instrumentation.test.InstrumentationSpecification
3434
import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes
3535
import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes
36+
import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes
3637
import io.opentelemetry.semconv.ServerAttributes
3738
import io.opentelemetry.semconv.ErrorAttributes
3839
import io.opentelemetry.semconv.HttpAttributes
@@ -103,6 +104,8 @@ abstract class AbstractAws1ClientTest extends InstrumentationSpecification {
103104
client.requestHandler2s != null
104105
client.requestHandler2s.find { it.getClass().getSimpleName() == "TracingRequestHandler" } != null
105106

107+
def hasRequestId = service in ["SNS", "RDS", "EC2"]
108+
106109
assertTraces(1) {
107110
trace(0, 1) {
108111
span(0) {
@@ -121,6 +124,7 @@ abstract class AbstractAws1ClientTest extends InstrumentationSpecification {
121124
"$RpcIncubatingAttributes.RPC_METHOD" "${operation}"
122125
"aws.endpoint" "${server.httpUri()}"
123126
"aws.agent" "java-aws-sdk"
127+
"$AwsIncubatingAttributes.AWS_REQUEST_ID" hasRequestId ? String : null
124128
for (def addedTag : additionalAttributes) {
125129
"$addedTag.key" "$addedTag.value"
126130
}

0 commit comments

Comments
 (0)