Skip to content

Commit a6bf3d2

Browse files
authored
Merge pull request #11 from yiyuan-he/v1_32_1_dev_sdk_v1
feat: Add auto-instrumentation support in AWS V1 SDK for Step Functio…
2 parents d40b453 + f0026c4 commit a6bf3d2

File tree

5 files changed

+140
-0
lines changed

5 files changed

+140
-0
lines changed

instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsExperimentalAttributes.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,5 +29,20 @@ final class AwsExperimentalAttributes {
2929
stringKey("gen_ai.request.model");
3030
static final AttributeKey<String> AWS_BEDROCK_SYSTEM = stringKey("gen_ai.system");
3131

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

instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkExperimentalAttributesExtractor.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,15 @@
1313
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_ENDPOINT;
1414
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_GUARDRAIL_ID;
1515
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_KNOWLEDGE_BASE_ID;
16+
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_LAMBDA_NAME;
17+
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_LAMBDA_RESOURCE_ID;
1618
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_QUEUE_NAME;
1719
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_QUEUE_URL;
1820
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_REQUEST_ID;
21+
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_SECRET_ARN;
22+
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_SNS_TOPIC_ARN;
23+
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_STATE_MACHINE_ARN;
24+
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_STEP_FUNCTIONS_ACTIVITY_ARN;
1925
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_STREAM_NAME;
2026
import static io.opentelemetry.instrumentation.awssdk.v1_11.AwsExperimentalAttributes.AWS_TABLE_NAME;
2127

@@ -50,6 +56,18 @@ public void onStart(AttributesBuilder attributes, Context parentContext, Request
5056
setAttribute(attributes, AWS_QUEUE_NAME, originalRequest, RequestAccess::getQueueName);
5157
setAttribute(attributes, AWS_STREAM_NAME, originalRequest, RequestAccess::getStreamName);
5258
setAttribute(attributes, AWS_TABLE_NAME, originalRequest, RequestAccess::getTableName);
59+
setAttribute(
60+
attributes, AWS_STATE_MACHINE_ARN, originalRequest, RequestAccess::getStateMachineArn);
61+
setAttribute(
62+
attributes,
63+
AWS_STEP_FUNCTIONS_ACTIVITY_ARN,
64+
originalRequest,
65+
RequestAccess::getStepFunctionsActivityArn);
66+
setAttribute(attributes, AWS_SNS_TOPIC_ARN, originalRequest, RequestAccess::getSnsTopicArn);
67+
setAttribute(attributes, AWS_SECRET_ARN, originalRequest, RequestAccess::getSecretArn);
68+
setAttribute(attributes, AWS_LAMBDA_NAME, originalRequest, RequestAccess::getLambdaName);
69+
setAttribute(
70+
attributes, AWS_LAMBDA_RESOURCE_ID, originalRequest, RequestAccess::getLambdaResourceId);
5371

5472
// Get serviceName defined in the AWS Java SDK V1 Request class.
5573
String serviceName = request.getServiceName();
@@ -68,6 +86,14 @@ public void onEnd(
6886
@Nullable Throwable error) {
6987
if (response != null) {
7088
Object awsResp = response.getAwsResponse();
89+
setAttribute(attributes, AWS_STATE_MACHINE_ARN, awsResp, RequestAccess::getStateMachineArn);
90+
setAttribute(
91+
attributes,
92+
AWS_STEP_FUNCTIONS_ACTIVITY_ARN,
93+
awsResp,
94+
RequestAccess::getStepFunctionsActivityArn);
95+
setAttribute(attributes, AWS_SNS_TOPIC_ARN, awsResp, RequestAccess::getSnsTopicArn);
96+
setAttribute(attributes, AWS_SECRET_ARN, awsResp, RequestAccess::getSecretArn);
7197
if (awsResp instanceof AmazonWebServiceResponse) {
7298
AmazonWebServiceResponse<?> awsWebServiceResponse = (AmazonWebServiceResponse<?>) awsResp;
7399
String requestId = awsWebServiceResponse.getRequestId();

instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/RequestAccess.java

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,42 @@ protected RequestAccess computeValue(Class<?> type) {
2020
}
2121
};
2222

23+
@Nullable
24+
static String getLambdaName(Object request) {
25+
RequestAccess access = REQUEST_ACCESSORS.get(request.getClass());
26+
return invokeOrNull(access.getLambdaName, request);
27+
}
28+
29+
@Nullable
30+
static String getLambdaResourceId(Object request) {
31+
RequestAccess access = REQUEST_ACCESSORS.get(request.getClass());
32+
return invokeOrNull(access.getLambdaResourceId, request);
33+
}
34+
35+
@Nullable
36+
static String getSecretArn(Object request) {
37+
RequestAccess access = REQUEST_ACCESSORS.get(request.getClass());
38+
return invokeOrNull(access.getSecretArn, request);
39+
}
40+
41+
@Nullable
42+
static String getSnsTopicArn(Object request) {
43+
RequestAccess access = REQUEST_ACCESSORS.get(request.getClass());
44+
return invokeOrNull(access.getSnsTopicArn, request);
45+
}
46+
47+
@Nullable
48+
static String getStepFunctionsActivityArn(Object request) {
49+
RequestAccess access = REQUEST_ACCESSORS.get(request.getClass());
50+
return invokeOrNull(access.getStepFunctionsActivityArn, request);
51+
}
52+
53+
@Nullable
54+
static String getStateMachineArn(Object request) {
55+
RequestAccess access = REQUEST_ACCESSORS.get(request.getClass());
56+
return invokeOrNull(access.getStateMachineArn, request);
57+
}
58+
2359
@Nullable
2460
static String getBucketName(Object request) {
2561
RequestAccess access = REQUEST_ACCESSORS.get(request.getClass());
@@ -102,6 +138,12 @@ private static String invokeOrNull(@Nullable MethodHandle method, Object obj) {
102138
@Nullable private final MethodHandle getDataSourceId;
103139
@Nullable private final MethodHandle getGuardrailId;
104140
@Nullable private final MethodHandle getModelId;
141+
@Nullable private final MethodHandle getStateMachineArn;
142+
@Nullable private final MethodHandle getStepFunctionsActivityArn;
143+
@Nullable private final MethodHandle getSnsTopicArn;
144+
@Nullable private final MethodHandle getSecretArn;
145+
@Nullable private final MethodHandle getLambdaName;
146+
@Nullable private final MethodHandle getLambdaResourceId;
105147

106148
private RequestAccess(Class<?> clz) {
107149
getBucketName = findAccessorOrNull(clz, "getBucketName");
@@ -114,6 +156,12 @@ private RequestAccess(Class<?> clz) {
114156
getDataSourceId = findAccessorOrNull(clz, "getDataSourceId");
115157
getGuardrailId = findAccessorOrNull(clz, "getGuardrailId");
116158
getModelId = findAccessorOrNull(clz, "getModelId");
159+
getStateMachineArn = findAccessorOrNull(clz, "getStateMachineArn");
160+
getStepFunctionsActivityArn = findAccessorOrNull(clz, "getActivityArn");
161+
getSnsTopicArn = findAccessorOrNull(clz, "getTopicArn");
162+
getSecretArn = findAccessorOrNull(clz, "getARN");
163+
getLambdaName = findAccessorOrNull(clz, "getFunctionName");
164+
getLambdaResourceId = findAccessorOrNull(clz, "getUUID");
117165
}
118166

119167
@Nullable

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@ dependencies {
1818
compileOnly("com.amazonaws:aws-java-sdk-bedrockagent:1.12.744")
1919
compileOnly("com.amazonaws:aws-java-sdk-bedrockagentruntime:1.12.744")
2020
compileOnly("com.amazonaws:aws-java-sdk-bedrockruntime:1.12.744")
21+
compileOnly("com.amazonaws:aws-java-sdk-stepfunctions:1.11.+")
22+
compileOnly("com.amazonaws:aws-java-sdk-secretsmanager:1.11.+")
23+
compileOnly("com.amazonaws:aws-java-sdk-lambda:1.11.+")
2124

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

instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/groovy/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractAws1ClientTest.groovy

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,15 @@ import com.amazonaws.services.bedrock.AmazonBedrockClientBuilder
3535
import com.amazonaws.services.bedrock.model.GetGuardrailRequest
3636
import com.amazonaws.services.bedrockruntime.AmazonBedrockRuntimeClientBuilder
3737
import com.amazonaws.services.bedrockruntime.model.InvokeModelRequest
38+
import com.amazonaws.services.stepfunctions.model.DescribeStateMachineRequest
39+
import com.amazonaws.services.stepfunctions.model.DescribeActivityRequest
40+
import com.amazonaws.services.sns.AmazonSNSClientBuilder
41+
import com.amazonaws.services.sns.model.PublishRequest
42+
import com.amazonaws.services.secretsmanager.AWSSecretsManagerClientBuilder
43+
import com.amazonaws.services.secretsmanager.model.CreateSecretRequest
44+
import com.amazonaws.services.lambda.AWSLambdaClientBuilder
45+
import com.amazonaws.services.lambda.model.GetEventSourceMappingRequest
46+
import com.amazonaws.services.lambda.model.GetFunctionRequest
3847
import io.opentelemetry.api.trace.Span
3948
import io.opentelemetry.instrumentation.test.InstrumentationSpecification
4049
import io.opentelemetry.semconv.SemanticAttributes
@@ -207,6 +216,45 @@ abstract class AbstractAws1ClientTest extends InstrumentationSpecification {
207216
"stop": "holes"
208217
}
209218
"""
219+
"AWSStepFunctions" | "DescribeStateMachine" | "POST" | "/" | AWSStepFunctionsClientBuilder.standard()
220+
| { c -> c.describeStateMachine(new DescribeStateMachineRequest().withStateMachineArn("stateMachineArn")) }
221+
| ["aws.stepfunctions.state_machine.arn": "stateMachineArn"]
222+
| ""
223+
"AWSStepFunctions" | "DescribeActivity" | "POST" | "/" | AWSStepFunctionsClientBuilder.standard()
224+
| { c -> c.describeActivity(new DescribeActivityRequest().withActivityArn("activityArn")) }
225+
| ["aws.stepfunctions.activity.arn": "activityArn"]
226+
| ""
227+
"SNS" | "Publish" | "POST" | "/" | AmazonSNSClientBuilder.standard()
228+
| { c -> c.publish(new PublishRequest().withMessage("message").withTopicArn("topicArn")) }
229+
| ["aws.sns.topic.arn": "topicArn"]
230+
| """
231+
<PublishResponse xmlns="https://sns.amazonaws.com/doc/2010-03-31/">
232+
<PublishResult>
233+
<MessageId>567910cd-659e-55d4-8ccb-5aaf14679dc0</MessageId>
234+
</PublishResult>
235+
<ResponseMetadata>
236+
<RequestId>d74b8436-ae13-5ab4-a9ff-ce54dfea72a0</RequestId>
237+
</ResponseMetadata>
238+
</PublishResponse>
239+
"""
240+
"AWSSecretsManager" | "CreateSecret" | "POST" | "/" | AWSSecretsManagerClientBuilder.standard()
241+
| { c -> c.createSecret(new CreateSecretRequest().withName("secretName").withSecretString("secretValue")) }
242+
| ["aws.secretsmanager.secret.arn": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3"]
243+
| """
244+
{
245+
"ARN": "arn:aws:secretsmanager:us-west-2:123456789012:secret:MyTestDatabaseSecret-a1b2c3",
246+
"Name":"MyTestDatabaseSecret",
247+
"VersionId": "EXAMPLE1-90ab-cdef-fedc-ba987SECRET1"
248+
}
249+
"""
250+
"AWSLambda" | "GetEventSourceMapping" | "GET" | "/" | AWSLambdaClientBuilder.standard()
251+
| { c -> c.getEventSourceMapping(new GetEventSourceMappingRequest().withUUID("uuid")) }
252+
| ["aws.lambda.resource_mapping.id": "uuid"]
253+
| ""
254+
"AWSLambda" | "GetFunction" | "GET" | "/" | AWSLambdaClientBuilder.standard()
255+
| { c-> c.getFunction(new GetFunctionRequest().withFunctionName("functionName")) }
256+
| ["aws.lambda.function.name": "functionName"]
257+
| ""
210258
}
211259

212260
def "send #operation request to closed port"() {

0 commit comments

Comments
 (0)