Skip to content

Commit 62175ca

Browse files
authored
feat: Add AWS_SNS_TOPIC_ARN semantic convention support for AWS SNS SDK (#14035)
1 parent f259187 commit 62175ca

File tree

7 files changed

+161
-61
lines changed

7 files changed

+161
-61
lines changed

instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/AwsSpanAssertions.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT;
1616
import static io.opentelemetry.semconv.UrlAttributes.URL_FULL;
1717
import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_REQUEST_ID;
18+
import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_SNS_TOPIC_ARN;
1819
import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME;
1920
import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD;
2021
import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE;
@@ -90,6 +91,7 @@ static SpanDataAssert sns(SpanDataAssert span, String topicArn, String rpcMethod
9091
.hasAttributesSatisfyingExactly(
9192
equalTo(stringKey("aws.agent"), "java-aws-sdk"),
9293
equalTo(MESSAGING_DESTINATION_NAME, topicArn),
94+
satisfies(AWS_SNS_TOPIC_ARN, v -> v.isInstanceOf(String.class)),
9395
satisfies(AWS_REQUEST_ID, v -> v.isInstanceOf(String.class)),
9496
equalTo(RPC_METHOD, rpcMethod),
9597
equalTo(RPC_SYSTEM, "aws-api"),

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class AwsSdkAttributesExtractor implements AttributesExtractor<Request<?>, Respo
2626
// Copied from AwsIncubatingAttributes
2727
private static final AttributeKey<String> AWS_SECRETSMANAGER_SECRET_ARN =
2828
stringKey("aws.secretsmanager.secret.arn");
29+
private static final AttributeKey<String> AWS_SNS_TOPIC_ARN = stringKey("aws.sns.topic.arn");
2930
private static final AttributeKey<String> AWS_STEP_FUNCTIONS_ACTIVITY_ARN =
3031
stringKey("aws.step_functions.activity.arn");
3132
private static final AttributeKey<String> AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN =
@@ -45,6 +46,7 @@ private static boolean canGetResponseMetadata() {
4546
@Override
4647
public void onStart(AttributesBuilder attributes, Context parentContext, Request<?> request) {
4748
Object originalRequest = request.getOriginalRequest();
49+
setAttribute(attributes, AWS_SNS_TOPIC_ARN, originalRequest, RequestAccess::getSnsTopicArn);
4850
setAttribute(
4951
attributes,
5052
AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN,
@@ -67,6 +69,7 @@ public void onEnd(
6769
Object awsResp = getAwsResponse(response);
6870
if (awsResp != null) {
6971
setAttribute(attributes, AWS_SECRETSMANAGER_SECRET_ARN, awsResp, RequestAccess::getSecretArn);
72+
setAttribute(attributes, AWS_SNS_TOPIC_ARN, awsResp, RequestAccess::getSnsTopicArn);
7073
setAttribute(
7174
attributes,
7275
AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN,

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ static String getTableName(Object request) {
7373
}
7474

7575
@Nullable
76-
static String getTopicArn(Object request) {
76+
static String getSnsTopicArn(Object request) {
7777
RequestAccess access = REQUEST_ACCESSORS.get(request.getClass());
7878
return invokeOrNull(access.getTopicArn, request);
7979
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public void onStart(AttributesBuilder attributes, Context parentContext, Request
3232
* falling back to the target ARN. If neither is found null is returned.
3333
*/
3434
private static String findMessageDestination(AmazonWebServiceRequest request) {
35-
String destination = RequestAccess.getTopicArn(request);
35+
String destination = RequestAccess.getSnsTopicArn(request);
3636
if (destination != null) {
3737
return destination;
3838
}

instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractSnsClientTest.java

Lines changed: 47 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,14 @@
66
package io.opentelemetry.instrumentation.awssdk.v1_11;
77

88
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
9+
import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_SNS_TOPIC_ARN;
910
import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME;
11+
import static java.util.Arrays.asList;
1012
import static java.util.Collections.singletonList;
1113

1214
import com.amazonaws.services.sns.AmazonSNS;
1315
import com.amazonaws.services.sns.AmazonSNSClientBuilder;
16+
import com.amazonaws.services.sns.model.CreateTopicRequest;
1417
import com.amazonaws.services.sns.model.PublishRequest;
1518
import io.opentelemetry.sdk.testing.assertj.AttributeAssertion;
1619
import io.opentelemetry.testing.internal.armeria.common.HttpResponse;
@@ -24,6 +27,25 @@
2427
import org.junit.jupiter.params.provider.MethodSource;
2528

2629
public abstract class AbstractSnsClientTest extends AbstractBaseAwsClientTest {
30+
private static final String publishResponseBody =
31+
"<PublishResponse xmlns=\"https://sns.amazonaws.com/doc/2010-03-31/\">"
32+
+ " <PublishResult>"
33+
+ " <MessageId>567910cd-659e-55d4-8ccb-5aaf14679dc0</MessageId>"
34+
+ " </PublishResult>"
35+
+ " <ResponseMetadata>"
36+
+ " <RequestId>d74b8436-ae13-5ab4-a9ff-ce54dfea72a0</RequestId>"
37+
+ " </ResponseMetadata>"
38+
+ "</PublishResponse>";
39+
40+
private static final String createTopicResponseBody =
41+
"<CreateTopicResponse xmlns=\"https://sns.amazonaws.com/doc/2010-03-31/\">"
42+
+ " <CreateTopicResult>"
43+
+ " <TopicArn>arn:aws:sns:us-east-1:123456789012:sns-topic-foo</TopicArn>"
44+
+ " </CreateTopicResult>"
45+
+ " <ResponseMetadata>"
46+
+ " <RequestId>d74b8436-ae13-5ab4-a9ff-ce54dfea72a0</RequestId>"
47+
+ " </ResponseMetadata>"
48+
+ "</CreateTopicResponse>";
2749

2850
public abstract AmazonSNSClientBuilder configureClient(AmazonSNSClientBuilder client);
2951

@@ -34,32 +56,23 @@ protected boolean hasRequestId() {
3456

3557
@ParameterizedTest
3658
@MethodSource("provideArguments")
37-
public void testSendRequestWithMockedResponse(Function<AmazonSNS, Object> call) throws Exception {
59+
void testSendRequestWithMockedResponse(
60+
Function<AmazonSNS, Object> call,
61+
String operation,
62+
String responseBody,
63+
List<AttributeAssertion> additionalAttributes)
64+
throws Exception {
3865
AmazonSNSClientBuilder clientBuilder = AmazonSNSClientBuilder.standard();
3966
AmazonSNS client =
4067
configureClient(clientBuilder)
4168
.withEndpointConfiguration(endpoint)
4269
.withCredentials(credentialsProvider)
4370
.build();
4471

45-
String body =
46-
"<PublishResponse xmlns=\"https://sns.amazonaws.com/doc/2010-03-31/\">"
47-
+ " <PublishResult>"
48-
+ " <MessageId>567910cd-659e-55d4-8ccb-5aaf14679dc0</MessageId>"
49-
+ " </PublishResult>"
50-
+ " <ResponseMetadata>"
51-
+ " <RequestId>d74b8436-ae13-5ab4-a9ff-ce54dfea72a0</RequestId>"
52-
+ " </ResponseMetadata>"
53-
+ "</PublishResponse>";
54-
55-
server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, body));
56-
57-
List<AttributeAssertion> additionalAttributes =
58-
singletonList(equalTo(MESSAGING_DESTINATION_NAME, "somearn"));
59-
72+
server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, responseBody));
6073
Object response = call.apply(client);
6174
assertRequestWithMockedResponse(
62-
response, client, "SNS", "Publish", "POST", additionalAttributes);
75+
response, client, "SNS", operation, "POST", additionalAttributes);
6376
}
6477

6578
private static Stream<Arguments> provideArguments() {
@@ -68,11 +81,26 @@ private static Stream<Arguments> provideArguments() {
6881
(Function<AmazonSNS, Object>)
6982
c ->
7083
c.publish(
71-
new PublishRequest().withMessage("somemessage").withTopicArn("somearn"))),
84+
new PublishRequest().withMessage("somemessage").withTopicArn("somearn")),
85+
"Publish",
86+
publishResponseBody,
87+
asList(
88+
equalTo(MESSAGING_DESTINATION_NAME, "somearn"),
89+
equalTo(AWS_SNS_TOPIC_ARN, "somearn"))),
7290
Arguments.of(
7391
(Function<AmazonSNS, Object>)
7492
c ->
7593
c.publish(
76-
new PublishRequest().withMessage("somemessage").withTargetArn("somearn"))));
94+
new PublishRequest().withMessage("somemessage").withTargetArn("somearn")),
95+
"Publish",
96+
publishResponseBody,
97+
singletonList(equalTo(MESSAGING_DESTINATION_NAME, "somearn"))),
98+
Arguments.of(
99+
(Function<AmazonSNS, Object>)
100+
c -> c.createTopic(new CreateTopicRequest().withName("sns-topic-foo")),
101+
"CreateTopic",
102+
createTopicResponseBody,
103+
singletonList(
104+
equalTo(AWS_SNS_TOPIC_ARN, "arn:aws:sns:us-east-1:123456789012:sns-topic-foo"))));
77105
}
78106
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ 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+
request(AttributeKeys.AWS_SNS_TOPIC_ARN.getKey(), "TopicArn"),
31+
response(AttributeKeys.AWS_SNS_TOPIC_ARN.getKey(), "TopicArn")),
3032
STEPFUNCTIONS(
3133
request(AttributeKeys.AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN.getKey(), "stateMachineArn"),
3234
request(AttributeKeys.AWS_STEP_FUNCTIONS_ACTIVITY_ARN.getKey(), "activityArn"));
@@ -47,6 +49,7 @@ private static class AttributeKeys {
4749
// Copied from AwsIncubatingAttributes
4850
static final AttributeKey<String> AWS_SECRETSMANAGER_SECRET_ARN =
4951
stringKey("aws.secretsmanager.secret.arn");
52+
static final AttributeKey<String> AWS_SNS_TOPIC_ARN = stringKey("aws.sns.topic.arn");
5053
static final AttributeKey<String> AWS_STEP_FUNCTIONS_ACTIVITY_ARN =
5154
stringKey("aws.step_functions.activity.arn");
5255
static final AttributeKey<String> AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN =

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

Lines changed: 103 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
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_SNS_TOPIC_ARN;
1819
import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_STEP_FUNCTIONS_ACTIVITY_ARN;
1920
import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN;
2021
import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME;
@@ -98,7 +99,12 @@
9899
import software.amazon.awssdk.services.sns.SnsAsyncClientBuilder;
99100
import software.amazon.awssdk.services.sns.SnsClient;
100101
import software.amazon.awssdk.services.sns.SnsClientBuilder;
102+
import software.amazon.awssdk.services.sns.model.CreateTopicRequest;
103+
import software.amazon.awssdk.services.sns.model.CreateTopicResponse;
101104
import software.amazon.awssdk.services.sns.model.PublishRequest;
105+
import software.amazon.awssdk.services.sns.model.PublishResponse;
106+
import software.amazon.awssdk.services.sns.model.SubscribeRequest;
107+
import software.amazon.awssdk.services.sns.model.SubscribeResponse;
102108
import software.amazon.awssdk.services.sqs.SqsAsyncClient;
103109
import software.amazon.awssdk.services.sqs.SqsAsyncClientBuilder;
104110
import software.amazon.awssdk.services.sqs.SqsClient;
@@ -139,6 +145,36 @@ public abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest
139145
+ " \"CreatedDate\": \"1.523477145713E9\""
140146
+ "}";
141147

148+
private static final String snsPublishResponseBody =
149+
"<PublishResponse xmlns=\"https://sns.amazonaws.com/doc/2010-03-31/\">"
150+
+ " <PublishResult>"
151+
+ " <MessageId>567910cd-659e-55d4-8ccb-5aaf14679dc0</MessageId>"
152+
+ " </PublishResult>"
153+
+ " <ResponseMetadata>"
154+
+ " <RequestId>d74b8436-ae13-5ab4-a9ff-ce54dfea72a0</RequestId>"
155+
+ " </ResponseMetadata>"
156+
+ "</PublishResponse>";
157+
158+
private static final String snsSubscribeResponseBody =
159+
"<SubscribeResponse xmlns=\"https://sns.amazonaws.com/doc/2010-03-31/\">"
160+
+ " <SubscribeResult>"
161+
+ " <SubscriptionArn>arn:aws:sns:us-west-2:123456789012:MyTopic:abc123</SubscriptionArn>"
162+
+ " </SubscribeResult>"
163+
+ " <ResponseMetadata>"
164+
+ " <RequestId>0ac9cda2-abcd-11d3-f92b-31fa5e8dbc67</RequestId>"
165+
+ " </ResponseMetadata>"
166+
+ " </SubscribeResponse>";
167+
168+
private static final String snsCreateTopicResponseBody =
169+
"<CreateTopicResponse xmlns=\"https://sns.amazonaws.com/doc/2010-03-31/\">"
170+
+ " <CreateTopicResult>"
171+
+ " <TopicArn>arn:aws:sns:us-east-1:123456789012:sns-topic-name-foo</TopicArn>"
172+
+ " </CreateTopicResult>"
173+
+ " <ResponseMetadata>"
174+
+ " <RequestId>d74b8436-ae13-5ab4-a9ff-ce54dfea72a0</RequestId>"
175+
+ " </ResponseMetadata>"
176+
+ "</CreateTopicResponse>";
177+
142178
private static void assumeSupportedConfig(String operation) {
143179
Assumptions.assumeFalse(
144180
operation.equals("SendMessage") && isSqsAttributeInjectionEnabled(),
@@ -223,7 +259,22 @@ private void clientAssertions(
223259
}
224260

225261
if (service.equals("Sns")) {
226-
attributes.add(equalTo(MESSAGING_DESTINATION_NAME, "somearn"));
262+
switch (operation) {
263+
case "CreateTopic":
264+
attributes.add(
265+
equalTo(AWS_SNS_TOPIC_ARN, "arn:aws:sns:us-east-1:123456789012:sns-topic-name-foo"));
266+
break;
267+
case "Publish":
268+
attributes.add(equalTo(MESSAGING_DESTINATION_NAME, "sns-target-arn"));
269+
break;
270+
case "Subscribe":
271+
attributes.add(equalTo(MESSAGING_DESTINATION_NAME, "sns-topic-arn"));
272+
attributes.add(equalTo(AWS_SNS_TOPIC_ARN, "sns-topic-arn"));
273+
break;
274+
default:
275+
attributes.add(equalTo(AWS_SNS_TOPIC_ARN, "Bug-Unknown-Operation-ARN"));
276+
break;
277+
}
227278
}
228279

229280
if (service.equals("Sqs") && operation.equals("CreateQueue")) {
@@ -516,22 +567,43 @@ private static Stream<Arguments> provideSnsArguments() {
516567
c ->
517568
c.publish(
518569
PublishRequest.builder()
519-
.message("somemessage")
520-
.topicArn("somearn")
521-
.build())),
570+
.message("sns-msg-foo")
571+
.targetArn("sns-target-arn")
572+
.build()),
573+
"Publish",
574+
"POST",
575+
snsPublishResponseBody,
576+
"d74b8436-ae13-5ab4-a9ff-ce54dfea72a0"),
522577
Arguments.of(
523578
(Function<SnsClient, Object>)
524579
c ->
525-
c.publish(
526-
PublishRequest.builder()
527-
.message("somemessage")
528-
.targetArn("somearn")
529-
.build())));
580+
c.subscribe(
581+
SubscribeRequest.builder()
582+
.topicArn("sns-topic-arn")
583+
.protocol("email")
584+
.endpoint("[email protected]")
585+
.build()),
586+
"Subscribe",
587+
"POST",
588+
snsSubscribeResponseBody,
589+
"0ac9cda2-abcd-11d3-f92b-31fa5e8dbc67"),
590+
Arguments.of(
591+
(Function<SnsClient, Object>)
592+
c -> c.createTopic(CreateTopicRequest.builder().name("sns-topic-name-foo").build()),
593+
"CreateTopic",
594+
"POST",
595+
snsCreateTopicResponseBody,
596+
"d74b8436-ae13-5ab4-a9ff-ce54dfea72a0"));
530597
}
531598

532599
@ParameterizedTest
533600
@MethodSource("provideSnsArguments")
534-
void testSnsSendOperationRequestWithBuilder(Function<SnsClient, Object> call) {
601+
void testSnsSendOperationRequestWithBuilder(
602+
Function<SnsClient, Object> call,
603+
String operation,
604+
String method,
605+
String responseBody,
606+
String requestId) {
535607
SnsClientBuilder builder = SnsClient.builder();
536608
configureSdkClient(builder);
537609
SnsClient client =
@@ -541,28 +613,25 @@ void testSnsSendOperationRequestWithBuilder(Function<SnsClient, Object> call) {
541613
.credentialsProvider(CREDENTIALS_PROVIDER)
542614
.build();
543615

544-
String body =
545-
"<PublishResponse xmlns=\"https://sns.amazonaws.com/doc/2010-03-31/\">"
546-
+ " <PublishResult>"
547-
+ " <MessageId>567910cd-659e-55d4-8ccb-5aaf14679dc0</MessageId>"
548-
+ " </PublishResult>"
549-
+ " <ResponseMetadata>"
550-
+ " <RequestId>d74b8436-ae13-5ab4-a9ff-ce54dfea72a0</RequestId>"
551-
+ " </ResponseMetadata>"
552-
+ "</PublishResponse>";
553-
554-
server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, body));
616+
server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, responseBody));
555617
Object response = call.apply(client);
556618

557619
assertThat(response.getClass().getSimpleName())
558620
.satisfiesAnyOf(
559-
v -> assertThat(v).startsWith("Publish"),
560-
v -> assertThat(response).isInstanceOf(ResponseInputStream.class));
561-
clientAssertions("Sns", "Publish", "POST", response, "d74b8436-ae13-5ab4-a9ff-ce54dfea72a0");
621+
v -> assertThat(response).isInstanceOf(CreateTopicResponse.class),
622+
v -> assertThat(response).isInstanceOf(PublishResponse.class),
623+
v -> assertThat(response).isInstanceOf(SubscribeResponse.class));
624+
clientAssertions("Sns", operation, method, response, requestId);
562625
}
563626

