Skip to content

Commit 74bc1be

Browse files
authored
feat: Add auto-instrumentation support for AWS Step Functions SDK v2 (#14028)
1 parent 8fec214 commit 74bc1be

File tree

7 files changed

+110
-1
lines changed

7 files changed

+110
-1
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ dependencies {
123123
testLibrary("software.amazon.awssdk:s3:2.2.0")
124124
testLibrary("software.amazon.awssdk:ses:2.2.0")
125125
testLibrary("software.amazon.awssdk:secretsmanager:2.2.0")
126+
testLibrary("software.amazon.awssdk:sfn:2.2.0")
126127
testLibrary("software.amazon.awssdk:sns:2.2.0")
127128
testLibrary("software.amazon.awssdk:sqs:2.2.0")
128129
}

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

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

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ dependencies {
2828
testLibrary("software.amazon.awssdk:s3:2.2.0")
2929
testLibrary("software.amazon.awssdk:secretsmanager:2.2.0")
3030
testLibrary("software.amazon.awssdk:ses:2.2.0")
31+
testLibrary("software.amazon.awssdk:sfn:2.2.0")
3132
}
3233

3334
val testLatestDeps = findProperty("testLatestDeps") as Boolean

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.SECRETSMANAGER;
1313
import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.SNS;
1414
import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.SQS;
15+
import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.STEPFUNCTIONS;
1516
import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.FieldMapping.request;
1617
import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.FieldMapping.response;
1718

@@ -37,6 +38,7 @@ enum AwsSdkRequest {
3738
SqsRequest(SQS, "SqsRequest"),
3839
KinesisRequest(KINESIS, "KinesisRequest"),
3940
SecretsManagerRequest(SECRETSMANAGER, "SecretsManagerRequest"),
41+
StepFunctionsRequest(STEPFUNCTIONS, "SfnRequest"),
4042
// specific requests
4143
BatchGetItem(
4244
DYNAMODB,

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ enum AwsSdkRequestType {
2626
* Only one of TopicArn and TargetArn are permitted on an SNS request.
2727
*/
2828
request(AttributeKeys.MESSAGING_DESTINATION_NAME.getKey(), "TargetArn"),
29-
request(AttributeKeys.MESSAGING_DESTINATION_NAME.getKey(), "TopicArn"));
29+
request(AttributeKeys.MESSAGING_DESTINATION_NAME.getKey(), "TopicArn")),
30+
STEPFUNCTIONS(
31+
request(AttributeKeys.AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN.getKey(), "stateMachineArn"),
32+
request(AttributeKeys.AWS_STEP_FUNCTIONS_ACTIVITY_ARN.getKey(), "activityArn"));
3033

3134
// Wrapping in unmodifiableMap
3235
@SuppressWarnings("ImmutableEnumChecker")
@@ -44,6 +47,10 @@ private static class AttributeKeys {
4447
// Copied from AwsIncubatingAttributes
4548
static final AttributeKey<String> AWS_SECRETSMANAGER_SECRET_ARN =
4649
stringKey("aws.secretsmanager.secret.arn");
50+
static final AttributeKey<String> AWS_STEP_FUNCTIONS_ACTIVITY_ARN =
51+
stringKey("aws.step_functions.activity.arn");
52+
static final AttributeKey<String> AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN =
53+
stringKey("aws.step_functions.state_machine.arn");
4754

4855
// copied from MessagingIncubatingAttributes
4956
static final AttributeKey<String> MESSAGING_DESTINATION_NAME =

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
@@ -20,6 +20,7 @@ dependencies {
2020
compileOnly("software.amazon.awssdk:s3:2.2.0")
2121
compileOnly("software.amazon.awssdk:secretsmanager:2.2.0")
2222
compileOnly("software.amazon.awssdk:ses:2.2.0")
23+
compileOnly("software.amazon.awssdk:sfn:2.2.0")
2324
compileOnly("software.amazon.awssdk:sns:2.2.0")
2425
compileOnly("software.amazon.awssdk:sqs:2.2.0")
2526

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

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@
1515
import static io.opentelemetry.semconv.UrlAttributes.URL_FULL;
1616
import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_REQUEST_ID;
1717
import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_SECRETSMANAGER_SECRET_ARN;
18+
import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_STEP_FUNCTIONS_ACTIVITY_ARN;
19+
import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN;
1820
import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME;
1921
import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID;
2022
import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION;
@@ -86,6 +88,12 @@
8688
import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder;
8789
import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest;
8890
import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse;
91+
import software.amazon.awssdk.services.sfn.SfnAsyncClient;
92+
import software.amazon.awssdk.services.sfn.SfnAsyncClientBuilder;
93+
import software.amazon.awssdk.services.sfn.SfnClient;
94+
import software.amazon.awssdk.services.sfn.SfnClientBuilder;
95+
import software.amazon.awssdk.services.sfn.model.DescribeActivityRequest;
96+
import software.amazon.awssdk.services.sfn.model.DescribeStateMachineRequest;
8997
import software.amazon.awssdk.services.sns.SnsAsyncClient;
9098
import software.amazon.awssdk.services.sns.SnsAsyncClientBuilder;
9199
import software.amazon.awssdk.services.sns.SnsClient;
@@ -233,6 +241,14 @@ private void clientAssertions(
233241
equalTo(MESSAGING_SYSTEM, AWS_SQS))));
234242
}
235243

244+
if (service.equals("Sfn")) {
245+
if (operation.equals("DescribeStateMachine")) {
246+
attributes.add(equalTo(AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN, "state:machine:arn:foo"));
247+
} else if (operation.equals("DescribeActivity")) {
248+
attributes.add(equalTo(AWS_STEP_FUNCTIONS_ACTIVITY_ARN, "activity:arn:foo"));
249+
}
250+
}
251+
236252
if (service.equals("SecretsManager")) {
237253
attributes.add(
238254
equalTo(
@@ -749,6 +765,86 @@ void testS3ListNullBucket() {
749765
assertThat(Context.current()).isEqualTo(Context.root());
750766
}
751767

768+
private static Stream<Arguments> provideStepFunctionsArguments() {
769+
return Stream.of(
770+
Arguments.of(
771+
(Function<SfnClient, Object>)
772+
c ->
773+
c.describeStateMachine(
774+
DescribeStateMachineRequest.builder()
775+
.stateMachineArn("state:machine:arn:foo")
776+
.build()),
777+
"DescribeStateMachine",
778+
"POST",
779+
"UNKNOWN"),
780+
Arguments.of(
781+
(Function<SfnClient, Object>)
782+
c ->
783+
c.describeActivity(
784+
DescribeActivityRequest.builder().activityArn("activity:arn:foo").build()),
785+
"DescribeActivity",
786+
"POST",
787+
"UNKNOWN"));
788+
}
789+
790+
@ParameterizedTest
791+
@MethodSource("provideStepFunctionsArguments")
792+
void testSfnSendOperationRequestWithBuilder(
793+
Function<SfnClient, Object> call, String operation, String method, String requestId) {
794+
SfnClientBuilder builder = SfnClient.builder();
795+
configureSdkClient(builder);
796+
SfnClient client =
797+
builder
798+
.endpointOverride(clientUri)
799+
.region(Region.AP_NORTHEAST_1)
800+
.credentialsProvider(CREDENTIALS_PROVIDER)
801+
.build();
802+
803+
server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, ""));
804+
Object response = call.apply(client);
805+
assertThat(response.getClass().getSimpleName())
806+
.satisfiesAnyOf(
807+
v ->
808+
assertThat(response)
809+
.isInstanceOf(
810+
software.amazon.awssdk.services.sfn.model.DescribeActivityResponse.class),
811+
v ->
812+
assertThat(response)
813+
.isInstanceOf(
814+
software.amazon.awssdk.services.sfn.model.DescribeStateMachineResponse
815+
.class));
816+
clientAssertions("Sfn", operation, method, response, requestId);
817+
}
818+
819+
@ParameterizedTest
820+
@MethodSource("provideStepFunctionsArguments")
821+
void testSfnAsyncSendOperationRequestWithBuilder(
822+
Function<SfnClient, Object> call, String operation, String method, String requestId) {
823+
SfnAsyncClientBuilder builder = SfnAsyncClient.builder();
824+
configureSdkClient(builder);
825+
SfnAsyncClient client =
826+
builder
827+
.endpointOverride(clientUri)
828+
.region(Region.AP_NORTHEAST_1)
829+
.credentialsProvider(CREDENTIALS_PROVIDER)
830+
.build();
831+
832+
server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, ""));
833+
Object response = call.apply(wrapClient(SfnClient.class, SfnAsyncClient.class, client));
834+
assertThat(response.getClass().getSimpleName())
835+
.satisfiesAnyOf(
836+
v ->
837+
assertThat(response)
838+
.isInstanceOf(
839+
software.amazon.awssdk.services.sfn.model.DescribeActivityResponse.class),
840+
v ->
841+
assertThat(response)
842+
.isInstanceOf(
843+
software.amazon.awssdk.services.sfn.model.DescribeStateMachineResponse
844+
.class));
845+
clientAssertions("Sfn", operation, method, response, requestId);
846+
}
847+
752848
@Test
753849
void testSecretsManagerSendOperationRequestWithBuilder() {
754850
SecretsManagerClientBuilder builder = SecretsManagerClient.builder();

0 commit comments

Comments
 (0)