|
@@ -7,9 +7,11 @@ package io.opentelemetry.instrumentation.awssdk.v2_2
|
|
|
|
|
|
|
|
|
import io.opentelemetry.semconv.SemanticAttributes
|
|
|
+import io.opentelemetry.testing.internal.armeria.common.HttpData
|
|
|
import io.opentelemetry.testing.internal.armeria.common.HttpResponse
|
|
|
import io.opentelemetry.testing.internal.armeria.common.HttpStatus
|
|
|
import io.opentelemetry.testing.internal.armeria.common.MediaType
|
|
|
+import io.opentelemetry.testing.internal.armeria.common.ResponseHeaders
|
|
|
import org.junit.jupiter.api.Assumptions
|
|
|
import software.amazon.awssdk.core.ResponseInputStream
|
|
|
import software.amazon.awssdk.core.async.AsyncResponseTransformer
|
|
@@ -35,6 +37,7 @@ import software.amazon.awssdk.services.sqs.model.CreateQueueRequest
|
|
|
import software.amazon.awssdk.services.sqs.model.SendMessageRequest
|
|
|
import spock.lang.Unroll
|
|
|
|
|
|
+import java.nio.charset.StandardCharsets
|
|
|
import java.time.Duration
|
|
|
import java.util.concurrent.Future
|
|
|
|
|
@@ -59,6 +62,22 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest {
|
|
|
// bucket name as label.
|
|
|
def clientUri = URI.create("http://localhost:${server.httpPort()}")
|
|
|
|
|
|
+ def s3ClientBuilder() {
|
|
|
+ def builder = S3Client.builder()
|
|
|
+ if (Boolean.getBoolean("testLatestDeps")) {
|
|
|
+ builder.forcePathStyle(true)
|
|
|
+ }
|
|
|
+ return builder
|
|
|
+ }
|
|
|
+
|
|
|
+ def s3AsyncClientBuilder() {
|
|
|
+ def builder = S3AsyncClient.builder()
|
|
|
+ if (Boolean.getBoolean("testLatestDeps")) {
|
|
|
+ builder.forcePathStyle(true)
|
|
|
+ }
|
|
|
+ return builder
|
|
|
+ }
|
|
|
+
|
|
|
def "send #operation request with builder #builder.class.getName() mocked response"() {
|
|
|
assumeSupportedConfig(service, operation)
|
|
|
|
|
@@ -69,9 +88,14 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest {
|
|
|
.region(Region.AP_NORTHEAST_1)
|
|
|
.credentialsProvider(CREDENTIALS_PROVIDER)
|
|
|
.build()
|
|
|
- server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, body))
|
|
|
- def response = call.call(client)
|
|
|
|
|
|
+ if (body instanceof Closure) {
|
|
|
+ server.enqueue(body.call())
|
|
|
+ } else {
|
|
|
+ server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, body))
|
|
|
+ }
|
|
|
+
|
|
|
+ def response = call.call(client)
|
|
|
if (response instanceof Future) {
|
|
|
response = response.get()
|
|
|
}
|
|
@@ -131,25 +155,57 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest {
|
|
|
|
|
|
where:
|
|
|
service | operation | method | requestId | builder | call | body
|
|
|
- "S3" | "CreateBucket" | "PUT" | "UNKNOWN" | S3Client.builder() | { c -> c.createBucket(CreateBucketRequest.builder().bucket("somebucket").build()) } | ""
|
|
|
- "S3" | "GetObject" | "GET" | "UNKNOWN" | S3Client.builder() | { c -> c.getObject(GetObjectRequest.builder().bucket("somebucket").key("somekey").build()) } | ""
|
|
|
+ "S3" | "CreateBucket" | "PUT" | "UNKNOWN" | s3ClientBuilder() | { c -> c.createBucket(CreateBucketRequest.builder().bucket("somebucket").build()) } | ""
|
|
|
+ "S3" | "GetObject" | "GET" | "UNKNOWN" | s3ClientBuilder() | { c -> c.getObject(GetObjectRequest.builder().bucket("somebucket").key("somekey").build()) } | ""
|
|
|
"Kinesis" | "DeleteStream" | "POST" | "UNKNOWN" | KinesisClient.builder() | { c -> c.deleteStream(DeleteStreamRequest.builder().streamName("somestream").build()) } | ""
|
|
|
- "Sqs" | "CreateQueue" | "POST" | "7a62c49f-347e-4fc4-9331-6e8e7a96aa73" | SqsClient.builder() | { c -> c.createQueue(CreateQueueRequest.builder().queueName("somequeue").build()) } | """
|
|
|
- <CreateQueueResponse>
|
|
|
- <CreateQueueResult><QueueUrl>https://queue.amazonaws.com/123456789012/MyQueue</QueueUrl></CreateQueueResult>
|
|
|
- <ResponseMetadata><RequestId>7a62c49f-347e-4fc4-9331-6e8e7a96aa73</RequestId></ResponseMetadata>
|
|
|
- </CreateQueueResponse>
|
|
|
- """
|
|
|
- "Sqs" | "SendMessage" | "POST" | "27daac76-34dd-47df-bd01-1f6e873584a0" | SqsClient.builder() | { c -> c.sendMessage(SendMessageRequest.builder().queueUrl(QUEUE_URL).messageBody("").build()) } | """
|
|
|
- <SendMessageResponse>
|
|
|
- <SendMessageResult>
|
|
|
- <MD5OfMessageBody>d41d8cd98f00b204e9800998ecf8427e</MD5OfMessageBody>
|
|
|
- <MD5OfMessageAttributes>3ae8f24a165a8cedc005670c81a27295</MD5OfMessageAttributes>
|
|
|
- <MessageId>5fea7756-0ea4-451a-a703-a558b933e274</MessageId>
|
|
|
- </SendMessageResult>
|
|
|
- <ResponseMetadata><RequestId>27daac76-34dd-47df-bd01-1f6e873584a0</RequestId></ResponseMetadata>
|
|
|
- </SendMessageResponse>
|
|
|
- """
|
|
|
+ "Sqs" | "CreateQueue" | "POST" | "7a62c49f-347e-4fc4-9331-6e8e7a96aa73" | SqsClient.builder() | { c -> c.createQueue(CreateQueueRequest.builder().queueName("somequeue").build()) } | {
|
|
|
+ if (!Boolean.getBoolean("testLatestDeps")) {
|
|
|
+ def content = """
|
|
|
+ <CreateQueueResponse>
|
|
|
+ <CreateQueueResult><QueueUrl>https://queue.amazonaws.com/123456789012/MyQueue</QueueUrl></CreateQueueResult>
|
|
|
+ <ResponseMetadata><RequestId>7a62c49f-347e-4fc4-9331-6e8e7a96aa73</RequestId></ResponseMetadata>
|
|
|
+ </CreateQueueResponse>
|
|
|
+ """
|
|
|
+ return HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, content)
|
|
|
+ }
|
|
|
+ def content = """
|
|
|
+ {
|
|
|
+ "QueueUrl":"https://queue.amazonaws.com/123456789012/MyQueue"
|
|
|
+ }
|
|
|
+ """
|
|
|
+ ResponseHeaders headers = ResponseHeaders.builder(HttpStatus.OK)
|
|
|
+ .contentType(MediaType.PLAIN_TEXT_UTF_8)
|
|
|
+ .add("x-amzn-RequestId", "7a62c49f-347e-4fc4-9331-6e8e7a96aa73")
|
|
|
+ .build()
|
|
|
+ return HttpResponse.of(headers, HttpData.of(StandardCharsets.UTF_8, content))
|
|
|
+ }
|
|
|
+ "Sqs" | "SendMessage" | "POST" | "27daac76-34dd-47df-bd01-1f6e873584a0" | SqsClient.builder() | { c -> c.sendMessage(SendMessageRequest.builder().queueUrl(QUEUE_URL).messageBody("").build()) } | {
|
|
|
+ if (!Boolean.getBoolean("testLatestDeps")) {
|
|
|
+ def content = """
|
|
|
+ <SendMessageResponse>
|
|
|
+ <SendMessageResult>
|
|
|
+ <MD5OfMessageBody>d41d8cd98f00b204e9800998ecf8427e</MD5OfMessageBody>
|
|
|
+ <MD5OfMessageAttributes>3ae8f24a165a8cedc005670c81a27295</MD5OfMessageAttributes>
|
|
|
+ <MessageId>5fea7756-0ea4-451a-a703-a558b933e274</MessageId>
|
|
|
+ </SendMessageResult>
|
|
|
+ <ResponseMetadata><RequestId>27daac76-34dd-47df-bd01-1f6e873584a0</RequestId></ResponseMetadata>
|
|
|
+ </SendMessageResponse>
|
|
|
+ """
|
|
|
+ return HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, content)
|
|
|
+ }
|
|
|
+ def content = """
|
|
|
+ {
|
|
|
+ "MD5OfMessageBody":"d41d8cd98f00b204e9800998ecf8427e",
|
|
|
+ "MD5OfMessageAttributes":"3ae8f24a165a8cedc005670c81a27295",
|
|
|
+ "MessageId":"5fea7756-0ea4-451a-a703-a558b933e274"
|
|
|
+ }
|
|
|
+ """
|
|
|
+ ResponseHeaders headers = ResponseHeaders.builder(HttpStatus.OK)
|
|
|
+ .contentType(MediaType.PLAIN_TEXT_UTF_8)
|
|
|
+ .add("x-amzn-RequestId", "27daac76-34dd-47df-bd01-1f6e873584a0")
|
|
|
+ .build()
|
|
|
+ return HttpResponse.of(headers, HttpData.of(StandardCharsets.UTF_8, content))
|
|
|
+ }
|
|
|
"Ec2" | "AllocateAddress" | "POST" | "59dbff89-35bd-4eac-99ed-be587EXAMPLE" | Ec2Client.builder() | { c -> c.allocateAddress() } | """
|
|
|
<AllocateAddressResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
|
|
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
|
@@ -173,9 +229,14 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest {
|
|
|
.region(Region.AP_NORTHEAST_1)
|
|
|
.credentialsProvider(CREDENTIALS_PROVIDER)
|
|
|
.build()
|
|
|
- server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, body))
|
|
|
- def response = call.call(client)
|
|
|
|
|
|
+ if (body instanceof Closure) {
|
|
|
+ server.enqueue(body.call())
|
|
|
+ } else {
|
|
|
+ server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, body))
|
|
|
+ }
|
|
|
+
|
|
|
+ def response = call.call(client)
|
|
|
if (response instanceof Future) {
|
|
|
response = response.get()
|
|
|
}
|
|
@@ -199,7 +260,7 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest {
|
|
|
"$SemanticAttributes.HTTP_URL" { it.startsWith("http://somebucket.localhost:${server.httpPort()}") || it.startsWith("http://localhost:${server.httpPort()}") }
|
|
|
} else {
|
|
|
"$SemanticAttributes.NET_PEER_NAME" "localhost"
|
|
|
- "$SemanticAttributes.HTTP_URL" "http://localhost:${server.httpPort()}"
|
|
|
+ "$SemanticAttributes.HTTP_URL" { it == "http://localhost:${server.httpPort()}" || it == "http://localhost:${server.httpPort()}/" }
|
|
|
}
|
|
|
"$SemanticAttributes.NET_PEER_PORT" server.httpPort()
|
|
|
"$SemanticAttributes.HTTP_METHOD" "$method"
|
|
@@ -245,26 +306,58 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest {
|
|
|
|
|
|
where:
|
|
|
service | operation | method | requestId | builder | call | body
|
|
|
- "S3" | "CreateBucket" | "PUT" | "UNKNOWN" | S3AsyncClient.builder() | { c -> c.createBucket(CreateBucketRequest.builder().bucket("somebucket").build()) } | ""
|
|
|
- "S3" | "GetObject" | "GET" | "UNKNOWN" | S3AsyncClient.builder() | { c -> c.getObject(GetObjectRequest.builder().bucket("somebucket").key("somekey").build(), AsyncResponseTransformer.toBytes()) } | "1234567890"
|
|
|
+ "S3" | "CreateBucket" | "PUT" | "UNKNOWN" | s3AsyncClientBuilder() | { c -> c.createBucket(CreateBucketRequest.builder().bucket("somebucket").build()) } | ""
|
|
|
+ "S3" | "GetObject" | "GET" | "UNKNOWN" | s3AsyncClientBuilder() | { c -> c.getObject(GetObjectRequest.builder().bucket("somebucket").key("somekey").build(), AsyncResponseTransformer.toBytes()) } | "1234567890"
|
|
|
// Kinesis seems to expect an http2 response which is incompatible with our test server.
|
|
|
// "Kinesis" | "DeleteStream" | "POST" | "/" | "UNKNOWN" | KinesisAsyncClient.builder() | { c -> c.deleteStream(DeleteStreamRequest.builder().streamName("somestream").build()) } | ""
|
|
|
- "Sqs" | "CreateQueue" | "POST" | "7a62c49f-347e-4fc4-9331-6e8e7a96aa73" | SqsAsyncClient.builder() | { c -> c.createQueue(CreateQueueRequest.builder().queueName("somequeue").build()) } | """
|
|
|
- <CreateQueueResponse>
|
|
|
- <CreateQueueResult><QueueUrl>https://queue.amazonaws.com/123456789012/MyQueue</QueueUrl></CreateQueueResult>
|
|
|
- <ResponseMetadata><RequestId>7a62c49f-347e-4fc4-9331-6e8e7a96aa73</RequestId></ResponseMetadata>
|
|
|
- </CreateQueueResponse>
|
|
|
- """
|
|
|
- "Sqs" | "SendMessage" | "POST" | "27daac76-34dd-47df-bd01-1f6e873584a0" | SqsAsyncClient.builder() | { c -> c.sendMessage(SendMessageRequest.builder().queueUrl(QUEUE_URL).messageBody("").build()) } | """
|
|
|
- <SendMessageResponse>
|
|
|
- <SendMessageResult>
|
|
|
- <MD5OfMessageBody>d41d8cd98f00b204e9800998ecf8427e</MD5OfMessageBody>
|
|
|
- <MD5OfMessageAttributes>3ae8f24a165a8cedc005670c81a27295</MD5OfMessageAttributes>
|
|
|
- <MessageId>5fea7756-0ea4-451a-a703-a558b933e274</MessageId>
|
|
|
- </SendMessageResult>
|
|
|
- <ResponseMetadata><RequestId>27daac76-34dd-47df-bd01-1f6e873584a0</RequestId></ResponseMetadata>
|
|
|
- </SendMessageResponse>
|
|
|
- """
|
|
|
+ "Sqs" | "CreateQueue" | "POST" | "7a62c49f-347e-4fc4-9331-6e8e7a96aa73" | SqsAsyncClient.builder() | { c -> c.createQueue(CreateQueueRequest.builder().queueName("somequeue").build()) } | {
|
|
|
+ if (!Boolean.getBoolean("testLatestDeps")) {
|
|
|
+ def content = """
|
|
|
+ <CreateQueueResponse>
|
|
|
+ <CreateQueueResult><QueueUrl>https://queue.amazonaws.com/123456789012/MyQueue</QueueUrl></CreateQueueResult>
|
|
|
+ <ResponseMetadata><RequestId>7a62c49f-347e-4fc4-9331-6e8e7a96aa73</RequestId></ResponseMetadata>
|
|
|
+ </CreateQueueResponse>
|
|
|
+ """
|
|
|
+ return HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, content)
|
|
|
+ }
|
|
|
+ def content = """
|
|
|
+ {
|
|
|
+ "QueueUrl":"https://queue.amazonaws.com/123456789012/MyQueue"
|
|
|
+ }
|
|
|
+ """
|
|
|
+ ResponseHeaders headers = ResponseHeaders.builder(HttpStatus.OK)
|
|
|
+ .contentType(MediaType.PLAIN_TEXT_UTF_8)
|
|
|
+ .add("x-amzn-RequestId", "7a62c49f-347e-4fc4-9331-6e8e7a96aa73")
|
|
|
+ .build()
|
|
|
+ return HttpResponse.of(headers, HttpData.of(StandardCharsets.UTF_8, content))
|
|
|
+ }
|
|
|
+ "Sqs" | "SendMessage" | "POST" | "27daac76-34dd-47df-bd01-1f6e873584a0" | SqsAsyncClient.builder() | { c -> c.sendMessage(SendMessageRequest.builder().queueUrl(QUEUE_URL).messageBody("").build()) } | {
|
|
|
+ if (!Boolean.getBoolean("testLatestDeps")) {
|
|
|
+ def content = """
|
|
|
+ <SendMessageResponse>
|
|
|
+ <SendMessageResult>
|
|
|
+ <MD5OfMessageBody>d41d8cd98f00b204e9800998ecf8427e</MD5OfMessageBody>
|
|
|
+ <MD5OfMessageAttributes>3ae8f24a165a8cedc005670c81a27295</MD5OfMessageAttributes>
|
|
|
+ <MessageId>5fea7756-0ea4-451a-a703-a558b933e274</MessageId>
|
|
|
+ </SendMessageResult>
|
|
|
+ <ResponseMetadata><RequestId>27daac76-34dd-47df-bd01-1f6e873584a0</RequestId></ResponseMetadata>
|
|
|
+ </SendMessageResponse>
|
|
|
+ """
|
|
|
+ return HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, content)
|
|
|
+ }
|
|
|
+ def content = """
|
|
|
+ {
|
|
|
+ "MD5OfMessageBody":"d41d8cd98f00b204e9800998ecf8427e",
|
|
|
+ "MD5OfMessageAttributes":"3ae8f24a165a8cedc005670c81a27295",
|
|
|
+ "MessageId":"5fea7756-0ea4-451a-a703-a558b933e274"
|
|
|
+ }
|
|
|
+ """
|
|
|
+ ResponseHeaders headers = ResponseHeaders.builder(HttpStatus.OK)
|
|
|
+ .contentType(MediaType.PLAIN_TEXT_UTF_8)
|
|
|
+ .add("x-amzn-RequestId", "27daac76-34dd-47df-bd01-1f6e873584a0")
|
|
|
+ .build()
|
|
|
+ return HttpResponse.of(headers, HttpData.of(StandardCharsets.UTF_8, content))
|
|
|
+ }
|
|
|
"Ec2" | "AllocateAddress" | "POST" | "59dbff89-35bd-4eac-99ed-be587EXAMPLE" | Ec2AsyncClient.builder() | { c -> c.allocateAddress() } | """
|
|
|
<AllocateAddressResponse xmlns="http://ec2.amazonaws.com/doc/2016-11-15/">
|
|
|
<requestId>59dbff89-35bd-4eac-99ed-be587EXAMPLE</requestId>
|
|
@@ -297,7 +390,7 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest {
|
|
|
// One retry so two requests.
|
|
|
server.enqueue(HttpResponse.delayed(HttpResponse.of(HttpStatus.OK), Duration.ofMillis(5000)))
|
|
|
server.enqueue(HttpResponse.delayed(HttpResponse.of(HttpStatus.OK), Duration.ofMillis(5000)))
|
|
|
- def client = S3Client.builder()
|
|
|
+ def builder = S3Client.builder()
|
|
|
.overrideConfiguration(createOverrideConfigurationBuilder()
|
|
|
.retryPolicy(RetryPolicy.builder().numRetries(1).build())
|
|
|
.build())
|
|
@@ -305,7 +398,12 @@ abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest {
|
|
|
.region(Region.AP_NORTHEAST_1)
|
|
|
.credentialsProvider(CREDENTIALS_PROVIDER)
|
|
|
.httpClientBuilder(ApacheHttpClient.builder().socketTimeout(Duration.ofMillis(50)))
|
|
|
- .build()
|
|
|
+
|
|
|
+ if (Boolean.getBoolean("testLatestDeps")) {
|
|
|
+ builder.forcePathStyle(true)
|
|
|
+ }
|
|
|
+
|
|
|
+ def client = builder.build()
|
|
|
|
|
|
when:
|
|
|
client.getObject(GetObjectRequest.builder().bucket("somebucket").key("somekey").build())
|