Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification
import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes
import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes
import io.opentelemetry.semconv.ServerAttributes
import io.opentelemetry.semconv.HttpAttributes
import io.opentelemetry.semconv.NetworkAttributes
Expand Down Expand Up @@ -60,8 +61,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"rpc.method" "CreateQueue"
"aws.queue.name" queueName
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "CreateQueue"
"rpc.system" "aws-api"
"rpc.service" "AmazonSQS"
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
Expand All @@ -82,10 +84,10 @@ class S3TracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"aws.bucket.name" bucketName
"rpc.method" "CreateBucket"
"rpc.system" "aws-api"
"rpc.service" "Amazon S3"
"aws.bucket.name" bucketName
"$HttpAttributes.HTTP_REQUEST_METHOD" "PUT"
"$HttpAttributes.HTTP_RESPONSE_STATUS_CODE" 200
"$UrlAttributes.URL_FULL" { it.startsWith("http://") }
Expand All @@ -104,8 +106,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"rpc.method" "GetQueueAttributes"
"aws.queue.url" queueUrl
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "GetQueueAttributes"
"rpc.system" "aws-api"
"rpc.service" "AmazonSQS"
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
Expand All @@ -126,8 +129,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"rpc.method" "SetQueueAttributes"
"aws.queue.url" queueUrl
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "SetQueueAttributes"
"rpc.system" "aws-api"
"rpc.service" "AmazonSQS"
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
Expand Down Expand Up @@ -188,8 +192,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"rpc.method" "ReceiveMessage"
"aws.queue.url" queueUrl
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "ReceiveMessage"
"rpc.system" "aws-api"
"rpc.service" "AmazonSQS"
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
Expand Down Expand Up @@ -282,8 +287,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"rpc.method" "PurgeQueue"
"aws.queue.url" queueUrl
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "PurgeQueue"
"rpc.system" "aws-api"
"rpc.service" "AmazonSQS"
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
Expand Down Expand Up @@ -336,8 +342,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"rpc.method" "CreateQueue"
"aws.queue.name" queueName
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "CreateQueue"
"rpc.system" "aws-api"
"rpc.service" "AmazonSQS"
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
Expand All @@ -357,8 +364,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"rpc.method" "GetQueueAttributes"
"aws.queue.url" queueUrl
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "GetQueueAttributes"
"rpc.system" "aws-api"
"rpc.service" "AmazonSQS"
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
Expand Down Expand Up @@ -399,6 +407,7 @@ class S3TracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "CreateTopic"
"rpc.system" "aws-api"
"rpc.service" "AmazonSNS"
Expand All @@ -419,6 +428,7 @@ class S3TracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "Subscribe"
"rpc.system" "aws-api"
"rpc.service" "AmazonSNS"
Expand All @@ -440,8 +450,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"rpc.method" "SetQueueAttributes"
"aws.queue.url" queueUrl
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "SetQueueAttributes"
"rpc.system" "aws-api"
"rpc.service" "AmazonSQS"
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
Expand All @@ -461,6 +472,7 @@ class S3TracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "SetTopicAttributes"
"rpc.system" "aws-api"
"rpc.service" "AmazonSNS"
Expand Down Expand Up @@ -524,8 +536,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"rpc.method" "ReceiveMessage"
"aws.queue.url" queueUrl
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "ReceiveMessage"
"rpc.system" "aws-api"
"rpc.service" "AmazonSQS"
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
Expand Down Expand Up @@ -618,8 +631,9 @@ class S3TracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"rpc.method" "PurgeQueue"
"aws.queue.url" queueUrl
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "PurgeQueue"
"rpc.system" "aws-api"
"rpc.service" "AmazonSQS"
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