564-
@Test
565-
void testSnsAsyncSendOperationRequestWithBuilder() {
627+
@ParameterizedTest
628+
@MethodSource("provideSnsArguments")
629+
void testSnsAsyncSendOperationRequestWithBuilder(
630+
Function<SnsClient, Object> call,
631+
String operation,
632+
String method,
633+
String responseBody,
634+
String requestId) {
566635
SnsAsyncClientBuilder builder = SnsAsyncClient.builder();
567636
configureSdkClient(builder);
568637
SnsAsyncClient client =
@@ -572,20 +641,15 @@ void testSnsAsyncSendOperationRequestWithBuilder() {
572641
.credentialsProvider(CREDENTIALS_PROVIDER)
573642
.build();
574643

575-
String body =
576-
"<PublishResponse xmlns=\"https://sns.amazonaws.com/doc/2010-03-31/\">"
577-
+ " <PublishResult>"
578-
+ " <MessageId>94f20ce6-13c5-43a0-9a9e-ca52d816e90b</MessageId>"
579-
+ " </PublishResult>"
580-
+ " <ResponseMetadata>"
581-
+ " <RequestId>f187a3c1-376f-11df-8963-01868b7c937a</RequestId>"
582-
+ " </ResponseMetadata>"
583-
+ "</PublishResponse>";
584-
585-
server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, body));
586-
Object response = client.publish(r -> r.message("hello").topicArn("somearn"));
644+
server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, responseBody));
645+
Object response = call.apply(wrapClient(SnsClient.class, SnsAsyncClient.class, client));
587646

588-
clientAssertions("Sns", "Publish", "POST", response, "f187a3c1-376f-11df-8963-01868b7c937a");
647+
assertThat(response.getClass().getSimpleName())
648+
.satisfiesAnyOf(
649+
v -> assertThat(response).isInstanceOf(CreateTopicResponse.class),
650+
v -> assertThat(response).isInstanceOf(PublishResponse.class),
651+
v -> assertThat(response).isInstanceOf(SubscribeResponse.class));
652+
clientAssertions("Sns", operation, method, response, requestId);
589653
}
590654

591655
@Test

0 commit comments

Comments
 (0)