Skip to content

Commit 965f787

Browse files
authored
Merge pull request #12 from yiyuan-he/v1_32_1_dev_sdk_v2
feat: Add auto-instrumentation support for in AWS V2 SDK for SNS, Sec…
2 parents a6bf3d2 + 9e59f06 commit 965f787

File tree

8 files changed

+112
-1
lines changed

8 files changed

+112
-1
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,9 @@ 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")
89+
testLibrary("software.amazon.awssdk:lambda:2.2.0")
8790

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

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ 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")
26+
testLibrary("software.amazon.awssdk:lambda:2.2.0")
2427

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

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ 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")
24+
testLibrary("software.amazon.awssdk:lambda:2.2.0")
2225

2326
// last version that does not use json protocol
2427
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: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ 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")
23+
compileOnly("software.amazon.awssdk:lambda:2.2.0")
24+
compileOnly("software.amazon.awssdk:secretsmanager:2.2.0")
2225

2326
// needed for SQS - using emq directly as localstack references emq v0.15.7 ie WITHOUT AWS trace header propagation
2427
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: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,19 @@ 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
39+
import software.amazon.awssdk.services.lambda.LambdaClient
40+
import software.amazon.awssdk.services.lambda.model.GetFunctionRequest
41+
import software.amazon.awssdk.services.lambda.model.GetEventSourceMappingRequest
42+
import software.amazon.awssdk.services.sns.SnsClient
43+
import software.amazon.awssdk.services.sns.model.PublishRequest
44+
import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient
45+
import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest
3646
import spock.lang.Unroll
3747

48+
3849
import java.time.Duration
3950
import java.util.concurrent.Future
4051

@@ -131,6 +142,18 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest {
131142
} else if (service == "BedrockRuntime" && operation == "InvokeModel") {
132143
"gen_ai.request.model" "meta.llama2-13b-chat-v1"
133144
"gen_ai.system" "aws_bedrock"
145+
} else if (service == "Sfn" && operation == "DescribeStateMachine") {
146+
"aws.stepfunctions.state_machine.arn" "stateMachineArn"
147+
} else if (service == "Sfn" && operation == "DescribeActivity") {
148+
"aws.stepfunctions.activity.arn" "activityArn"
149+
} else if (service == "Lambda" && operation == "GetFunction") {
150+
"aws.lambda.function.name" "functionName"
151+
} else if (service == "Lambda" && operation == "GetEventSourceMapping") {
152+
"aws.lambda.resource_mapping.id" "sourceEventId"
153+
} else if (service == "Sns") {
154+
"aws.sns.topic.arn" "topicArn"
155+
} else if (service == "SecretsManager") {
156+
"aws.secretsmanager.secret.arn" "someSecretArn"
134157
}
135158

136159
}
@@ -174,6 +197,41 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest {
174197
<ResponseMetadata><RequestId>0ac9cda2-bbf4-11d3-f92b-31fa5e8dbc99</RequestId></ResponseMetadata>
175198
</DeleteOptionGroupResponse>
176199
"""
200+
"Sfn" | "DescribeStateMachine" | "POST" | "UNKNOWN" | SfnClient.builder()
201+
| { c -> c.describeStateMachine(DescribeStateMachineRequest.builder().stateMachineArn("stateMachineArn").build()) }
202+
| ""
203+
"Sfn" | "DescribeActivity" | "POST" | "UNKNOWN" | SfnClient.builder()
204+
| { c -> c.describeActivity(DescribeActivityRequest.builder().activityArn("activityArn").build()) }
205+
| ""
206+
"Lambda" | "GetFunction" | "GET" | "UNKNOWN" | LambdaClient.builder()
207+
| { c -> c.getFunction(GetFunctionRequest.builder().functionName("functionName").build()) }
208+
| ""
209+
"Lambda" | "GetEventSourceMapping" | "GET" |"UNKNOWN" | LambdaClient.builder()
210+
| { c -> c.getEventSourceMapping(GetEventSourceMappingRequest.builder().uuid("sourceEventId").build()) }
211+
| ""
212+
"Sns" | "Publish" | "POST" | "d74b8436-ae13-5ab4-a9ff-ce54dfea72a0" | SnsClient.builder()
213+
| { c -> c.publish(PublishRequest.builder().topicArn("topicArn").message("message").build()) }
214+
| """
215+
<PublishResponse xmlns="https://sns.amazonaws.com/doc/2010-03-31/">
216+
<PublishResult>
217+
<MessageId>567910cd-659e-55d4-8ccb-5aaf14679dc0</MessageId>
218+
</PublishResult>
219+
<ResponseMetadata>
220+
<RequestId>d74b8436-ae13-5ab4-a9ff-ce54dfea72a0</RequestId>
221+
</ResponseMetadata>
222+
</PublishResponse>
223+
"""
224+
"SecretsManager" | "GetSecretValue" | "POST" | "UNKNOWN" | SecretsManagerClient.builder()
225+
| { c -> c.getSecretValue(GetSecretValueRequest.builder().secretId("someSecret1").build()) }
226+
| """
227+
{
228+
"ARN":"someSecretArn",
229+
"CreatedDate":1.523477145713E9,
230+
"Name":"MyTestDatabaseSecret",
231+
"SecretString":"{\\n \\"username\\":\\"david\\",\\n \\"password\\":\\"EXAMPLE-PASSWORD\\"\\n}\\n",
232+
"VersionId":"EXAMPLE1-90ab-cdef-fedc-ba987SECRET1"
233+
}
234+
"""
177235
}
178236

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

0 commit comments

Comments
 (0)