import io.opentelemetry.instrumentation.test.AgentInstrumentationSpecification
import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes
import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes
import io.opentelemetry.semconv.ServerAttributes
import io.opentelemetry.semconv.HttpAttributes
import io.opentelemetry.semconv.NetworkAttributes
Expand Down Expand Up @@ -52,8 +53,9 @@ class SnsTracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"rpc.method" "CreateQueue"
"aws.queue.name" queueName
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "CreateQueue"
"rpc.system" "aws-api"
"rpc.service" "AmazonSQS"
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
Expand All @@ -74,8 +76,9 @@ class SnsTracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"rpc.method" "GetQueueAttributes"
"aws.queue.url" queueUrl
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "GetQueueAttributes"
"rpc.system" "aws-api"
"rpc.service" "AmazonSQS"
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
Expand All @@ -96,8 +99,9 @@ class SnsTracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"rpc.method" "SetQueueAttributes"
"aws.queue.url" queueUrl
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "SetQueueAttributes"
"rpc.system" "aws-api"
"rpc.service" "AmazonSQS"
"$HttpAttributes.HTTP_REQUEST_METHOD" "POST"
Expand All @@ -118,6 +122,7 @@ class SnsTracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "CreateTopic"
"rpc.system" "aws-api"
"rpc.service" "AmazonSNS"
Expand All @@ -139,6 +144,7 @@ class SnsTracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "Subscribe"
"rpc.system" "aws-api"
"rpc.service" "AmazonSNS"
Expand All @@ -160,6 +166,7 @@ class SnsTracingTest extends AgentInstrumentationSpecification {
attributes {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.method" "Publish"
"rpc.system" "aws-api"
"rpc.service" "AmazonSNS"
Expand All @@ -180,6 +187,7 @@ class SnsTracingTest extends AgentInstrumentationSpecification {
"aws.agent" "java-aws-sdk"
"aws.endpoint" String
"aws.queue.url" queueUrl
"$AwsIncubatingAttributes.AWS_REQUEST_ID" String
"rpc.system" "aws-api"
"rpc.service" "AmazonSQS"
"rpc.method" "ReceiveMessage"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ final class AwsExperimentalAttributes {
static final AttributeKey<String> AWS_QUEUE_NAME = stringKey("aws.queue.name");
static final AttributeKey<String> AWS_STREAM_NAME = stringKey("aws.stream.name");
static final AttributeKey<String> AWS_TABLE_NAME = stringKey("aws.table.name");
static final AttributeKey<String> AWS_REQUEST_ID = stringKey("aws.requestId");

private AwsExperimentalAttributes() {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/

package io.opentelemetry.instrumentation.awssdk.v1_11;

import static io.opentelemetry.api.common.AttributeKey.stringKey;

import com.amazonaws.AmazonWebServiceResult;
import com.amazonaws.Request;
import com.amazonaws.Response;
import com.amazonaws.ResponseMetadata;
import io.opentelemetry.api.common.AttributeKey;
import io.opentelemetry.api.common.AttributesBuilder;
import io.opentelemetry.context.Context;
import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor;
import io.opentelemetry.javaagent.tooling.muzzle.NoMuzzle;
import javax.annotation.Nullable;

class AwsSdkAttributesExtractor implements AttributesExtractor<Request<?>, Response<?>> {
private static final boolean CAN_GET_RESPONSE_METADATA = canGetResponseMetadata();
private static final AttributeKey<String> AWS_REQUEST_ID = stringKey("aws.request_id");

// AmazonWebServiceResult is only available in v1.11.33 and later
private static boolean canGetResponseMetadata() {
try {
Class<?> clazz = Class.forName("com.amazonaws.AmazonWebServiceResult");
clazz.getMethod("getSdkResponseMetadata");
return true;
} catch (ClassNotFoundException | NoSuchMethodException exception) {
return false;
}
}

@Override
public void onStart(AttributesBuilder attributes, Context parentContext, Request<?> request) {}

@Override
public void onEnd(
AttributesBuilder attributes,
Context context,
Request<?> request,
@Nullable Response<?> response,
@Nullable Throwable error) {
ResponseMetadata responseMetadata = getResponseMetadata(response);

if (responseMetadata != null) {
String requestId = responseMetadata.getRequestId();
if (requestId != null) {
attributes.put(AWS_REQUEST_ID, requestId);
}
}
}

@NoMuzzle
private static ResponseMetadata getResponseMetadata(Response<?> response) {
if (CAN_GET_RESPONSE_METADATA
&& response != null
&& response.getAwsResponse() instanceof AmazonWebServiceResult) {
AmazonWebServiceResult<?> awsResp = (AmazonWebServiceResult<?>) response.getAwsResponse();
return awsResp.getSdkResponseMetadata();
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,9 @@
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_ENDPOINT;
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_QUEUE_NAME;
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_QUEUE_URL;
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_REQUEST_ID;
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_STREAM_NAME;
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_TABLE_NAME;

import com.amazonaws.AmazonWebServiceResponse;
import com.amazonaws.Request;
import com.amazonaws.Response;
import io.opentelemetry.api.common.AttributeKey;
Expand Down Expand Up @@ -58,13 +56,5 @@ public void onEnd(
Context context,
Request<?> request,
@Nullable Response<?> response,
@Nullable Throwable error) {
if (response != null && response.getAwsResponse() instanceof AmazonWebServiceResponse) {
AmazonWebServiceResponse<?> awsResp = (AmazonWebServiceResponse<?>) response.getAwsResponse();
String requestId = awsResp.getRequestId();
if (requestId != null) {
attributes.put(AWS_REQUEST_ID, requestId);
}
}
}
@Nullable Throwable error) {}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,18 +39,14 @@ final class AwsSdkInstrumenterFactory {
RpcClientAttributesExtractor.create(AwsSdkRpcAttributesGetter.INSTANCE);
private static final AwsSdkExperimentalAttributesExtractor experimentalAttributesExtractor =
new AwsSdkExperimentalAttributesExtractor();
private static final AwsSdkAttributesExtractor sdkAttributesExtractor =
new AwsSdkAttributesExtractor();
private static final SnsAttributesExtractor snsAttributesExtractor = new SnsAttributesExtractor();

private static final List<AttributesExtractor<Request<?>, Response<?>>>
defaultAttributesExtractors =
Arrays.asList(httpAttributesExtractor, rpcAttributesExtractor, snsAttributesExtractor);
defaultAttributesExtractors = createAttributesExtractors(false);
private static final List<AttributesExtractor<Request<?>, Response<?>>>
extendedAttributesExtractors =
Arrays.asList(
httpAttributesExtractor,
rpcAttributesExtractor,
snsAttributesExtractor,
experimentalAttributesExtractor);
extendedAttributesExtractors = createAttributesExtractors(true);
private static final AwsSdkSpanNameExtractor spanName = new AwsSdkSpanNameExtractor();

private final OpenTelemetry openTelemetry;
Expand All @@ -69,6 +65,21 @@ final class AwsSdkInstrumenterFactory {
this.messagingReceiveInstrumentationEnabled = messagingReceiveInstrumentationEnabled;
}

private static List<AttributesExtractor<Request<?>, Response<?>>> createAttributesExtractors(
boolean includeExperimental) {
List<AttributesExtractor<Request<?>, Response<?>>> extractors =
new ArrayList<>(
Arrays.asList(
httpAttributesExtractor,
rpcAttributesExtractor,
snsAttributesExtractor,
sdkAttributesExtractor));
if (includeExperimental) {
extractors.add(experimentalAttributesExtractor);
}
return extractors;
}

Instrumenter<Request<?>, Response<?>> requestInstrumenter() {
return createInstrumenter(
openTelemetry,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ import io.opentelemetry.api.trace.Span
import io.opentelemetry.instrumentation.test.InstrumentationSpecification
import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes
import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes
import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes
import io.opentelemetry.semconv.ServerAttributes
import io.opentelemetry.semconv.ErrorAttributes
import io.opentelemetry.semconv.HttpAttributes
Expand Down Expand Up @@ -103,6 +104,8 @@ abstract class AbstractAws1ClientTest extends InstrumentationSpecification {
client.requestHandler2s != null
client.requestHandler2s.find { it.getClass().getSimpleName() == "TracingRequestHandler" } != null

def hasRequestId = service in ["SNS", "RDS", "EC2"]

assertTraces(1) {
trace(0, 1) {
span(0) {
Expand All @@ -121,6 +124,7 @@ abstract class AbstractAws1ClientTest extends InstrumentationSpecification {
"$RpcIncubatingAttributes.RPC_METHOD" "${operation}"
"aws.endpoint" "${server.httpUri()}"
"aws.agent" "java-aws-sdk"
"$AwsIncubatingAttributes.AWS_REQUEST_ID" hasRequestId ? String : null
for (def addedTag : additionalAttributes) {
"$addedTag.key" "$addedTag.value"
}
Expand Down
Loading
Loading