From 69754f8725d2a838fc23147f40f68dba366aa3ac Mon Sep 17 00:00:00 2001 From: Luke Zhang Date: Sun, 8 Jun 2025 11:23:57 -0700 Subject: [PATCH 1/3] feat: AWS SDK v2 Secrets Manager auto-instrumentation support This PR adds auto-instrumentation support for the following AWS resource: Secrets Manager Tests Run: ./gradlew spotlessCheck ./gradlew clean assemble ./gradlew instrumentation:check ./gradlew :smoke-tests:test No regression issues found. All newly added tests pass. Backward Compatibility: There is no risk of breaking existing functionality. This change only adds instrumentation for additional AWS resources without modifying the existing behavior of the auto-instrumentation library. --- .../aws-sdk-2.2/javaagent/build.gradle.kts | 5 +- .../library-autoconfigure/build.gradle.kts | 3 +- .../aws-sdk-2.2/library/build.gradle.kts | 1 + .../internal/AwsExperimentalAttributes.java | 21 ++++++ .../awssdk/v2_2/internal/AwsSdkRequest.java | 2 + .../v2_2/internal/AwsSdkRequestType.java | 16 +++-- .../aws-sdk-2.2/testing/build.gradle.kts | 5 +- .../awssdk/v2_2/AbstractAws2ClientTest.java | 65 +++++++++++++++++++ 8 files changed, 109 insertions(+), 9 deletions(-) create mode 100644 instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsExperimentalAttributes.java diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts index 9df1916a021a..676b88988d9b 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts @@ -121,9 +121,10 @@ dependencies { testLibrary("software.amazon.awssdk:lambda:2.2.0") testLibrary("software.amazon.awssdk:rds:2.2.0") testLibrary("software.amazon.awssdk:s3:2.2.0") - testLibrary("software.amazon.awssdk:sqs:2.2.0") - testLibrary("software.amazon.awssdk:sns:2.2.0") testLibrary("software.amazon.awssdk:ses:2.2.0") + testLibrary("software.amazon.awssdk:secretsmanager:2.2.0") + testLibrary("software.amazon.awssdk:sns:2.2.0") + testLibrary("software.amazon.awssdk:sqs:2.2.0") } val latestDepTest = findProperty("testLatestDeps") as Boolean diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/build.gradle.kts index f438d3e49383..50f3acfa0a73 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/build.gradle.kts @@ -18,8 +18,9 @@ dependencies { testLibrary("software.amazon.awssdk:lambda:2.2.0") testLibrary("software.amazon.awssdk:rds:2.2.0") testLibrary("software.amazon.awssdk:s3:2.2.0") - testLibrary("software.amazon.awssdk:sqs:2.2.0") + testLibrary("software.amazon.awssdk:secretsmanager:2.2.0") testLibrary("software.amazon.awssdk:sns:2.2.0") + testLibrary("software.amazon.awssdk:sqs:2.2.0") } tasks { diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-2.2/library/build.gradle.kts index cc196ed11e75..68de20527a90 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/build.gradle.kts @@ -26,6 +26,7 @@ dependencies { testLibrary("software.amazon.awssdk:kinesis:2.2.0") testLibrary("software.amazon.awssdk:rds:2.2.0") testLibrary("software.amazon.awssdk:s3:2.2.0") + testLibrary("software.amazon.awssdk:secretsmanager:2.2.0") testLibrary("software.amazon.awssdk:ses:2.2.0") } diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsExperimentalAttributes.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsExperimentalAttributes.java new file mode 100644 index 000000000000..5f319035099e --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsExperimentalAttributes.java @@ -0,0 +1,21 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v2_2.internal; + +import static io.opentelemetry.api.common.AttributeKey.stringKey; + +import io.opentelemetry.api.common.AttributeKey; + +final class AwsExperimentalAttributes { + static final AttributeKey AWS_BUCKET_NAME = stringKey("aws.bucket.name"); + static final AttributeKey AWS_QUEUE_URL = stringKey("aws.queue.url"); + static final AttributeKey AWS_QUEUE_NAME = stringKey("aws.queue.name"); + static final AttributeKey AWS_SECRET_ARN = stringKey("aws.secretsmanager.secret.arn"); + static final AttributeKey AWS_STREAM_NAME = stringKey("aws.stream.name"); + static final AttributeKey AWS_TABLE_NAME = stringKey("aws.table.name"); + + private AwsExperimentalAttributes() {} +} diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequest.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequest.java index 2d2745a594e7..7a520861abe6 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequest.java @@ -9,6 +9,7 @@ import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.DYNAMODB; import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.KINESIS; import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.S3; +import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.SECRETSMANAGER; import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.SNS; import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.SQS; import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.FieldMapping.request; @@ -35,6 +36,7 @@ enum AwsSdkRequest { SnsRequest(SNS, "SnsRequest"), SqsRequest(SQS, "SqsRequest"), KinesisRequest(KINESIS, "KinesisRequest"), + SecretsManagerRequest(SECRETSMANAGER, "SecretsManagerRequest"), // specific requests BatchGetItem( DYNAMODB, diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequestType.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequestType.java index 1e1c2c668ec3..2acec32c45bb 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequestType.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequestType.java @@ -5,7 +5,14 @@ package io.opentelemetry.instrumentation.awssdk.v2_2.internal; +import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsExperimentalAttributes.AWS_BUCKET_NAME; +import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsExperimentalAttributes.AWS_QUEUE_NAME; +import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsExperimentalAttributes.AWS_QUEUE_URL; +import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsExperimentalAttributes.AWS_SECRET_ARN; +import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsExperimentalAttributes.AWS_STREAM_NAME; +import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsExperimentalAttributes.AWS_TABLE_NAME; import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.FieldMapping.request; +import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.FieldMapping.response; import io.opentelemetry.api.common.AttributeKey; import java.util.Collections; @@ -13,11 +20,12 @@ import java.util.Map; 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")), + S3(request(AWS_BUCKET_NAME.getKey(), "Bucket")), + SQS(request(AWS_QUEUE_URL.getKey(), "QueueUrl"), request(AWS_QUEUE_NAME.getKey(), "QueueName")), + KINESIS(request(AWS_STREAM_NAME.getKey(), "StreamName")), + DYNAMODB(request(AWS_TABLE_NAME.getKey(), "TableName")), BEDROCK_RUNTIME(), + SECRETSMANAGER(response(AWS_SECRET_ARN.getKey(), "ARN")), SNS( /* * Only one of TopicArn and TargetArn are permitted on an SNS request. diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-2.2/testing/build.gradle.kts index eb52ab1d1c7e..43dcc2a18940 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/build.gradle.kts @@ -18,9 +18,10 @@ dependencies { compileOnly("software.amazon.awssdk:lambda:2.2.0") compileOnly("software.amazon.awssdk:rds:2.2.0") compileOnly("software.amazon.awssdk:s3:2.2.0") - compileOnly("software.amazon.awssdk:sqs:2.2.0") - compileOnly("software.amazon.awssdk:sns:2.2.0") + compileOnly("software.amazon.awssdk:secretsmanager:2.2.0") compileOnly("software.amazon.awssdk:ses:2.2.0") + compileOnly("software.amazon.awssdk:sns:2.2.0") + compileOnly("software.amazon.awssdk:sqs:2.2.0") // needed for SQS - using emq directly as localstack references emq v0.15.7 ie WITHOUT AWS trace header propagation implementation("org.elasticmq:elasticmq-rest-sqs_2.13") diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java index 640e84f276a9..dc94066386ed 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java @@ -79,6 +79,12 @@ import software.amazon.awssdk.services.s3.S3ClientBuilder; import software.amazon.awssdk.services.s3.model.CreateBucketRequest; import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerAsyncClient; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerAsyncClientBuilder; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder; +import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest; +import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse; import software.amazon.awssdk.services.sns.SnsAsyncClient; import software.amazon.awssdk.services.sns.SnsAsyncClientBuilder; import software.amazon.awssdk.services.sns.SnsClient; @@ -112,6 +118,18 @@ public abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest + " 0ac9cda2-bbf4-11d3-f92b-31fa5e8dbc99" + ""; + private static final String secretsManagerBodyContent = + "{" + + " \"ARN\": \"arn:aws:secretsmanager:us-east-1:123456789012:secret:MySecretFromCLI-sNkBwD\"," + + " \"Name\": \"MySecretFromCLI\"," + + " \"VersionId\": \"9959b95b-1234-5678-a19b-a4b0315ca5aa\"," + + " \"SecretString\": \"super-secret-value\"," + + " \"VersionStages\": [" + + " \"AWSCURRENT\"" + + " ]," + + " \"CreatedDate\": \"1.523477145713E9\"" + + "}"; + private static void assumeSupportedConfig(String operation) { Assumptions.assumeFalse( operation.equals("SendMessage") && isSqsAttributeInjectionEnabled(), @@ -214,6 +232,13 @@ private void clientAssertions( equalTo(MESSAGING_SYSTEM, AWS_SQS)))); } + if (service.equals("SecretsManager")) { + attributes.add( + equalTo( + stringKey("aws.secretsmanager.secret.arn"), + "arn:aws:secretsmanager:us-east-1:123456789012:secret:MySecretFromCLI-sNkBwD")); + } + String evaluatedOperation; SpanKind operationKind; if (operation.equals("SendMessage")) { @@ -722,4 +747,44 @@ void testS3ListNullBucket() { assertThat(Context.current()).isEqualTo(Context.root()); } + + @Test + void testSecretsManagerSendOperationRequestWithBuilder() { + SecretsManagerClientBuilder builder = SecretsManagerClient.builder(); + configureSdkClient(builder); + SecretsManagerClient client = + builder + .endpointOverride(clientUri) + .region(Region.AP_NORTHEAST_1) + .credentialsProvider(CREDENTIALS_PROVIDER) + .build(); + + server.enqueue( + HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, secretsManagerBodyContent)); + Object response = + client.getSecretValue(GetSecretValueRequest.builder().secretId("MySecretFromCLI").build()); + assertThat(response.getClass().getSimpleName()) + .satisfies( + v -> assertThat(v).isEqualTo("GetSecretValueResponse"), + v -> assertThat(response).isInstanceOf(GetSecretValueResponse.class)); + clientAssertions("SecretsManager", "GetSecretValue", "POST", response, "UNKNOWN"); + } + + @Test + void testSecretsManagerAsyncSendOperationRequestWithBuilder() { + SecretsManagerAsyncClientBuilder builder = SecretsManagerAsyncClient.builder(); + configureSdkClient(builder); + SecretsManagerAsyncClient client = + builder + .endpointOverride(clientUri) + .region(Region.AP_NORTHEAST_1) + .credentialsProvider(CREDENTIALS_PROVIDER) + .build(); + + server.enqueue( + HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, secretsManagerBodyContent)); + Object response = + client.getSecretValue(GetSecretValueRequest.builder().secretId("MySecretFromCLI").build()); + clientAssertions("SecretsManager", "GetSecretValue", "POST", response, "UNKNOWN"); + } } From 2dbd08eb1f87a56938b8a4c494484e4d2b34f6a5 Mon Sep 17 00:00:00 2001 From: Luke Zhang Date: Tue, 10 Jun 2025 12:15:02 -0700 Subject: [PATCH 2/3] Addressed code review feedback: 1. Used constant from semconv. 2. Moved extraction code out of the experimental module. --- .../internal/AwsExperimentalAttributes.java | 21 ------------------- .../v2_2/internal/AwsSdkRequestType.java | 21 +++++++++---------- .../awssdk/v2_2/AbstractAws2ClientTest.java | 7 ++++++- 3 files changed, 16 insertions(+), 33 deletions(-) delete mode 100644 instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsExperimentalAttributes.java diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsExperimentalAttributes.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsExperimentalAttributes.java deleted file mode 100644 index 5f319035099e..000000000000 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsExperimentalAttributes.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.instrumentation.awssdk.v2_2.internal; - -import static io.opentelemetry.api.common.AttributeKey.stringKey; - -import io.opentelemetry.api.common.AttributeKey; - -final class AwsExperimentalAttributes { - static final AttributeKey AWS_BUCKET_NAME = stringKey("aws.bucket.name"); - static final AttributeKey AWS_QUEUE_URL = stringKey("aws.queue.url"); - static final AttributeKey AWS_QUEUE_NAME = stringKey("aws.queue.name"); - static final AttributeKey AWS_SECRET_ARN = stringKey("aws.secretsmanager.secret.arn"); - static final AttributeKey AWS_STREAM_NAME = stringKey("aws.stream.name"); - static final AttributeKey AWS_TABLE_NAME = stringKey("aws.table.name"); - - private AwsExperimentalAttributes() {} -} diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequestType.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequestType.java index 2acec32c45bb..50a2c969e960 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequestType.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequestType.java @@ -5,12 +5,7 @@ package io.opentelemetry.instrumentation.awssdk.v2_2.internal; -import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsExperimentalAttributes.AWS_BUCKET_NAME; -import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsExperimentalAttributes.AWS_QUEUE_NAME; -import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsExperimentalAttributes.AWS_QUEUE_URL; -import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsExperimentalAttributes.AWS_SECRET_ARN; -import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsExperimentalAttributes.AWS_STREAM_NAME; -import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsExperimentalAttributes.AWS_TABLE_NAME; +import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.FieldMapping.request; import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.FieldMapping.response; @@ -20,12 +15,12 @@ import java.util.Map; enum AwsSdkRequestType { - S3(request(AWS_BUCKET_NAME.getKey(), "Bucket")), - SQS(request(AWS_QUEUE_URL.getKey(), "QueueUrl"), request(AWS_QUEUE_NAME.getKey(), "QueueName")), - KINESIS(request(AWS_STREAM_NAME.getKey(), "StreamName")), - DYNAMODB(request(AWS_TABLE_NAME.getKey(), "TableName")), + 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")), BEDROCK_RUNTIME(), - SECRETSMANAGER(response(AWS_SECRET_ARN.getKey(), "ARN")), + SECRETSMANAGER(response(AttributeKeys.AWS_SECRETSMANAGER_SECRET_ARN.getKey(), "ARN")), SNS( /* * Only one of TopicArn and TargetArn are permitted on an SNS request. @@ -46,6 +41,10 @@ List fields(FieldMapping.Type type) { } private static class AttributeKeys { + // Copied from AwsIncubatingAttributes + static final AttributeKey AWS_SECRETSMANAGER_SECRET_ARN = + stringKey("aws.secretsmanager.secret.arn"); + // copied from MessagingIncubatingAttributes static final AttributeKey MESSAGING_DESTINATION_NAME = AttributeKey.stringKey("messaging.destination.name"); diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java index dc94066386ed..1b902ae78f2b 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java @@ -27,6 +27,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.catchThrowable; +import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; @@ -106,6 +107,10 @@ public abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest // prefix the hostname with the bucket name as label. private final URI clientUri = URI.create("http://localhost:" + server.httpPort()); + // Copied from AwsIncubatingAttributes. Not available in current version of semconv. + private static final AttributeKey AWS_SECRETSMANAGER_SECRET_ARN = + stringKey("aws.secretsmanager.secret.arn"); + private static final String ec2BodyContent = "" + " 59dbff89-35bd-4eac-99ed-be587EXAMPLE" @@ -235,7 +240,7 @@ private void clientAssertions( if (service.equals("SecretsManager")) { attributes.add( equalTo( - stringKey("aws.secretsmanager.secret.arn"), + stringKey(AWS_SECRETSMANAGER_SECRET_ARN.getKey()), "arn:aws:secretsmanager:us-east-1:123456789012:secret:MySecretFromCLI-sNkBwD")); } From c9aaa0df881926e14403a62b22bb2b249e3590e9 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Thu, 12 Jun 2025 10:39:49 +0300 Subject: [PATCH 3/3] use constant from semconv --- .../awssdk/v2_2/AbstractAws2ClientTest.java | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java index 1ae940fdec9c..04e523c19d9e 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java @@ -14,6 +14,7 @@ import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_REQUEST_ID; +import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_SECRETSMANAGER_SECRET_ARN; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; @@ -27,7 +28,6 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.assertj.core.api.Assertions.catchThrowable; -import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.context.Context; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; @@ -107,10 +107,6 @@ public abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest // prefix the hostname with the bucket name as label. private final URI clientUri = URI.create("http://localhost:" + server.httpPort()); - // Copied from AwsIncubatingAttributes. Not available in current version of semconv. - private static final AttributeKey AWS_SECRETSMANAGER_SECRET_ARN = - stringKey("aws.secretsmanager.secret.arn"); - private static final String ec2BodyContent = "" + " 59dbff89-35bd-4eac-99ed-be587EXAMPLE" @@ -240,7 +236,7 @@ private void clientAssertions( if (service.equals("SecretsManager")) { attributes.add( equalTo( - stringKey(AWS_SECRETSMANAGER_SECRET_ARN.getKey()), + AWS_SECRETSMANAGER_SECRET_ARN, "arn:aws:secretsmanager:us-east-1:123456789012:secret:MySecretFromCLI-sNkBwD")); }