Skip to content

Commit 393e3d4

Browse files
committed
feat: Add auto-instrumentation support for in AWS V2 SDK for SNS, SecretsManager, StepFunctions, and Lambda
1 parent d40b453 commit 393e3d4

File tree

8 files changed

+62
-1
lines changed

8 files changed

+62
-1
lines changed

instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ dependencies {
8484
testLibrary("software.amazon.awssdk:sqs:2.2.0")
8585
testLibrary("software.amazon.awssdk:sns:2.2.0")
8686
testLibrary("software.amazon.awssdk:ses:2.2.0")
87+
testLibrary("software.amazon.awssdk:sfn:2.2.0")
88+
testLibrary("software.amazon.awssdk:secretsmanager:2.2.0")
8789

8890
// last version that does not use json protocol
8991
latestDepTestLibrary("software.amazon.awssdk:sqs:2.21.17")

instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ dependencies {
2121
testLibrary("software.amazon.awssdk:s3:2.2.0")
2222
testLibrary("software.amazon.awssdk:sqs:2.2.0")
2323
testLibrary("software.amazon.awssdk:sns:2.2.0")
24+
testLibrary("software.amazon.awssdk:sfn:2.2.0")
25+
testLibrary("software.amazon.awssdk:secretsmanager:2.2.0")
2426

2527
// last version that does not use json protocol
2628
latestDepTestLibrary("software.amazon.awssdk:sqs:2.21.17")

instrumentation/aws-sdk/aws-sdk-2.2/library/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ dependencies {
1919
testLibrary("software.amazon.awssdk:rds:2.2.0")
2020
testLibrary("software.amazon.awssdk:s3:2.2.0")
2121
testLibrary("software.amazon.awssdk:ses:2.2.0")
22+
testLibrary("software.amazon.awssdk:sfn:2.2.0")
23+
testLibrary("software.amazon.awssdk:secretsmanager:2.2.0")
2224

2325
// last version that does not use json protocol
2426
latestDepTestLibrary("software.amazon.awssdk:sqs:2.21.17")

instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsExperimentalAttributes.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,5 +25,22 @@ final class AwsExperimentalAttributes {
2525
static final AttributeKey<String> GEN_AI_MODEL = stringKey("gen_ai.request.model");
2626
static final AttributeKey<String> GEN_AI_SYSTEM = stringKey("gen_ai.system");
2727

28+
static final AttributeKey<String> AWS_STATE_MACHINE_ARN =
29+
stringKey("aws.stepfunctions.state_machine.arn");
30+
31+
static final AttributeKey<String> AWS_STEP_FUNCTIONS_ACTIVITY_ARN =
32+
stringKey("aws.stepfunctions.activity.arn");
33+
34+
static final AttributeKey<String> AWS_SNS_TOPIC_ARN = stringKey("aws.sns.topic.arn");
35+
36+
static final AttributeKey<String> AWS_SECRET_ARN = stringKey("aws.secretsmanager.secret.arn");
37+
38+
static final AttributeKey<String> AWS_LAMBDA_NAME = stringKey("aws.lambda.function.name");
39+
40+
static final AttributeKey<String> AWS_LAMBDA_ARN = stringKey("aws.lambda.function.arn");
41+
42+
static final AttributeKey<String> AWS_LAMBDA_RESOURCE_ID =
43+
stringKey("aws.lambda.resource_mapping.id");
44+
2845
private AwsExperimentalAttributes() {}
2946
}

instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequest.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,12 @@
1212
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkRequestType.BEDROCKRUNTIME;
1313
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkRequestType.DYNAMODB;
1414
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkRequestType.KINESIS;
15+
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkRequestType.LAMBDA;
1516
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkRequestType.S3;
17+
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkRequestType.SECRETSMANAGER;
18+
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkRequestType.SNS;
1619
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkRequestType.SQS;
20+
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsSdkRequestType.STEPFUNCTION;
1721
import static io.opentelemetry.instrumentation.awssdk.v2_2.FieldMapping.request;
1822
import static io.opentelemetry.instrumentation.awssdk.v2_2.FieldMapping.response;
1923

@@ -76,6 +80,10 @@ enum AwsSdkRequest {
7680
BedrockListDataSourcesRequest(BEDROCKKNOWLEDGEBASEOPERATION, "ListDataSourcesRequest"),
7781
BedrockUpdateAgentKnowledgeBaseRequest(
7882
BEDROCKKNOWLEDGEBASEOPERATION, "UpdateAgentKnowledgeBaseRequest"),
83+
SfnRequest(STEPFUNCTION, "SfnRequest"),
84+
SnsRequest(SNS, "SnsRequest"),
85+
SecretsManagerRequest(SECRETSMANAGER, "SecretsManagerRequest"),
86+
LambdaRequest(LAMBDA, "LambdaRequest"),
7987
// specific requests
8088
BatchGetItem(
8189
DYNAMODB,

instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AwsSdkRequestType.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,15 @@
1010
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsExperimentalAttributes.AWS_DATA_SOURCE_ID;
1111
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsExperimentalAttributes.AWS_GUARDRAIL_ID;
1212
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsExperimentalAttributes.AWS_KNOWLEDGE_BASE_ID;
13+
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsExperimentalAttributes.AWS_LAMBDA_ARN;
14+
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsExperimentalAttributes.AWS_LAMBDA_NAME;
15+
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsExperimentalAttributes.AWS_LAMBDA_RESOURCE_ID;
1316
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsExperimentalAttributes.AWS_QUEUE_NAME;
1417
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsExperimentalAttributes.AWS_QUEUE_URL;
18+
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsExperimentalAttributes.AWS_SECRET_ARN;
19+
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsExperimentalAttributes.AWS_SNS_TOPIC_ARN;
20+
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsExperimentalAttributes.AWS_STATE_MACHINE_ARN;
21+
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsExperimentalAttributes.AWS_STEP_FUNCTIONS_ACTIVITY_ARN;
1522
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsExperimentalAttributes.AWS_STREAM_NAME;
1623
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsExperimentalAttributes.AWS_TABLE_NAME;
1724
import static io.opentelemetry.instrumentation.awssdk.v2_2.AwsExperimentalAttributes.GEN_AI_MODEL;
@@ -36,7 +43,16 @@ enum AwsSdkRequestType {
3643
BEDROCKKNOWLEDGEBASEOPERATION(
3744
request(AWS_KNOWLEDGE_BASE_ID.getKey(), "knowledgeBaseId"),
3845
response(AWS_KNOWLEDGE_BASE_ID.getKey(), "knowledgeBaseId")),
39-
BEDROCKRUNTIME(request(GEN_AI_MODEL.getKey(), "modelId"));
46+
BEDROCKRUNTIME(request(GEN_AI_MODEL.getKey(), "modelId")),
47+
STEPFUNCTION(
48+
request(AWS_STATE_MACHINE_ARN.getKey(), "stateMachineArn"),
49+
request(AWS_STEP_FUNCTIONS_ACTIVITY_ARN.getKey(), "activityArn")),
50+
SNS(request(AWS_SNS_TOPIC_ARN.getKey(), "TopicArn")),
51+
SECRETSMANAGER(response(AWS_SECRET_ARN.getKey(), "ARN")),
52+
LAMBDA(
53+
request(AWS_LAMBDA_NAME.getKey(), "FunctionName"),
54+
request(AWS_LAMBDA_RESOURCE_ID.getKey(), "UUID"),
55+
response(AWS_LAMBDA_ARN.getKey(), "Configuration.FunctionArn"));
4056

4157
// Wrapping in unmodifiableMap
4258
@SuppressWarnings("ImmutableEnumChecker")

instrumentation/aws-sdk/aws-sdk-2.2/testing/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ dependencies {
1919
compileOnly("software.amazon.awssdk:sqs:2.2.0")
2020
compileOnly("software.amazon.awssdk:sns:2.2.0")
2121
compileOnly("software.amazon.awssdk:ses:2.2.0")
22+
compileOnly("software.amazon.awssdk:sfn:2.2.0")
2223

2324
// needed for SQS - using emq directly as localstack references emq v0.15.7 ie WITHOUT AWS trace header propagation
2425
implementation("org.elasticmq:elasticmq-rest-sqs_2.12:1.0.0")

instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.groovy

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,9 @@ import software.amazon.awssdk.services.sqs.SqsAsyncClient
3333
import software.amazon.awssdk.services.sqs.SqsClient
3434
import software.amazon.awssdk.services.sqs.model.CreateQueueRequest
3535
import software.amazon.awssdk.services.sqs.model.SendMessageRequest
36+
import software.amazon.awssdk.services.sfn.SfnClient
37+
import software.amazon.awssdk.services.sfn.model.DescribeStateMachineRequest
38+
import software.amazon.awssdk.services.sfn.model.DescribeActivityRequest
3639
import spock.lang.Unroll
3740

3841
import java.time.Duration
@@ -131,6 +134,10 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest {
131134
} else if (service == "BedrockRuntime" && operation == "InvokeModel") {
132135
"gen_ai.request.model" "meta.llama2-13b-chat-v1"
133136
"gen_ai.system" "aws_bedrock"
137+
} else if (service == "Sfn" && operation == "DescribeStateMachine") {
138+
"aws.stepfunctions.state_machine.arn" "stateMachineArn"
139+
} else if (service == "Sfn" && operation == "DescribeActivity") {
140+
"aws.stepfunctions.activity.arn" "activityArn"
134141
}
135142

136143
}
@@ -174,6 +181,12 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest {
174181
<ResponseMetadata><RequestId>0ac9cda2-bbf4-11d3-f92b-31fa5e8dbc99</RequestId></ResponseMetadata>
175182
</DeleteOptionGroupResponse>
176183
"""
184+
"Sfn" | "DescribeStateMachine" | "POST" | "UNKNOWN" | SfnClient.builder()
185+
| { c -> c.describeStateMachine(DescribeStateMachineRequest.builder().stateMachineArn("stateMachineArn").build()) }
186+
| ""
187+
"Sfn" | "DescribeActivity" | "POST" | "UNKNOWN" | SfnClient.builder()
188+
| { c -> c.describeActivity(DescribeActivityRequest.builder().activityArn("activityArn").build()) }
189+
| ""
177190
}
178191

179192
def "send #operation async request with builder #builder.class.getName() mocked response"() {

0 commit comments

Comments
 (0)