Skip to content

Commit 3b4b367

Browse files
committed
emit aws request_id attribute by default
1 parent ef5408e commit 3b4b367

File tree

5 files changed

+89
-50
lines changed

5 files changed

+89
-50
lines changed

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.request_id");
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 & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -10,37 +10,21 @@
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.AmazonWebServiceResult;
1816
import com.amazonaws.Request;
1917
import com.amazonaws.Response;
20-
import com.amazonaws.ResponseMetadata;
2118
import io.opentelemetry.api.common.AttributeKey;
2219
import io.opentelemetry.api.common.AttributesBuilder;
2320
import io.opentelemetry.context.Context;
2421
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
25-
import io.opentelemetry.javaagent.tooling.muzzle.NoMuzzle;
2622
import java.util.function.Function;
2723
import javax.annotation.Nullable;
2824

2925
class AwsSdkExperimentalAttributesExtractor
3026
implements AttributesExtractor<Request<?>, Response<?>> {
3127
private static final String COMPONENT_NAME = "java-aws-sdk";
32-
private static final boolean CAN_GET_RESPONSE_METADATA = canGetResponseMetadata();
33-
34-
// AmazonWebServiceResult is only available in v1.11.33 and later
35-
private static boolean canGetResponseMetadata() {
36-
try {
37-
Class<?> clazz = Class.forName("com.amazonaws.AmazonWebServiceResult");
38-
clazz.getMethod("getSdkResponseMetadata");
39-
return true;
40-
} catch (ClassNotFoundException | NoSuchMethodException exception) {
41-
return false;
42-
}
43-
}
4428

4529
@Override
4630
public void onStart(AttributesBuilder attributes, Context parentContext, Request<?> request) {
@@ -72,25 +56,5 @@ public void onEnd(
7256
Context context,
7357
Request<?> request,
7458
@Nullable Response<?> response,
75-
@Nullable Throwable error) {
76-
ResponseMetadata responseMetadata = getResponseMetadata(response);
77-
78-
if (responseMetadata != null) {
79-
String requestId = responseMetadata.getRequestId();
80-
if (requestId != null) {
81-
attributes.put(AWS_REQUEST_ID, requestId);
82-
}
83-
}
84-
}
85-
86-
@NoMuzzle
87-
private static ResponseMetadata getResponseMetadata(Response<?> response) {
88-
if (CAN_GET_RESPONSE_METADATA
89-
&& response != null
90-
&& response.getAwsResponse() instanceof AmazonWebServiceResult) {
91-
AmazonWebServiceResult<?> awsResp = (AmazonWebServiceResult<?>) response.getAwsResponse();
92-
return awsResp.getSdkResponseMetadata();
93-
}
94-
return null;
95-
}
59+
@Nullable Throwable error) {}
9660
}

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-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/TracingExecutionInterceptor.java

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -360,11 +360,10 @@ public void afterExecution(
360360

361361
private void onSdkResponse(
362362
Span span, SdkResponse response, ExecutionAttributes executionAttributes) {
363+
if (response instanceof AwsResponse) {
364+
span.setAttribute("aws.request_id", ((AwsResponse) response).responseMetadata().requestId());
365+
}
363366
if (captureExperimentalSpanAttributes) {
364-
if (response instanceof AwsResponse) {
365-
span.setAttribute(
366-
"aws.request_id", ((AwsResponse) response).responseMetadata().requestId());
367-
}
368367
AwsSdkRequest sdkRequest = executionAttributes.getAttribute(AWS_SDK_REQUEST_ATTRIBUTE);
369368
if (sdkRequest != null) {
370369
fieldMapper.mapToAttributes(response, sdkRequest, span);

0 commit comments

Comments
 (0)