From 3a7ad51f6c28bc740d64a4dffec9d87313718657 Mon Sep 17 00:00:00 2001 From: thomasduncan Date: Mon, 18 Dec 2023 11:10:40 -0800 Subject: [PATCH 01/10] Record the TopicArn of an SNS Publish request under the 'messaging.destination.name' span attributed. --- .../awssdk/v2_2/AwsSdkRequest.java | 2 ++ .../awssdk/v2_2/AwsSdkRequestType.java | 3 ++- .../awssdk/v2_2/AbstractAws2ClientTest.groovy | 18 +++++++++++++++++- 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequest.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequest.java index 54253d0f7bcb..163488c06ac6 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequest.java @@ -8,6 +8,7 @@ import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkRequestType.DYNAMODB; import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkRequestType.KINESIS; import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkRequestType.S3; +import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkRequestType.SNS; import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkRequestType.SQS; import static io.opentelemetry.instrumentation.awssdk.v2_2.FieldMapping.request; import static io.opentelemetry.instrumentation.awssdk.v2_2.FieldMapping.response; @@ -30,6 +31,7 @@ enum AwsSdkRequest { // generic requests DynamoDbRequest(DYNAMODB, "DynamoDbRequest"), S3Request(S3, "S3Request"), + SnsRequest(SNS, "SnsRequest"), SqsRequest(SQS, "SqsRequest"), KinesisRequest(KINESIS, "KinesisRequest"), // specific requests diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java index 9062f2aa1738..75f37cd6974e 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java @@ -15,7 +15,8 @@ enum AwsSdkRequestType { S3(request("aws.bucket.name", "Bucket")), SQS(request("aws.queue.url", "QueueUrl"), request("aws.queue.name", "QueueName")), KINESIS(request("aws.stream.name", "StreamName")), - DYNAMODB(request("aws.table.name", "TableName")); + DYNAMODB(request("aws.table.name", "TableName")), + SNS(request("messaging.destination.name", "TopicArn")); // Wrapping in unmodifiableMap @SuppressWarnings("ImmutableEnumChecker") 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 8518fca70836..5021b6f27062 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 @@ -31,6 +31,8 @@ import software.amazon.awssdk.services.s3.S3Client import software.amazon.awssdk.services.s3.model.CreateBucketRequest import software.amazon.awssdk.services.s3.model.GetObjectRequest import software.amazon.awssdk.services.sns.SnsAsyncClient +import software.amazon.awssdk.services.sns.SnsClient +import software.amazon.awssdk.services.sns.model.PublishRequest import software.amazon.awssdk.services.sqs.SqsAsyncClient import software.amazon.awssdk.services.sqs.SqsClient import software.amazon.awssdk.services.sqs.model.CreateQueueRequest @@ -142,6 +144,8 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { "$SemanticAttributes.MESSAGING_SYSTEM" "AmazonSQS" } else if (service == "Kinesis") { "aws.stream.name" "somestream" + } else if (service == "Sns") { + "$SemanticAttributes.MESSAGING_DESTINATION_NAME" "somearn" } } } @@ -156,6 +160,16 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { "S3" | "CreateBucket" | "PUT" | "UNKNOWN" | s3ClientBuilder() | { c -> c.createBucket(CreateBucketRequest.builder().bucket("somebucket").build()) } | "" "S3" | "GetObject" | "GET" | "UNKNOWN" | s3ClientBuilder() | { c -> c.getObject(GetObjectRequest.builder().bucket("somebucket").key("somekey").build()) } | "" "Kinesis" | "DeleteStream" | "POST" | "UNKNOWN" | KinesisClient.builder() | { c -> c.deleteStream(DeleteStreamRequest.builder().streamName("somestream").build()) } | "" + "Sns" | "Publish" | "POST" | "d74b8436-ae13-5ab4-a9ff-ce54dfea72a0" | SnsClient.builder() | { c -> c.publish(PublishRequest.builder().message("somemessage").topicArn("somearn").build()) } | """ + + + 567910cd-659e-55d4-8ccb-5aaf14679dc0 + + + d74b8436-ae13-5ab4-a9ff-ce54dfea72a0 + + + """ "Sqs" | "CreateQueue" | "POST" | "7a62c49f-347e-4fc4-9331-6e8e7a96aa73" | SqsClient.builder() | { c -> c.createQueue(CreateQueueRequest.builder().queueName("somequeue").build()) } | { if (!Boolean.getBoolean("testLatestDeps")) { def content = """ @@ -280,6 +294,8 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { "$SemanticAttributes.MESSAGING_SYSTEM" "AmazonSQS" } else if (service == "Kinesis") { "aws.stream.name" "somestream" + } else if (service == "Sns") { + "$SemanticAttributes.MESSAGING_DESTINATION_NAME" "somearn" } } } @@ -366,7 +382,7 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { 0ac9cda2-bbf4-11d3-f92b-31fa5e8dbc99 """ - "Sns" | "Publish" | "POST" | "f187a3c1-376f-11df-8963-01868b7c937a" | SnsAsyncClient.builder() | { SnsAsyncClient c -> c.publish(r -> r.message("hello")) } | """ + "Sns" | "Publish" | "POST" | "f187a3c1-376f-11df-8963-01868b7c937a" | SnsAsyncClient.builder() | { SnsAsyncClient c -> c.publish(r -> r.message("hello").topicArn("somearn")) } | """ 94f20ce6-13c5-43a0-9a9e-ca52d816e90b From 37a341aa8206383d12f562513416a40aae2c61fe Mon Sep 17 00:00:00 2001 From: thomasduncan Date: Thu, 21 Dec 2023 11:16:39 -0800 Subject: [PATCH 02/10] Capture the SNS topic ARN within the AWS SDK v1 instrumentation. --- .../v1_11/AwsSdkInstrumenterFactory.java | 6 ++-- .../awssdk/v1_11/RequestAccess.java | 7 ++++ .../awssdk/v1_11/SnsAttributesExtractor.java | 34 +++++++++++++++++++ .../v1_11/AbstractAws1ClientTest.groovy | 12 +++++++ 4 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java 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 b4613dd9edb2..0ce0f34b4772 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,13 +39,15 @@ final class AwsSdkInstrumenterFactory { RpcClientAttributesExtractor.create(AwsSdkRpcAttributesGetter.INSTANCE); private static final AwsSdkExperimentalAttributesExtractor experimentalAttributesExtractor = new AwsSdkExperimentalAttributesExtractor(); + private static final SnsAttributesExtractor snsAttributesExtractor = new SnsAttributesExtractor(); private static final List, Response>> - defaultAttributesExtractors = Arrays.asList(httpAttributesExtractor, rpcAttributesExtractor); + defaultAttributesExtractors = Arrays.asList( + httpAttributesExtractor, rpcAttributesExtractor, snsAttributesExtractor); private static final List, Response>> extendedAttributesExtractors = Arrays.asList( - httpAttributesExtractor, rpcAttributesExtractor, experimentalAttributesExtractor); + httpAttributesExtractor, rpcAttributesExtractor, snsAttributesExtractor, experimentalAttributesExtractor); private static final AwsSdkSpanNameExtractor spanName = new AwsSdkSpanNameExtractor(); private final OpenTelemetry openTelemetry; diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/RequestAccess.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/RequestAccess.java index bb2ae9266c5c..8abe31e9d64e 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/RequestAccess.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/RequestAccess.java @@ -50,6 +50,11 @@ static String getTableName(Object request) { return invokeOrNull(access.getTableName, request); } + static String getTopicArn(Object request) { + RequestAccess access = REQUEST_ACCESSORS.get(request.getClass()); + return invokeOrNull(access.getTopicArn, request); + } + @Nullable private static String invokeOrNull(@Nullable MethodHandle method, Object obj) { if (method == null) { @@ -67,6 +72,7 @@ private static String invokeOrNull(@Nullable MethodHandle method, Object obj) { @Nullable private final MethodHandle getQueueName; @Nullable private final MethodHandle getStreamName; @Nullable private final MethodHandle getTableName; + @Nullable private final MethodHandle getTopicArn; private RequestAccess(Class clz) { getBucketName = findAccessorOrNull(clz, "getBucketName"); @@ -74,6 +80,7 @@ private RequestAccess(Class clz) { getQueueName = findAccessorOrNull(clz, "getQueueName"); getStreamName = findAccessorOrNull(clz, "getStreamName"); getTableName = findAccessorOrNull(clz, "getTableName"); + getTopicArn = findAccessorOrNull(clz, "getTopicArn"); } @Nullable diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java new file mode 100644 index 000000000000..846ee0cdf7a6 --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java @@ -0,0 +1,34 @@ +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import com.amazonaws.Request; +import com.amazonaws.Response; +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.semconv.SemanticAttributes; +import java.util.function.Function; +import javax.annotation.Nullable; + +public class SnsAttributesExtractor implements AttributesExtractor, Response> { + @Override + public void onStart(AttributesBuilder attributes, Context parentContext, Request request) { + setRequestAttribute(attributes, SemanticAttributes.MESSAGING_DESTINATION_NAME, + request.getOriginalRequest(), RequestAccess::getTopicArn); + } + + private static void setRequestAttribute( + AttributesBuilder attributes, + AttributeKey key, + Object request, + Function getter) { + String value = getter.apply(request); + if (value != null) { + attributes.put(key, value); + } + } + + @Override + public void onEnd(AttributesBuilder attributes, Context context, Request request, + @Nullable Response response, @Nullable Throwable error) {} +} 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 f624f14f818e..1491c402ec6f 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 @@ -27,6 +27,8 @@ import com.amazonaws.services.rds.AmazonRDSClientBuilder import com.amazonaws.services.rds.model.DeleteOptionGroupRequest import com.amazonaws.services.s3.AmazonS3Client import com.amazonaws.services.s3.AmazonS3ClientBuilder +import com.amazonaws.services.sns.AmazonSNSClientBuilder +import com.amazonaws.services.sns.model.PublishRequest import io.opentelemetry.api.trace.Span import io.opentelemetry.instrumentation.api.semconv.http.internal.HttpAttributes import io.opentelemetry.instrumentation.test.InstrumentationSpecification @@ -154,6 +156,16 @@ abstract class AbstractAws1ClientTest extends InstrumentationSpecification { """ + "SNS" | "Publish" | "POST" | "d74b8436-ae13-5ab4-a9ff-ce54dfea72a0" | AmazonSNSClientBuilder.standard() | { c -> c.publish(new PublishRequest().withMessage("somemessage").withTopicArn("somearn")) } | ["$SemanticAttributes.MESSAGING_DESTINATION_NAME": "somearn"] | """ + + + 567910cd-659e-55d4-8ccb-5aaf14679dc0 + + + d74b8436-ae13-5ab4-a9ff-ce54dfea72a0 + + + """ } def "send #operation request to closed port"() { From 5c9c14c5c291d5d024ba96c035dfad9a61cb6dcd Mon Sep 17 00:00:00 2001 From: thomasduncan Date: Thu, 21 Dec 2023 11:56:10 -0800 Subject: [PATCH 03/10] Format multi-line list assignment into one line per item. --- .../awssdk/v1_11/AwsSdkInstrumenterFactory.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) 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 0ce0f34b4772..a481f08d553b 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 @@ -45,9 +45,12 @@ final class AwsSdkInstrumenterFactory { defaultAttributesExtractors = Arrays.asList( httpAttributesExtractor, rpcAttributesExtractor, snsAttributesExtractor); private static final List, Response>> - extendedAttributesExtractors = - Arrays.asList( - httpAttributesExtractor, rpcAttributesExtractor, snsAttributesExtractor, experimentalAttributesExtractor); + extendedAttributesExtractors = Arrays.asList( + httpAttributesExtractor, + rpcAttributesExtractor, + snsAttributesExtractor, + experimentalAttributesExtractor + ); private static final AwsSdkSpanNameExtractor spanName = new AwsSdkSpanNameExtractor(); private final OpenTelemetry openTelemetry; From db7ec8d67083e8cc77e5a7793fffe6b3cac5ab6d Mon Sep 17 00:00:00 2001 From: thomasduncan Date: Thu, 21 Dec 2023 14:55:24 -0800 Subject: [PATCH 04/10] Capture the SNS target ARN as the messaging.destination.name attribute if provided with preference for the topic ARN. --- .../awssdk/v1_11/RequestAccess.java | 9 +++ .../awssdk/v1_11/SnsAttributesExtractor.java | 26 ++++---- .../v1_11/AbstractAws1ClientTest.groovy | 10 +++ .../awssdk/v2_2/AwsSdkRequestType.java | 7 +- .../awssdk/v2_2/AbstractAws2ClientTest.groovy | 66 +++++++++++-------- 5 files changed, 77 insertions(+), 41 deletions(-) diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/RequestAccess.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/RequestAccess.java index 8abe31e9d64e..c212a696781e 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/RequestAccess.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/RequestAccess.java @@ -50,11 +50,18 @@ static String getTableName(Object request) { return invokeOrNull(access.getTableName, request); } + @Nullable static String getTopicArn(Object request) { RequestAccess access = REQUEST_ACCESSORS.get(request.getClass()); return invokeOrNull(access.getTopicArn, request); } + @Nullable + static String getTargetArn(Object request) { + RequestAccess access = REQUEST_ACCESSORS.get(request.getClass()); + return invokeOrNull(access.getTargetArn, request); + } + @Nullable private static String invokeOrNull(@Nullable MethodHandle method, Object obj) { if (method == null) { @@ -73,6 +80,7 @@ private static String invokeOrNull(@Nullable MethodHandle method, Object obj) { @Nullable private final MethodHandle getStreamName; @Nullable private final MethodHandle getTableName; @Nullable private final MethodHandle getTopicArn; + @Nullable private final MethodHandle getTargetArn; private RequestAccess(Class clz) { getBucketName = findAccessorOrNull(clz, "getBucketName"); @@ -81,6 +89,7 @@ private RequestAccess(Class clz) { getStreamName = findAccessorOrNull(clz, "getStreamName"); getTableName = findAccessorOrNull(clz, "getTableName"); getTopicArn = findAccessorOrNull(clz, "getTopicArn"); + getTargetArn = findAccessorOrNull(clz, "getTargetArn"); } @Nullable diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java index 846ee0cdf7a6..3a951a71f4e4 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java @@ -1,31 +1,33 @@ package io.opentelemetry.instrumentation.awssdk.v1_11; +import com.amazonaws.AmazonWebServiceRequest; import com.amazonaws.Request; import com.amazonaws.Response; -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.semconv.SemanticAttributes; -import java.util.function.Function; import javax.annotation.Nullable; public class SnsAttributesExtractor implements AttributesExtractor, Response> { @Override public void onStart(AttributesBuilder attributes, Context parentContext, Request request) { - setRequestAttribute(attributes, SemanticAttributes.MESSAGING_DESTINATION_NAME, - request.getOriginalRequest(), RequestAccess::getTopicArn); + String destination = findMessageDestination(request.getOriginalRequest()); + if (destination != null) { + attributes.put(SemanticAttributes.MESSAGING_DESTINATION_NAME, destination); + } } - private static void setRequestAttribute( - AttributesBuilder attributes, - AttributeKey key, - Object request, - Function getter) { - String value = getter.apply(request); - if (value != null) { - attributes.put(key, value); + /* + * Attempt to discover the destination of the SNS message by first checking for a topic ARN and + * falling back to the target ARN. If neither is found null is returned. + */ + private static String findMessageDestination(AmazonWebServiceRequest request) { + String destination = RequestAccess.getTopicArn(request); + if (destination != null) { + return destination; } + return RequestAccess.getTargetArn(request); } @Override 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 1491c402ec6f..1450c4c81fa4 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 @@ -166,6 +166,16 @@ abstract class AbstractAws1ClientTest extends InstrumentationSpecification { """ + "SNS" | "Publish" | "POST" | "d74b8436-ae13-5ab4-a9ff-ce54dfea72a0" | AmazonSNSClientBuilder.standard() | { c -> c.publish(new PublishRequest().withMessage("somemessage").withTargetArn("somearn")) } | ["$SemanticAttributes.MESSAGING_DESTINATION_NAME": "somearn"] | """ + + + 567910cd-659e-55d4-8ccb-5aaf14679dc0 + + + d74b8436-ae13-5ab4-a9ff-ce54dfea72a0 + + + """ } def "send #operation request to closed port"() { diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java index 75f37cd6974e..d1b9e4288b4e 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java @@ -5,6 +5,8 @@ package io.opentelemetry.instrumentation.awssdk.v2_2; +import io.opentelemetry.semconv.SemanticAttributes; + import static io.opentelemetry.instrumentation.awssdk.v2_2.FieldMapping.request; import java.util.Collections; @@ -16,7 +18,10 @@ enum AwsSdkRequestType { SQS(request("aws.queue.url", "QueueUrl"), request("aws.queue.name", "QueueName")), KINESIS(request("aws.stream.name", "StreamName")), DYNAMODB(request("aws.table.name", "TableName")), - SNS(request("messaging.destination.name", "TopicArn")); + SNS( + request(SemanticAttributes.MESSAGING_DESTINATION_NAME.getKey(), "TargetArn"), + request(SemanticAttributes.MESSAGING_DESTINATION_NAME.getKey(), "TopicArn") + ); // Wrapping in unmodifiableMap @SuppressWarnings("ImmutableEnumChecker") 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 5021b6f27062..2dd62c549b5c 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 @@ -86,10 +86,10 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { setup: configureSdkClient(builder) def client = builder - .endpointOverride(clientUri) - .region(Region.AP_NORTHEAST_1) - .credentialsProvider(CREDENTIALS_PROVIDER) - .build() + .endpointOverride(clientUri) + .region(Region.AP_NORTHEAST_1) + .credentialsProvider(CREDENTIALS_PROVIDER) + .build() if (body instanceof Closure) { server.enqueue(body.call()) @@ -170,6 +170,16 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { """ + "Sns" | "Publish" | "POST" | "d74b8436-ae13-5ab4-a9ff-ce54dfea72a0" | SnsClient.builder() | { c -> c.publish(PublishRequest.builder().message("somemessage").targetArn("somearn").build()) } | """ + + + 567910cd-659e-55d4-8ccb-5aaf14679dc0 + + + d74b8436-ae13-5ab4-a9ff-ce54dfea72a0 + + + """ "Sqs" | "CreateQueue" | "POST" | "7a62c49f-347e-4fc4-9331-6e8e7a96aa73" | SqsClient.builder() | { c -> c.createQueue(CreateQueueRequest.builder().queueName("somequeue").build()) } | { if (!Boolean.getBoolean("testLatestDeps")) { def content = """ @@ -186,9 +196,9 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { } """ ResponseHeaders headers = ResponseHeaders.builder(HttpStatus.OK) - .contentType(MediaType.PLAIN_TEXT_UTF_8) - .add("x-amzn-RequestId", "7a62c49f-347e-4fc4-9331-6e8e7a96aa73") - .build() + .contentType(MediaType.PLAIN_TEXT_UTF_8) + .add("x-amzn-RequestId", "7a62c49f-347e-4fc4-9331-6e8e7a96aa73") + .build() return HttpResponse.of(headers, HttpData.of(StandardCharsets.UTF_8, content)) } "Sqs" | "SendMessage" | "POST" | "27daac76-34dd-47df-bd01-1f6e873584a0" | SqsClient.builder() | { c -> c.sendMessage(SendMessageRequest.builder().queueUrl(QUEUE_URL).messageBody("").build()) } | { @@ -213,9 +223,9 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { } """ ResponseHeaders headers = ResponseHeaders.builder(HttpStatus.OK) - .contentType(MediaType.PLAIN_TEXT_UTF_8) - .add("x-amzn-RequestId", "27daac76-34dd-47df-bd01-1f6e873584a0") - .build() + .contentType(MediaType.PLAIN_TEXT_UTF_8) + .add("x-amzn-RequestId", "27daac76-34dd-47df-bd01-1f6e873584a0") + .build() return HttpResponse.of(headers, HttpData.of(StandardCharsets.UTF_8, content)) } "Ec2" | "AllocateAddress" | "POST" | "59dbff89-35bd-4eac-99ed-be587EXAMPLE" | Ec2Client.builder() | { c -> c.allocateAddress() } | """ @@ -237,10 +247,10 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { setup: configureSdkClient(builder) def client = builder - .endpointOverride(clientUri) - .region(Region.AP_NORTHEAST_1) - .credentialsProvider(CREDENTIALS_PROVIDER) - .build() + .endpointOverride(clientUri) + .region(Region.AP_NORTHEAST_1) + .credentialsProvider(CREDENTIALS_PROVIDER) + .build() if (body instanceof Closure) { server.enqueue(body.call()) @@ -338,9 +348,9 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { } """ ResponseHeaders headers = ResponseHeaders.builder(HttpStatus.OK) - .contentType(MediaType.PLAIN_TEXT_UTF_8) - .add("x-amzn-RequestId", "7a62c49f-347e-4fc4-9331-6e8e7a96aa73") - .build() + .contentType(MediaType.PLAIN_TEXT_UTF_8) + .add("x-amzn-RequestId", "7a62c49f-347e-4fc4-9331-6e8e7a96aa73") + .build() return HttpResponse.of(headers, HttpData.of(StandardCharsets.UTF_8, content)) } "Sqs" | "SendMessage" | "POST" | "27daac76-34dd-47df-bd01-1f6e873584a0" | SqsAsyncClient.builder() | { c -> c.sendMessage(SendMessageRequest.builder().queueUrl(QUEUE_URL).messageBody("").build()) } | { @@ -365,9 +375,9 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { } """ ResponseHeaders headers = ResponseHeaders.builder(HttpStatus.OK) - .contentType(MediaType.PLAIN_TEXT_UTF_8) - .add("x-amzn-RequestId", "27daac76-34dd-47df-bd01-1f6e873584a0") - .build() + .contentType(MediaType.PLAIN_TEXT_UTF_8) + .add("x-amzn-RequestId", "27daac76-34dd-47df-bd01-1f6e873584a0") + .build() return HttpResponse.of(headers, HttpData.of(StandardCharsets.UTF_8, content)) } "Ec2" | "AllocateAddress" | "POST" | "59dbff89-35bd-4eac-99ed-be587EXAMPLE" | Ec2AsyncClient.builder() | { c -> c.allocateAddress() } | """ @@ -382,7 +392,7 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { 0ac9cda2-bbf4-11d3-f92b-31fa5e8dbc99 """ - "Sns" | "Publish" | "POST" | "f187a3c1-376f-11df-8963-01868b7c937a" | SnsAsyncClient.builder() | { SnsAsyncClient c -> c.publish(r -> r.message("hello").topicArn("somearn")) } | """ + "Sns" | "Publish" | "POST" | "f187a3c1-376f-11df-8963-01868b7c937a" | SnsAsyncClient.builder() | { SnsAsyncClient c -> c.publish(r -> r.message("hello").topicArn("somearn")) } | """ 94f20ce6-13c5-43a0-9a9e-ca52d816e90b @@ -403,13 +413,13 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest { server.enqueue(HttpResponse.delayed(HttpResponse.of(HttpStatus.OK), Duration.ofMillis(5000))) server.enqueue(HttpResponse.delayed(HttpResponse.of(HttpStatus.OK), Duration.ofMillis(5000))) def builder = S3Client.builder() - .overrideConfiguration(createOverrideConfigurationBuilder() - .retryPolicy(RetryPolicy.builder().numRetries(1).build()) - .build()) - .endpointOverride(clientUri) - .region(Region.AP_NORTHEAST_1) - .credentialsProvider(CREDENTIALS_PROVIDER) - .httpClientBuilder(ApacheHttpClient.builder().socketTimeout(Duration.ofMillis(50))) + .overrideConfiguration(createOverrideConfigurationBuilder() + .retryPolicy(RetryPolicy.builder().numRetries(1).build()) + .build()) + .endpointOverride(clientUri) + .region(Region.AP_NORTHEAST_1) + .credentialsProvider(CREDENTIALS_PROVIDER) + .httpClientBuilder(ApacheHttpClient.builder().socketTimeout(Duration.ofMillis(50))) if (Boolean.getBoolean("testLatestDeps")) { builder.forcePathStyle(true) From c221fbe1a7a97adcd906404a0b4cf0c08b5d4082 Mon Sep 17 00:00:00 2001 From: thomasduncan Date: Thu, 21 Dec 2023 15:20:17 -0800 Subject: [PATCH 05/10] Fix spotless check errors. --- .../awssdk/v1_11/AwsSdkInstrumenterFactory.java | 16 ++++++++-------- .../awssdk/v1_11/SnsAttributesExtractor.java | 13 +++++++++++-- .../awssdk/v2_2/AwsSdkRequestType.java | 6 ++---- 3 files changed, 21 insertions(+), 14 deletions(-) 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 a481f08d553b..16ef43d40961 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 @@ -42,15 +42,15 @@ final class AwsSdkInstrumenterFactory { private static final SnsAttributesExtractor snsAttributesExtractor = new SnsAttributesExtractor(); private static final List, Response>> - defaultAttributesExtractors = Arrays.asList( - httpAttributesExtractor, rpcAttributesExtractor, snsAttributesExtractor); + defaultAttributesExtractors = + Arrays.asList(httpAttributesExtractor, rpcAttributesExtractor, snsAttributesExtractor); private static final List, Response>> - extendedAttributesExtractors = Arrays.asList( - httpAttributesExtractor, - rpcAttributesExtractor, - snsAttributesExtractor, - experimentalAttributesExtractor - ); + extendedAttributesExtractors = + Arrays.asList( + httpAttributesExtractor, + rpcAttributesExtractor, + snsAttributesExtractor, + experimentalAttributesExtractor); private static final AwsSdkSpanNameExtractor spanName = new AwsSdkSpanNameExtractor(); private final OpenTelemetry openTelemetry; diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java index 3a951a71f4e4..ca7ea4e2f662 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java @@ -1,3 +1,8 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.instrumentation.awssdk.v1_11; import com.amazonaws.AmazonWebServiceRequest; @@ -31,6 +36,10 @@ private static String findMessageDestination(AmazonWebServiceRequest request) { } @Override - public void onEnd(AttributesBuilder attributes, Context context, Request request, - @Nullable Response response, @Nullable Throwable error) {} + public void onEnd( + AttributesBuilder attributes, + Context context, + Request request, + @Nullable Response response, + @Nullable Throwable error) {} } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java index d1b9e4288b4e..6a2d42607590 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java @@ -5,10 +5,9 @@ package io.opentelemetry.instrumentation.awssdk.v2_2; -import io.opentelemetry.semconv.SemanticAttributes; - import static io.opentelemetry.instrumentation.awssdk.v2_2.FieldMapping.request; +import io.opentelemetry.semconv.SemanticAttributes; import java.util.Collections; import java.util.List; import java.util.Map; @@ -20,8 +19,7 @@ enum AwsSdkRequestType { DYNAMODB(request("aws.table.name", "TableName")), SNS( request(SemanticAttributes.MESSAGING_DESTINATION_NAME.getKey(), "TargetArn"), - request(SemanticAttributes.MESSAGING_DESTINATION_NAME.getKey(), "TopicArn") - ); + request(SemanticAttributes.MESSAGING_DESTINATION_NAME.getKey(), "TopicArn")); // Wrapping in unmodifiableMap @SuppressWarnings("ImmutableEnumChecker") From b32078c1223318e4d76c75612094537b04b820f7 Mon Sep 17 00:00:00 2001 From: thomasduncan Date: Thu, 21 Dec 2023 16:21:36 -0800 Subject: [PATCH 06/10] Add missing assertions to javaagent SNS tests. --- .../javaagent/src/test/groovy/SnsTracingTest.groovy | 2 ++ 1 file changed, 2 insertions(+) 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 8e532232671d..94e25af40d7d 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 @@ -144,6 +144,7 @@ class SnsTracingTest extends AgentInstrumentationSpecification { "$SemanticAttributes.SERVER_ADDRESS" String "$SemanticAttributes.NETWORK_PROTOCOL_VERSION" "1.1" "$SemanticAttributes.SERVER_PORT" { it == null || Number } + "$SemanticAttributes.MESSAGING_DESTINATION_NAME" topicArn } } } @@ -164,6 +165,7 @@ class SnsTracingTest extends AgentInstrumentationSpecification { "$SemanticAttributes.SERVER_ADDRESS" String "$SemanticAttributes.NETWORK_PROTOCOL_VERSION" "1.1" "$SemanticAttributes.SERVER_PORT" { it == null || Number } + "$SemanticAttributes.MESSAGING_DESTINATION_NAME" topicArn } } span(1) { From 62cc32208d51c8a150bd72695db6a3644e77d344 Mon Sep 17 00:00:00 2001 From: thomasduncan Date: Thu, 21 Dec 2023 16:37:00 -0800 Subject: [PATCH 07/10] Add missing assertions to javaagent S3 tests. --- .../aws-sdk-1.11/javaagent/src/test/groovy/S3TracingTest.groovy | 2 ++ 1 file changed, 2 insertions(+) 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 3f9a94db6aef..37cc1a8b001c 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 @@ -424,6 +424,7 @@ class S3TracingTest extends AgentInstrumentationSpecification { "$SemanticAttributes.SERVER_ADDRESS" String "$SemanticAttributes.NETWORK_PROTOCOL_VERSION" "1.1" "$SemanticAttributes.SERVER_PORT" { it == null || Number } + "$SemanticAttributes.MESSAGING_DESTINATION_NAME" topicArn } } } @@ -465,6 +466,7 @@ class S3TracingTest extends AgentInstrumentationSpecification { "$SemanticAttributes.SERVER_ADDRESS" String "$SemanticAttributes.NETWORK_PROTOCOL_VERSION" "1.1" "$SemanticAttributes.SERVER_PORT" { it == null || Number } + "$SemanticAttributes.MESSAGING_DESTINATION_NAME" topicArn } } } From 9a6ce1cf1122595175c3c357865541841deaf447 Mon Sep 17 00:00:00 2001 From: thomasduncan Date: Fri, 22 Dec 2023 09:05:09 -0800 Subject: [PATCH 08/10] Use internalSet from AttributesExtractorUtil in AWS SDK v1 SnsAttributesExtractor. --- .../awssdk/v1_11/SnsAttributesExtractor.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java index ca7ea4e2f662..f376b01d0232 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java @@ -11,6 +11,7 @@ import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; +import io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil; import io.opentelemetry.semconv.SemanticAttributes; import javax.annotation.Nullable; @@ -18,9 +19,8 @@ public class SnsAttributesExtractor implements AttributesExtractor, R @Override public void onStart(AttributesBuilder attributes, Context parentContext, Request request) { String destination = findMessageDestination(request.getOriginalRequest()); - if (destination != null) { - attributes.put(SemanticAttributes.MESSAGING_DESTINATION_NAME, destination); - } + AttributesExtractorUtil.internalSet(attributes, SemanticAttributes.MESSAGING_DESTINATION_NAME, + destination); } /* From 943a4a9e795f6fe6ff6acfa3cf341de989deb69b Mon Sep 17 00:00:00 2001 From: thomasduncan Date: Fri, 22 Dec 2023 09:30:16 -0800 Subject: [PATCH 09/10] Add comment explaining that only one of TopicArn and TargetArn will be set on an AWS SDK v2 request. --- .../instrumentation/awssdk/v2_2/AwsSdkRequestType.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java index 6a2d42607590..72ea417bf8e4 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java @@ -18,6 +18,9 @@ enum AwsSdkRequestType { KINESIS(request("aws.stream.name", "StreamName")), DYNAMODB(request("aws.table.name", "TableName")), SNS( + /* + * Only one of TopicArn and TargetArn are permitted on an SNS request. + */ request(SemanticAttributes.MESSAGING_DESTINATION_NAME.getKey(), "TargetArn"), request(SemanticAttributes.MESSAGING_DESTINATION_NAME.getKey(), "TopicArn")); From 776adb46e9fa92c65d19519a9854abb06ab7cd5e Mon Sep 17 00:00:00 2001 From: thomasduncan Date: Fri, 22 Dec 2023 09:32:53 -0800 Subject: [PATCH 10/10] Fix formatting. --- .../instrumentation/awssdk/v1_11/SnsAttributesExtractor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java index f376b01d0232..59c1731df415 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/SnsAttributesExtractor.java @@ -19,8 +19,8 @@ public class SnsAttributesExtractor implements AttributesExtractor, R @Override public void onStart(AttributesBuilder attributes, Context parentContext, Request request) { String destination = findMessageDestination(request.getOriginalRequest()); - AttributesExtractorUtil.internalSet(attributes, SemanticAttributes.MESSAGING_DESTINATION_NAME, - destination); + AttributesExtractorUtil.internalSet( + attributes, SemanticAttributes.MESSAGING_DESTINATION_NAME, destination); } /*