diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/S3TracingTest.groovy b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/S3TracingTest.groovy index 1dea81b84719..616e8af4f92c 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/S3TracingTest.groovy +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/S3TracingTest.groovy @@ -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 @@ -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" @@ -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://") } @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/SnsTracingTest.groovy b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/SnsTracingTest.groovy index ba6b28fafb59..7f307f69015a 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/SnsTracingTest.groovy +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/groovy/SnsTracingTest.groovy @@ -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 @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" @@ -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" diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsExperimentalAttributes.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsExperimentalAttributes.java index 3e8fddec5c15..096c7826a12d 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsExperimentalAttributes.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsExperimentalAttributes.java @@ -17,7 +17,6 @@ final class AwsExperimentalAttributes { static final AttributeKey AWS_QUEUE_NAME = stringKey("aws.queue.name"); static final AttributeKey AWS_STREAM_NAME = stringKey("aws.stream.name"); static final AttributeKey AWS_TABLE_NAME = stringKey("aws.table.name"); - static final AttributeKey AWS_REQUEST_ID = stringKey("aws.requestId"); private AwsExperimentalAttributes() {} } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkAttributesExtractor.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkAttributesExtractor.java new file mode 100644 index 000000000000..cb57c78b4e6d --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkAttributesExtractor.java @@ -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, Response> { + private static final boolean CAN_GET_RESPONSE_METADATA = canGetResponseMetadata(); + private static final AttributeKey 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; + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkExperimentalAttributesExtractor.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkExperimentalAttributesExtractor.java index 245f09a5d8f5..541e67d23b85 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkExperimentalAttributesExtractor.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkExperimentalAttributesExtractor.java @@ -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; @@ -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) {} } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkInstrumenterFactory.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkInstrumenterFactory.java index 16ef43d40961..4f196a39ba7d 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkInstrumenterFactory.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkInstrumenterFactory.java @@ -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, Response>> - defaultAttributesExtractors = - Arrays.asList(httpAttributesExtractor, rpcAttributesExtractor, snsAttributesExtractor); + defaultAttributesExtractors = createAttributesExtractors(false); private static final List, Response>> - extendedAttributesExtractors = - Arrays.asList( - httpAttributesExtractor, - rpcAttributesExtractor, - snsAttributesExtractor, - experimentalAttributesExtractor); + extendedAttributesExtractors = createAttributesExtractors(true); private static final AwsSdkSpanNameExtractor spanName = new AwsSdkSpanNameExtractor(); private final OpenTelemetry openTelemetry; @@ -69,6 +65,21 @@ final class AwsSdkInstrumenterFactory { this.messagingReceiveInstrumentationEnabled = messagingReceiveInstrumentationEnabled; } + private static List, Response>> createAttributesExtractors( + boolean includeExperimental) { + List, Response>> extractors = + new ArrayList<>( + Arrays.asList( + httpAttributesExtractor, + rpcAttributesExtractor, + snsAttributesExtractor, + sdkAttributesExtractor)); + if (includeExperimental) { + extractors.add(experimentalAttributesExtractor); + } + return extractors; + } + Instrumenter, Response> requestInstrumenter() { return createInstrumenter( openTelemetry, diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractAws1ClientTest.groovy b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractAws1ClientTest.groovy index 81a3c4243b2f..c4c5bbb9f47a 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractAws1ClientTest.groovy +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractAws1ClientTest.groovy @@ -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 @@ -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) { @@ -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" } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsSuppressReceiveSpansTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsSuppressReceiveSpansTest.java index 51dc8b4d37e9..2dd6822f4417 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsSuppressReceiveSpansTest.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsSuppressReceiveSpansTest.java @@ -28,6 +28,7 @@ import io.opentelemetry.semconv.NetworkAttributes; import io.opentelemetry.semconv.ServerAttributes; import io.opentelemetry.semconv.UrlAttributes; +import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes; import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import org.elasticmq.rest.sqs.SQSRestServer; @@ -97,6 +98,9 @@ void testSimpleSqsProducerConsumerServices() { equalTo(stringKey("aws.agent"), "java-aws-sdk"), equalTo(stringKey("aws.endpoint"), "http://localhost:" + sqsPort), equalTo(stringKey("aws.queue.name"), "testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "CreateQueue"), @@ -118,6 +122,9 @@ void testSimpleSqsProducerConsumerServices() { equalTo( stringKey("aws.queue.url"), "http://localhost:" + sqsPort + "/000000000000/testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "SendMessage"), @@ -148,6 +155,9 @@ void testSimpleSqsProducerConsumerServices() { equalTo( stringKey("aws.queue.url"), "http://localhost:" + sqsPort + "/000000000000/testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), @@ -206,6 +216,9 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { equalTo(stringKey("aws.agent"), "java-aws-sdk"), equalTo(stringKey("aws.endpoint"), "http://localhost:" + sqsPort), equalTo(stringKey("aws.queue.name"), "testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "CreateQueue"), @@ -227,6 +240,9 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { equalTo( stringKey("aws.queue.url"), "http://localhost:" + sqsPort + "/000000000000/testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "SendMessage"), @@ -257,6 +273,9 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { equalTo( stringKey("aws.queue.url"), "http://localhost:" + sqsPort + "/000000000000/testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), @@ -298,6 +317,9 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { equalTo( stringKey("aws.queue.url"), "http://localhost:" + sqsPort + "/000000000000/testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java index 3dd3fe259a3b..927239ca2e51 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSqsTracingTest.java @@ -34,6 +34,7 @@ import io.opentelemetry.semconv.NetworkAttributes; import io.opentelemetry.semconv.ServerAttributes; import io.opentelemetry.semconv.UrlAttributes; +import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes; import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import java.util.ArrayList; @@ -130,6 +131,9 @@ void testSimpleSqsProducerConsumerServicesCaptureHeaders(boolean testCaptureHead equalTo(stringKey("aws.agent"), "java-aws-sdk"), equalTo(stringKey("aws.endpoint"), "http://localhost:" + sqsPort), equalTo(stringKey("aws.queue.name"), "testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "CreateQueue"), @@ -150,6 +154,9 @@ void testSimpleSqsProducerConsumerServicesCaptureHeaders(boolean testCaptureHead equalTo( stringKey("aws.queue.url"), "http://localhost:" + sqsPort + "/000000000000/testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "SendMessage"), @@ -194,6 +201,9 @@ void testSimpleSqsProducerConsumerServicesCaptureHeaders(boolean testCaptureHead equalTo( stringKey("aws.queue.url"), "http://localhost:" + sqsPort + "/000000000000/testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), @@ -236,6 +246,9 @@ void testSimpleSqsProducerConsumerServicesCaptureHeaders(boolean testCaptureHead equalTo( stringKey("aws.queue.url"), "http://localhost:" + sqsPort + "/000000000000/testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), @@ -306,6 +319,9 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { equalTo(stringKey("aws.agent"), "java-aws-sdk"), equalTo(stringKey("aws.endpoint"), "http://localhost:" + sqsPort), equalTo(stringKey("aws.queue.name"), "testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "CreateQueue"), @@ -327,6 +343,9 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { equalTo( stringKey("aws.queue.url"), "http://localhost:" + sqsPort + "/000000000000/testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "SendMessage"), @@ -371,6 +390,9 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { "http://localhost:" + sqsPort + "/000000000000/testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), @@ -394,6 +416,9 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { "http://localhost:" + sqsPort + "/000000000000/testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), @@ -431,6 +456,9 @@ void testSimpleSqsProducerConsumerServicesWithParentSpan() { "http://localhost:" + sqsPort + "/000000000000/testSdkSqs"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSQS"), equalTo(RpcIncubatingAttributes.RPC_METHOD, "ReceiveMessage"), diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/TracingExecutionInterceptor.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/TracingExecutionInterceptor.java index 52e2e326c2b7..e308ec37ba8d 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/TracingExecutionInterceptor.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/TracingExecutionInterceptor.java @@ -53,6 +53,9 @@ public final class TracingExecutionInterceptor implements ExecutionInterceptor { private static final AttributeKey DB_SYSTEM = AttributeKey.stringKey("db.system"); // copied from DbIncubatingAttributes.DbSystemValues private static final String DB_SYSTEM_DYNAMODB = "dynamodb"; + // copied from AwsIncubatingAttributes + private static final AttributeKey AWS_REQUEST_ID = + AttributeKey.stringKey("aws.request_id"); // the class name is part of the attribute name, so that it will be shaded when used in javaagent // instrumentation, and won't conflict with usage outside javaagent instrumentation @@ -365,10 +368,10 @@ public void afterExecution( private void onSdkResponse( Span span, SdkResponse response, ExecutionAttributes executionAttributes) { + if (response instanceof AwsResponse) { + span.setAttribute(AWS_REQUEST_ID, ((AwsResponse) response).responseMetadata().requestId()); + } if (captureExperimentalSpanAttributes) { - if (response instanceof AwsResponse) { - span.setAttribute("aws.requestId", ((AwsResponse) response).responseMetadata().requestId()); - } AwsSdkRequest sdkRequest = executionAttributes.getAttribute(AWS_SDK_REQUEST_ATTRIBUTE); if (sdkRequest != null) { fieldMapper.mapToAttributes(response, sdkRequest, span); diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.groovy b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.groovy index a73122bc1af9..c79c0eac333f 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.groovy +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.groovy @@ -9,6 +9,7 @@ import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil import io.opentelemetry.instrumentation.test.InstrumentationSpecification import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes import io.opentelemetry.semconv.incubating.DbIncubatingAttributes +import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes import io.opentelemetry.semconv.ServerAttributes import io.opentelemetry.semconv.HttpAttributes import io.opentelemetry.semconv.UrlAttributes @@ -146,7 +147,7 @@ abstract class AbstractAws2ClientCoreTest extends InstrumentationSpecification { "$RpcIncubatingAttributes.RPC_SERVICE" "DynamoDb" "$RpcIncubatingAttributes.RPC_METHOD" "CreateTable" "aws.agent" "java-aws-sdk" - "aws.requestId" "$requestId" + "$AwsIncubatingAttributes.AWS_REQUEST_ID" "$requestId" "aws.table.name" "sometable" "$DbIncubatingAttributes.DB_SYSTEM" "dynamodb" "$DbIncubatingAttributes.DB_OPERATION" "CreateTable" @@ -179,7 +180,7 @@ abstract class AbstractAws2ClientCoreTest extends InstrumentationSpecification { "$RpcIncubatingAttributes.RPC_SERVICE" "DynamoDb" "$RpcIncubatingAttributes.RPC_METHOD" "Query" "aws.agent" "java-aws-sdk" - "aws.requestId" "$requestId" + "$AwsIncubatingAttributes.AWS_REQUEST_ID" "$requestId" "aws.table.name" "sometable" "$DbIncubatingAttributes.DB_SYSTEM" "dynamodb" "$DbIncubatingAttributes.DB_OPERATION" "Query" @@ -211,7 +212,7 @@ abstract class AbstractAws2ClientCoreTest extends InstrumentationSpecification { "$RpcIncubatingAttributes.RPC_SERVICE" "$service" "$RpcIncubatingAttributes.RPC_METHOD" "${operation}" "aws.agent" "java-aws-sdk" - "aws.requestId" "$requestId" + "$AwsIncubatingAttributes.AWS_REQUEST_ID" "$requestId" "aws.table.name" "sometable" "$DbIncubatingAttributes.DB_SYSTEM" "dynamodb" "$DbIncubatingAttributes.DB_OPERATION" "${operation}" diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.groovy b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.groovy index 3241c48640bb..b41a37518a66 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.groovy +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.groovy @@ -5,7 +5,7 @@ package io.opentelemetry.instrumentation.awssdk.v2_2 - +import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes import io.opentelemetry.semconv.ServerAttributes @@ -135,7 +135,7 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { "$RpcIncubatingAttributes.RPC_SERVICE" "$service" "$RpcIncubatingAttributes.RPC_METHOD" "${operation}" "aws.agent" "java-aws-sdk" - "aws.requestId" "$requestId" + "$AwsIncubatingAttributes.AWS_REQUEST_ID" "$requestId" if (service == "S3") { "aws.bucket.name" "somebucket" } else if (service == "Sqs" && operation == "CreateQueue") { @@ -295,7 +295,7 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { "$RpcIncubatingAttributes.RPC_SERVICE" "$service" "$RpcIncubatingAttributes.RPC_METHOD" "${operation}" "aws.agent" "java-aws-sdk" - "aws.requestId" "$requestId" + "$AwsIncubatingAttributes.AWS_REQUEST_ID" "$requestId" if (service == "S3") { "aws.bucket.name" "somebucket" } else if (service == "Sqs" && operation == "CreateQueue") { diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsSuppressReceiveSpansTest.groovy b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsSuppressReceiveSpansTest.groovy index 6f44c92573d6..22b33739fef8 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsSuppressReceiveSpansTest.groovy +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsSuppressReceiveSpansTest.groovy @@ -7,6 +7,7 @@ package io.opentelemetry.instrumentation.awssdk.v2_2 import io.opentelemetry.instrumentation.test.InstrumentationSpecification 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.UrlAttributes @@ -128,7 +129,7 @@ abstract class AbstractAws2SqsSuppressReceiveSpansTest extends InstrumentationSp attributes { "aws.agent" "java-aws-sdk" "aws.queue.name" "testSdkSqs" - "aws.requestId" { it == "00000000-0000-0000-0000-000000000000" || it == "UNKNOWN" } + "$AwsIncubatingAttributes.AWS_REQUEST_ID" { it == "00000000-0000-0000-0000-000000000000" || it == "UNKNOWN" } "rpc.system" "aws-api" "rpc.service" "Sqs" "rpc.method" "CreateQueue" @@ -148,7 +149,7 @@ abstract class AbstractAws2SqsSuppressReceiveSpansTest extends InstrumentationSp attributes { "aws.agent" "java-aws-sdk" "aws.queue.url" "http://localhost:$sqsPort/000000000000/testSdkSqs" - "aws.requestId" { it == "00000000-0000-0000-0000-000000000000" || it == "UNKNOWN" } + "$AwsIncubatingAttributes.AWS_REQUEST_ID" { it == "00000000-0000-0000-0000-000000000000" || it == "UNKNOWN" } "rpc.system" "aws-api" "rpc.method" "SendMessage" "rpc.service" "Sqs" @@ -208,7 +209,7 @@ abstract class AbstractAws2SqsSuppressReceiveSpansTest extends InstrumentationSp hasNoLinks() attributes { "aws.agent" "java-aws-sdk" - "aws.requestId" { it == "00000000-0000-0000-0000-000000000000" || it == "UNKNOWN" } + "$AwsIncubatingAttributes.AWS_REQUEST_ID" { it == "00000000-0000-0000-0000-000000000000" || it == "UNKNOWN" } "rpc.method" "ReceiveMessage" "aws.queue.url" "http://localhost:$sqsPort/000000000000/testSdkSqs" "rpc.system" "aws-api" @@ -320,7 +321,7 @@ abstract class AbstractAws2SqsSuppressReceiveSpansTest extends InstrumentationSp attributes { "aws.agent" "java-aws-sdk" "aws.queue.url" "http://localhost:$sqsPort/000000000000/testSdkSqs" - "aws.requestId" { it.trim() == "00000000-0000-0000-0000-000000000000" || it == "UNKNOWN" } + "$AwsIncubatingAttributes.AWS_REQUEST_ID" { it.trim() == "00000000-0000-0000-0000-000000000000" || it == "UNKNOWN" } "rpc.system" "aws-api" "rpc.method" "SendMessageBatch" "rpc.service" "Sqs" diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java index 8c68be58729b..19abb21a8ee0 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientRecordHttpErrorTest.java @@ -5,15 +5,16 @@ package io.opentelemetry.instrumentation.awssdk.v2_2; +import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; -import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.api.internal.ConfigPropertiesUtil; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import io.opentelemetry.semconv.HttpAttributes; import io.opentelemetry.semconv.ServerAttributes; +import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import io.opentelemetry.testing.internal.armeria.common.HttpResponse; @@ -156,50 +157,48 @@ public void testSendDynamoDbRequestWithRetries() { getTesting() .waitAndAssertTraces( - trace -> { - trace.hasSpansSatisfyingExactly( - span -> { - span.hasKind(SpanKind.CLIENT); - span.hasNoParent(); - span.hasAttributesSatisfying( - attributes -> { - assertThat(attributes) - .containsEntry(ServerAttributes.SERVER_ADDRESS, "127.0.0.1") - .containsEntry(ServerAttributes.SERVER_PORT, server.httpPort()) - .containsEntry(HttpAttributes.HTTP_REQUEST_METHOD, method) - .containsEntry(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200) - .containsEntry(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api") - .containsEntry(RpcIncubatingAttributes.RPC_SERVICE, service) - .containsEntry(RpcIncubatingAttributes.RPC_METHOD, operation) - .containsEntry("aws.agent", "java-aws-sdk") - .containsEntry("aws.requestId", requestId) - .containsEntry("aws.table.name", "sometable") - .containsEntry(DbIncubatingAttributes.DB_SYSTEM, "dynamodb") - .containsEntry(DbIncubatingAttributes.DB_OPERATION, operation); - }); - if (isRecordIndividualHttpErrorEnabled()) { - span.hasEventsSatisfyingExactly( - event -> - event - .hasName("HTTP request failure") - .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 500), - equalTo( - AttributeKey.stringKey("aws.http.error_message"), - "DynamoDB could not process your request")), - event -> - event - .hasName("HTTP request failure") - .hasAttributesSatisfyingExactly( - equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 503), - equalTo( - AttributeKey.stringKey("aws.http.error_message"), - "DynamoDB is currently unavailable"))); - } else { - span.hasEventsSatisfying(events -> assertThat(events.size()).isEqualTo(0)); - } - }); - }); + trace -> + trace.hasSpansSatisfyingExactly( + span -> { + span.hasKind(SpanKind.CLIENT); + span.hasNoParent(); + span.hasAttributesSatisfyingExactly( + equalTo(ServerAttributes.SERVER_ADDRESS, "127.0.0.1"), + equalTo(ServerAttributes.SERVER_PORT, server.httpPort()), + equalTo(HttpAttributes.HTTP_REQUEST_METHOD, method), + equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), + equalTo( + stringKey("url.full"), "http://127.0.0.1:" + server.httpPort() + "/"), + equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), + equalTo(RpcIncubatingAttributes.RPC_SERVICE, service), + equalTo(RpcIncubatingAttributes.RPC_METHOD, operation), + equalTo(stringKey("aws.agent"), "java-aws-sdk"), + equalTo(AwsIncubatingAttributes.AWS_REQUEST_ID, requestId), + equalTo(stringKey("aws.table.name"), "sometable"), + equalTo(DbIncubatingAttributes.DB_SYSTEM, "dynamodb"), + equalTo(DbIncubatingAttributes.DB_OPERATION, operation)); + if (isRecordIndividualHttpErrorEnabled()) { + span.hasEventsSatisfyingExactly( + event -> + event + .hasName("HTTP request failure") + .hasAttributesSatisfyingExactly( + equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 500), + equalTo( + stringKey("aws.http.error_message"), + "DynamoDB could not process your request")), + event -> + event + .hasName("HTTP request failure") + .hasAttributesSatisfyingExactly( + equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 503), + equalTo( + stringKey("aws.http.error_message"), + "DynamoDB is currently unavailable"))); + } else { + span.hasEventsSatisfying(events -> assertThat(events.size()).isEqualTo(0)); + } + })); // make sure the response body input stream is still available and check its content to be // expected diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java index 39a267222ba0..a6293e7af4db 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2SqsTracingTest.java @@ -21,6 +21,7 @@ import io.opentelemetry.semconv.HttpAttributes; import io.opentelemetry.semconv.ServerAttributes; import io.opentelemetry.semconv.UrlAttributes; +import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes; import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import io.opentelemetry.testing.internal.armeria.internal.shaded.guava.collect.ImmutableList; @@ -166,7 +167,7 @@ void assertSqsTraces(Boolean withParent, Boolean captureHeaders) { equalTo(stringKey("aws.agent"), "java-aws-sdk"), equalTo(stringKey("aws.queue.name"), "testSdkSqs"), satisfies( - stringKey("aws.requestId"), + AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.satisfiesAnyOf( v -> @@ -196,7 +197,7 @@ void assertSqsTraces(Boolean withParent, Boolean captureHeaders) { stringKey("aws.queue.url"), "http://localhost:" + sqsPort + "/000000000000/testSdkSqs"), satisfies( - stringKey("aws.requestId"), + AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.satisfiesAnyOf( v -> @@ -260,7 +261,7 @@ void assertSqsTraces(Boolean withParent, Boolean captureHeaders) { stringKey("aws.queue.url"), "http://localhost:" + sqsPort + "/000000000000/testSdkSqs"), satisfies( - stringKey("aws.requestId"), + AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.satisfiesAnyOf( v -> @@ -507,7 +508,7 @@ void testBatchSqsProducerConsumerServicesSync() throws URISyntaxException { stringKey("aws.queue.url"), "http://localhost:" + sqsPort + "/000000000000/testSdkSqs"), satisfies( - stringKey("aws.requestId"), + AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.satisfiesAnyOf( v -> diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/aws/AwsSpanAssertions.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/aws/AwsSpanAssertions.java index b004b676d209..74a3efe8cdca 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/aws/AwsSpanAssertions.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/aws/AwsSpanAssertions.java @@ -18,6 +18,7 @@ import io.opentelemetry.semconv.NetworkAttributes; import io.opentelemetry.semconv.ServerAttributes; import io.opentelemetry.semconv.UrlAttributes; +import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes; import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import java.util.ArrayList; @@ -70,6 +71,8 @@ static SpanDataAssert sqs( val -> val.satisfiesAnyOf( v -> assertThat(v).isEqualTo(queueUrl), v -> assertThat(v).isNull())), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), equalTo(HttpAttributes.HTTP_REQUEST_METHOD, "POST"), equalTo(HttpAttributes.HTTP_RESPONSE_STATUS_CODE, 200), satisfies(UrlAttributes.URL_FULL, val -> val.isInstanceOf(String.class)), @@ -150,6 +153,8 @@ static SpanDataAssert sns(SpanDataAssert span, String spanName, String topicArn) .hasAttributesSatisfyingExactly( equalTo(stringKey("aws.agent"), "java-aws-sdk"), satisfies(stringKey("aws.endpoint"), val -> val.isInstanceOf(String.class)), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, val -> val.isInstanceOf(String.class)), equalTo(RpcIncubatingAttributes.RPC_SYSTEM, "aws-api"), equalTo(RpcIncubatingAttributes.RPC_METHOD, spanName.substring(4)), equalTo(RpcIncubatingAttributes.RPC_SERVICE, "AmazonSNS"), diff --git a/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/aws/AwsSqsTest.java b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/aws/AwsSqsTest.java index 676f94fe5a77..f1961da32e62 100644 --- a/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/aws/AwsSqsTest.java +++ b/instrumentation/spring/spring-cloud-aws-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/spring/aws/AwsSqsTest.java @@ -18,6 +18,7 @@ import io.opentelemetry.semconv.HttpAttributes; import io.opentelemetry.semconv.ServerAttributes; import io.opentelemetry.semconv.UrlAttributes; +import io.opentelemetry.semconv.incubating.AwsIncubatingAttributes; import io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes; import io.opentelemetry.semconv.incubating.RpcIncubatingAttributes; import java.util.concurrent.CompletableFuture; @@ -95,7 +96,10 @@ void sqsListener() throws InterruptedException, ExecutionException, TimeoutExcep v -> v.startsWith( "http://localhost:" + AwsSqsTestApplication.sqsPort)), - equalTo(AttributeKey.stringKey("aws.queue.name"), "test-queue")), + equalTo(AttributeKey.stringKey("aws.queue.name"), "test-queue"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class))), span -> span.hasName("test-queue publish") .hasKind(SpanKind.PRODUCER) @@ -129,7 +133,10 @@ void sqsListener() throws InterruptedException, ExecutionException, TimeoutExcep stringKey("aws.queue.url"), "http://localhost:" + AwsSqsTestApplication.sqsPort - + "/000000000000/test-queue")), + + "/000000000000/test-queue"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class))), span -> span.hasName("test-queue process") .hasKind(SpanKind.CONSUMER) @@ -184,6 +191,9 @@ void sqsListener() throws InterruptedException, ExecutionException, TimeoutExcep stringKey("aws.queue.url"), "http://localhost:" + AwsSqsTestApplication.sqsPort - + "/000000000000/test-queue")))); + + "/000000000000/test-queue"), + satisfies( + AwsIncubatingAttributes.AWS_REQUEST_ID, + val -> val.isInstanceOf(String.class))))); } }