diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsSdkClientDecorator.java b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsSdkClientDecorator.java
index c4c55c06bee..fc7456a397c 100644
--- a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsSdkClientDecorator.java
+++ b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/main/java/datadog/trace/instrumentation/aws/v2/AwsSdkClientDecorator.java
@@ -153,6 +153,10 @@ public void onSdkRequest(
url -> {
span.setTag(InstrumentationTags.AWS_QUEUE_URL, url);
setPeerService(span, InstrumentationTags.AWS_QUEUE_URL, url);
+ int lastSlash = url.lastIndexOf('/');
+ if (lastSlash >= 0 && lastSlash < url.length() - 1) {
+ setQueueName(span, url.substring(lastSlash + 1));
+ }
});
request.getValueForField("QueueName", String.class).ifPresent(name -> setQueueName(span, name));
diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/test/groovy/Aws2ClientTest.groovy b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/test/groovy/Aws2ClientTest.groovy
index 98d3c59f984..c6ff57e17c9 100644
--- a/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/test/groovy/Aws2ClientTest.groovy
+++ b/dd-java-agent/instrumentation/aws-java/aws-java-sdk-2.2/src/test/groovy/Aws2ClientTest.groovy
@@ -41,6 +41,8 @@ import software.amazon.awssdk.services.sns.model.PublishRequest
import software.amazon.awssdk.services.sqs.SqsAsyncClient
import software.amazon.awssdk.services.sqs.SqsClient
import software.amazon.awssdk.services.sqs.model.CreateQueueRequest
+import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequest
+import software.amazon.awssdk.services.sqs.model.SendMessageBatchRequestEntry
import software.amazon.awssdk.services.sqs.model.SendMessageRequest
import spock.lang.AutoCleanup
import spock.lang.Shared
@@ -153,9 +155,11 @@ abstract class Aws2ClientTest extends VersionedNamingTestBase {
"queuename" "somequeue"
peerServiceFrom("aws.queue.name")
checkPeerService = true
- } else if (service == "Sqs" && operation == "SendMessage") {
- "aws.queue.url" "someurl"
- peerServiceFrom("aws.queue.url")
+ } else if (service == "Sqs" && (operation == "SendMessage" || operation == "SendMessageBatch")) {
+ "aws.queue.url" "https://sqs.us-east-1.amazonaws.com/123456789012/somequeue"
+ "aws.queue.name" "somequeue"
+ "queuename" "somequeue"
+ peerServiceFrom("aws.queue.name")
checkPeerService = true
} else if (service == "Sns" && operation == "Publish") {
"aws.topic.name" "some-topic"
@@ -174,7 +178,7 @@ abstract class Aws2ClientTest extends VersionedNamingTestBase {
checkPeerService = true
}
urlTags("${server.address}${path}", ExpectedQueryParams.getExpectedQueryParams(operation))
- if (operation == "SendMessage") {
+ if (operation == "SendMessage" || operation == "SendMessageBatch") {
// this is a corner case. The issues is that the aws integration should not set the service name
// but it's doing it.
serviceNameSource "java-aws-sdk"
@@ -202,7 +206,7 @@ abstract class Aws2ClientTest extends VersionedNamingTestBase {
7a62c49f-347e-4fc4-9331-6e8e7a96aa73
"""
- "Sqs" | "SendMessage" | "POST" | "/" | "27daac76-34dd-47df-bd01-1f6e873584a0" | SqsClient.builder() | { c -> c.sendMessage(SendMessageRequest.builder().queueUrl("someurl").messageBody("").build()) } | """
+ "Sqs" | "SendMessage" | "POST" | "/" | "27daac76-34dd-47df-bd01-1f6e873584a0" | SqsClient.builder() | { c -> c.sendMessage(SendMessageRequest.builder().queueUrl("https://sqs.us-east-1.amazonaws.com/123456789012/somequeue").messageBody("").build()) } | """
d41d8cd98f00b204e9800998ecf8427e
@@ -212,6 +216,38 @@ abstract class Aws2ClientTest extends VersionedNamingTestBase {
27daac76-34dd-47df-bd01-1f6e873584a0
"""
+ "Sqs" | "SendMessageBatch" | "POST" | "/" | "27daac76-34dd-47df-bd01-1f6e873584a1" | SqsClient.builder() | { c -> c.sendMessageBatch(SendMessageBatchRequest.builder().queueUrl("https://sqs.us-east-1.amazonaws.com/123456789012/somequeue").entries(SendMessageBatchRequestEntry.builder().id("1").messageBody("body1").build(), SendMessageBatchRequestEntry.builder().id("2").messageBody("body2").build(), SendMessageBatchRequestEntry.builder().id("3").messageBody("body3").build(), SendMessageBatchRequestEntry.builder().id("4").messageBody("body4").build(), SendMessageBatchRequestEntry.builder().id("5").messageBody("body5").build()).build()) } | """
+
+
+
+ 1
+ d6ed8ba2adae5a938c5a3757bcccf4dd
+ 5fea7756-0ea4-451a-a703-a558b933e274
+
+
+ 2
+ 76af63c5bd77b2a3a2cfcbd52645fa38
+ 5fea7756-0ea4-451a-a703-a558b933e275
+
+
+ 3
+ 5525786dab1a6e4b36a0b49fe1090875
+ 5fea7756-0ea4-451a-a703-a558b933e276
+
+
+ 4
+ 0039fc0a2fa335c82bfd08f6a068ee1c
+ 5fea7756-0ea4-451a-a703-a558b933e277
+
+
+ 5
+ 6cc1cbeba9aa648e1c2f668712b72ddf
+ 5fea7756-0ea4-451a-a703-a558b933e278
+
+
+ 27daac76-34dd-47df-bd01-1f6e873584a1
+
+ """
"Sns" | "Publish" | "POST" | "/" | "d74b8436-ae13-5ab4-a9ff-ce54dfea72a0" | SnsClient.builder() | { c -> c.publish(PublishRequest.builder().topicArn("arn:aws:sns::123:some-topic").message("").build()) } | """
@@ -293,9 +329,11 @@ abstract class Aws2ClientTest extends VersionedNamingTestBase {
"queuename" "somequeue"
peerServiceFrom("aws.queue.name")
checkPeerService = true
- } else if (service == "Sqs" && operation == "SendMessage") {
- "aws.queue.url" "someurl"
- peerServiceFrom("aws.queue.url")
+ } else if (service == "Sqs" && (operation == "SendMessage" || operation == "SendMessageBatch")) {
+ "aws.queue.url" "https://sqs.us-east-1.amazonaws.com/123456789012/somequeue"
+ "aws.queue.name" "somequeue"
+ "queuename" "somequeue"
+ peerServiceFrom("aws.queue.name")
checkPeerService = true
} else if (service == "Sns" && operation == "Publish") {
"aws.topic.name" "some-topic"
@@ -314,7 +352,7 @@ abstract class Aws2ClientTest extends VersionedNamingTestBase {
checkPeerService = true
}
urlTags("${server.address}${path}", ExpectedQueryParams.getExpectedQueryParams(operation))
- if (operation == "SendMessage") {
+ if (operation == "SendMessage" || operation == "SendMessageBatch") {
// this is a corner case. The issues is that the aws integration should not set the service name
// but it's doing it.
serviceNameSource "java-aws-sdk"
@@ -342,7 +380,7 @@ abstract class Aws2ClientTest extends VersionedNamingTestBase {
7a62c49f-347e-4fc4-9331-6e8e7a96aa73
"""
- "Sqs" | "SendMessage" | "POST" | "/" | "27daac76-34dd-47df-bd01-1f6e873584a0" | SqsAsyncClient.builder() | { c -> c.sendMessage(SendMessageRequest.builder().queueUrl("someurl").messageBody("").build()) } | """
+ "Sqs" | "SendMessage" | "POST" | "/" | "27daac76-34dd-47df-bd01-1f6e873584a0" | SqsAsyncClient.builder() | { c -> c.sendMessage(SendMessageRequest.builder().queueUrl("https://sqs.us-east-1.amazonaws.com/123456789012/somequeue").messageBody("").build()) } | """
d41d8cd98f00b204e9800998ecf8427e
@@ -352,6 +390,38 @@ abstract class Aws2ClientTest extends VersionedNamingTestBase {
27daac76-34dd-47df-bd01-1f6e873584a0
"""
+ "Sqs" | "SendMessageBatch" | "POST" | "/" | "27daac76-34dd-47df-bd01-1f6e873584a1" | SqsAsyncClient.builder() | { c -> c.sendMessageBatch(SendMessageBatchRequest.builder().queueUrl("https://sqs.us-east-1.amazonaws.com/123456789012/somequeue").entries(SendMessageBatchRequestEntry.builder().id("1").messageBody("body1").build(), SendMessageBatchRequestEntry.builder().id("2").messageBody("body2").build(), SendMessageBatchRequestEntry.builder().id("3").messageBody("body3").build(), SendMessageBatchRequestEntry.builder().id("4").messageBody("body4").build(), SendMessageBatchRequestEntry.builder().id("5").messageBody("body5").build()).build()) } | """
+
+
+
+ 1
+ d6ed8ba2adae5a938c5a3757bcccf4dd
+ 5fea7756-0ea4-451a-a703-a558b933e274
+
+
+ 2
+ 76af63c5bd77b2a3a2cfcbd52645fa38
+ 5fea7756-0ea4-451a-a703-a558b933e275
+
+
+ 3
+ 5525786dab1a6e4b36a0b49fe1090875
+ 5fea7756-0ea4-451a-a703-a558b933e276
+
+
+ 4
+ 0039fc0a2fa335c82bfd08f6a068ee1c
+ 5fea7756-0ea4-451a-a703-a558b933e277
+
+
+ 5
+ 6cc1cbeba9aa648e1c2f668712b72ddf
+ 5fea7756-0ea4-451a-a703-a558b933e278
+
+
+ 27daac76-34dd-47df-bd01-1f6e873584a1
+
+ """
"Sns" | "Publish" | "POST" | "/" | "d74b8436-ae13-5ab4-a9ff-ce54dfea72a0" | SnsAsyncClient.builder() | { c -> c.publish(PublishRequest.builder().topicArn("arn:aws:sns::123:some-topic").message("").build()) } | """
@@ -478,7 +548,7 @@ abstract class Aws2ClientTest extends VersionedNamingTestBase {
measured true
parent()
tags {
- if (operation == "SendMessage") {
+ if (operation == "SendMessage" || operation == "SendMessageBatch") {
// this is a corner case. The issues is that the aws integration should not set the service name
// but it's doing it.
serviceNameSource "java-aws-sdk"
@@ -511,7 +581,9 @@ abstract class Aws2ClientTest extends VersionedNamingTestBase {
"aws.queue.name" "test-queue"
"queuename" "test-queue"
} else if (service == "Sqs" && operation == "SendMessage") {
- "aws.queue.url" "test-queue-url"
+ "aws.queue.url" "https://sqs.us-east-1.amazonaws.com/123456789012/test-queue"
+ "aws.queue.name" "test-queue"
+ "queuename" "test-queue"
} else if (service == "Sns" && operation == "Publish") {
"aws.topic.name" "test-topic"
"topicname" "test-topic"
@@ -537,7 +609,7 @@ abstract class Aws2ClientTest extends VersionedNamingTestBase {
service | operation | method | path | builder | call | body | requestId
"S3" | "CreateBucket" | "PUT" | "/test-bucket" | S3Client.builder() | { c -> c.createBucket(CreateBucketRequest.builder().bucket("test-bucket").build()) } | "" | "UNKNOWN"
"Sqs" | "CreateQueue" | "POST" | "/" | SqsClient.builder() | { c -> c.createQueue(CreateQueueRequest.builder().queueName("test-queue").build()) } | """https://queue.amazonaws.com/123456789012/test-queuetest-request-id""" | "test-request-id"
- "Sqs" | "SendMessage" | "POST" | "/" | SqsClient.builder() | { c -> c.sendMessage(SendMessageRequest.builder().queueUrl("test-queue-url").messageBody("test").build()) } | """098f6bcd4621d373cade4e832627b4f6test-msg-idtest-request-id""" | "test-request-id"
+ "Sqs" | "SendMessage" | "POST" | "/" | SqsClient.builder() | { c -> c.sendMessage(SendMessageRequest.builder().queueUrl("https://sqs.us-east-1.amazonaws.com/123456789012/test-queue").messageBody("test").build()) } | """098f6bcd4621d373cade4e832627b4f6test-msg-idtest-request-id""" | "test-request-id"
"Sns" | "Publish" | "POST" | "/" | SnsClient.builder() | { c -> c.publish(PublishRequest.builder().topicArn("arn:aws:sns::123:test-topic").message("test").build()) } | """test-msg-idtest-request-id""" | "test-request-id"
"DynamoDb" | "CreateTable" | "POST" | "/" | DynamoDbClient.builder() | { c -> c.createTable(CreateTableRequest.builder().tableName("test-table").build()) } | "" | "UNKNOWN"
"Kinesis" | "DeleteStream" | "POST" | "/" | KinesisClient.builder() | { c -> c.deleteStream(DeleteStreamRequest.builder().streamName("test-stream").build()) } | "" | "UNKNOWN"
@@ -556,7 +628,7 @@ class Aws2ClientV0ForkedTest extends Aws2ClientTest {
if ("Sns" == awsService && "Publish" == awsOperation) {
return "sns"
}
- if ("Sqs" == awsService && "SendMessage" == awsOperation) {
+ if ("Sqs" == awsService && ("SendMessage" == awsOperation || "SendMessageBatch" == awsOperation)) {
return "sqs"
}
return "java-aws-sdk"
@@ -572,7 +644,7 @@ class Aws2ClientV1ForkedTest extends Aws2ClientTest {
@Override
String expectedOperation(String awsService, String awsOperation) {
- if (awsService == "Sqs" && awsOperation == "SendMessage") {
+ if (awsService == "Sqs" && (awsOperation == "SendMessage" || awsOperation == "SendMessageBatch")) {
return "aws.sqs.send"
}
if (awsService == "Sns" && awsOperation == "Publish") {
diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsDecorator.java b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsDecorator.java
index 661a7fdccdd..a371be3a617 100644
--- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsDecorator.java
+++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/main/java/datadog/trace/instrumentation/aws/v2/sqs/SqsDecorator.java
@@ -84,11 +84,23 @@ public void onConsume(final AgentSpan span, final String queueUrl, String reques
span.setTag("aws.agent", COMPONENT_NAME);
span.setTag("aws.queue.url", queueUrl);
span.setTag("aws.requestId", requestId);
+ setQueueNameFromUrl(span, queueUrl);
}
public void onTimeInQueue(final AgentSpan span, final String queueUrl, String requestId) {
span.setResourceName(SQS_DELIVER);
span.setTag("aws.queue.url", queueUrl);
span.setTag("aws.requestId", requestId);
+ setQueueNameFromUrl(span, queueUrl);
+ }
+
+ private static void setQueueNameFromUrl(final AgentSpan span, final String queueUrl) {
+ if (queueUrl == null) return;
+ int lastSlash = queueUrl.lastIndexOf('/');
+ if (lastSlash >= 0 && lastSlash < queueUrl.length() - 1) {
+ String queueName = queueUrl.substring(lastSlash + 1);
+ span.setTag("aws.queue.name", queueName);
+ span.setTag("queuename", queueName);
+ }
}
}
diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/groovy/LegacySqsClientForkedTest.groovy b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/groovy/LegacySqsClientForkedTest.groovy
index 45733f7ac85..fc072fd75c0 100644
--- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/groovy/LegacySqsClientForkedTest.groovy
+++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/groovy/LegacySqsClientForkedTest.groovy
@@ -97,6 +97,8 @@ class LegacySqsClientForkedTest extends InstrumentationSpecification {
"aws.operation" "SendMessage"
"aws.agent" "java-aws-sdk"
"aws.queue.url" "http://localhost:${address.port}/000000000000/somequeue"
+ "aws.queue.name" "somequeue"
+ "queuename" "somequeue"
"aws.requestId" { it.trim() == "00000000-0000-0000-0000-000000000000" } // the test server seem messing with request id and insert \n
urlTags("http://localhost:${address.port}/", ExpectedQueryParams.getExpectedQueryParams("SendMessage"))
defaultTags()
@@ -143,6 +145,8 @@ class LegacySqsClientForkedTest extends InstrumentationSpecification {
"aws.operation" "ReceiveMessage"
"aws.agent" "java-aws-sdk"
"aws.queue.url" "http://localhost:${address.port}/000000000000/somequeue"
+ "aws.queue.name" "somequeue"
+ "queuename" "somequeue"
"aws.requestId" { it.trim() == "00000000-0000-0000-0000-000000000000" } // the test server seem messing with request id and insert \n
urlTags("http://localhost:${address.port}/", ExpectedQueryParams.getExpectedQueryParams(("ReceiveMessage")))
defaultTags()
@@ -225,6 +229,8 @@ class LegacySqsClientForkedTest extends InstrumentationSpecification {
"aws.operation" "SendMessage"
"aws.agent" "java-aws-sdk"
"aws.queue.url" "http://localhost:${address.port}/000000000000/somequeue"
+ "aws.queue.name" "somequeue"
+ "queuename" "somequeue"
"aws.requestId" { it.trim() == "00000000-0000-0000-0000-000000000000" } // the test server seem messing with request id and insert \n
urlTags("http://localhost:${address.port}/", ExpectedQueryParams.getExpectedQueryParams("SendMessage"))
defaultTags()
@@ -288,6 +294,8 @@ class LegacySqsClientForkedTest extends InstrumentationSpecification {
"aws.operation" "DeleteMessage"
"aws.agent" "java-aws-sdk"
"aws.queue.url" "http://localhost:${address.port}/000000000000/somequeue"
+ "aws.queue.name" "somequeue"
+ "queuename" "somequeue"
"aws.requestId" { it.trim() == "00000000-0000-0000-0000-000000000000" } // the test server seem messing with request id and insert \n
urlTags("http://localhost:${address.port}/", ExpectedQueryParams.getExpectedQueryParams("DeleteMessage"))
defaultTags()
@@ -333,6 +341,8 @@ class LegacySqsClientForkedTest extends InstrumentationSpecification {
"aws.operation" "ReceiveMessage"
"aws.agent" "java-aws-sdk"
"aws.queue.url" "http://localhost:${address.port}/000000000000/somequeue"
+ "aws.queue.name" "somequeue"
+ "queuename" "somequeue"
"aws.requestId" { it.trim() == "00000000-0000-0000-0000-000000000000" } // the test server seem messing with request id and insert \n
urlTags("http://localhost:${address.port}/", ExpectedQueryParams.getExpectedQueryParams("ReceiveMessage"))
defaultTags()
diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/groovy/TimeInQueueForkedTest.groovy b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/groovy/TimeInQueueForkedTest.groovy
index 10adbb3b2bf..5e0fe34cf51 100644
--- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/groovy/TimeInQueueForkedTest.groovy
+++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/groovy/TimeInQueueForkedTest.groovy
@@ -306,6 +306,8 @@ class TimeInQueueForkedTest extends InstrumentationSpecification {
"aws.operation" "SendMessageBatch"
"aws.agent" "java-aws-sdk"
"aws.queue.url" "http://localhost:${address.port}/000000000000/somequeue"
+ "aws.queue.name" "somequeue"
+ "queuename" "somequeue"
"aws.requestId" { it.trim() == "00000000-0000-0000-0000-000000000000" } // the test server seem messing with request id and insert \n
urlTags("http://localhost:${address.port}/", ExpectedQueryParams.getExpectedQueryParams("SendMessageBatch"))
serviceNameSource("java-aws-sdk")
@@ -331,6 +333,8 @@ class TimeInQueueForkedTest extends InstrumentationSpecification {
"aws.operation" "ReceiveMessage"
"aws.agent" "java-aws-sdk"
"aws.queue.url" "http://localhost:${address.port}/000000000000/somequeue"
+ "aws.queue.name" "somequeue"
+ "queuename" "somequeue"
"aws.requestId" { it.trim() == "00000000-0000-0000-0000-000000000000" } // the test server seem messing with request id and insert \n
// when using time in queue, the instrumentation always set the service name for the receive span
// while it's the same as dd-service, forcing a service name means setting the _dd.svc_src tag
@@ -353,6 +357,8 @@ class TimeInQueueForkedTest extends InstrumentationSpecification {
"$Tags.COMPONENT" "java-aws-sdk"
"$Tags.SPAN_KIND" Tags.SPAN_KIND_BROKER
"aws.queue.url" "http://localhost:${address.port}/000000000000/somequeue"
+ "aws.queue.name" "somequeue"
+ "queuename" "somequeue"
"aws.requestId" { it.trim() == "00000000-0000-0000-0000-000000000000" } // the test server seem messing with request id and insert \n
defaultTags(true)
}
diff --git a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/java/SqsClientTest.java b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/java/SqsClientTest.java
index 709f59f7ae3..38f9baa9c29 100644
--- a/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/java/SqsClientTest.java
+++ b/dd-java-agent/instrumentation/aws-java/aws-java-sqs-2.0/src/test/java/SqsClientTest.java
@@ -452,6 +452,10 @@ private static void assertAwsSpan(
assertEquals(awsOperation, tagValue(span, "aws.operation"));
assertEquals("java-aws-sdk", tagValue(span, "aws.agent"));
assertEquals(queueUrl, tagValue(span, "aws.queue.url"));
+ if (awsOperation.equals("SendMessage") || awsOperation.equals("ReceiveMessage")) {
+ String expectedQueueName = queueUrl.substring(queueUrl.lastIndexOf('/') + 1);
+ assertEquals(expectedQueueName, tagValue(span, "aws.queue.name"));
+ }
assertEquals(requestId(), tagValue(span, "aws.requestId").trim());
}
@@ -702,6 +706,11 @@ private static void assertAwsSpan(
assertEquals(awsOperation, tagValue(span, "aws.operation"));
assertEquals("java-aws-sdk", tagValue(span, "aws.agent"));
assertEquals(expectedQueueUrl(), tagValue(span, "aws.queue.url"));
+ if (awsOperation.equals("SendMessage") || awsOperation.equals("ReceiveMessage")) {
+ String expectedQueueName =
+ expectedQueueUrl().substring(expectedQueueUrl().lastIndexOf('/') + 1);
+ assertEquals(expectedQueueName, tagValue(span, "aws.queue.name"));
+ }
assertEquals("00000000-0000-0000-0000-000000000000", tagValue(span, "aws.requestId"));
}