@@ -7,7 +7,9 @@ import com.amazonaws.client.builder.AwsClientBuilder
7
7
import com.amazonaws.services.sqs.AmazonSQSClientBuilder
8
8
import com.amazonaws.services.sqs.model.Message
9
9
import com.amazonaws.services.sqs.model.MessageAttributeValue
10
+ import com.amazonaws.services.sqs.model.ReceiveMessageRequest
10
11
import com.amazonaws.services.sqs.model.SendMessageRequest
12
+ import com.google.common.collect.ImmutableMap
11
13
import datadog.trace.agent.test.naming.VersionedNamingTestBase
12
14
import datadog.trace.agent.test.utils.TraceUtils
13
15
import datadog.trace.api.Config
@@ -87,9 +89,9 @@ abstract class SqsClientTest extends VersionedNamingTestBase {
87
89
def " trace details propagated via SQS system message attributes" () {
88
90
setup :
89
91
def client = AmazonSQSClientBuilder . standard()
90
- .withEndpointConfiguration(endpoint)
91
- .withCredentials(credentialsProvider)
92
- .build()
92
+ .withEndpointConfiguration(endpoint)
93
+ .withCredentials(credentialsProvider)
94
+ .build()
93
95
def queueUrl = client. createQueue(' somequeue' ). queueUrl
94
96
TEST_WRITER . clear()
95
97
@@ -188,6 +190,56 @@ abstract class SqsClientTest extends VersionedNamingTestBase {
188
190
client. shutdown()
189
191
}
190
192
193
+ @IgnoreIf ({ !instance.isDataStreamsEnabled() })
194
+ def " propagation even when message attributes are readonly" () {
195
+ setup :
196
+ def client = AmazonSQSClientBuilder . standard()
197
+ .withEndpointConfiguration(endpoint)
198
+ .withCredentials(credentialsProvider)
199
+ .build()
200
+ def queueUrl = client. createQueue(' somequeue' ). queueUrl
201
+ TEST_WRITER . clear()
202
+
203
+ when :
204
+ TraceUtils . runUnderTrace(' parent' , {
205
+ def my_attribute = new MessageAttributeValue ()
206
+ my_attribute. setStringValue(" hello world" )
207
+ my_attribute. setDataType(" String" )
208
+ def readonlyAttributes = ImmutableMap<String , MessageAttributeValue > . of(" my_key" , my_attribute)
209
+ def req = new SendMessageRequest (queueUrl, ' sometext' )
210
+ req. setMessageAttributes(readonlyAttributes)
211
+ client. sendMessage(req)
212
+ })
213
+
214
+ TEST_DATA_STREAMS_WRITER . waitForGroups(1 )
215
+
216
+ then :
217
+ assertTraces(1 ) {
218
+ trace(2 ) {
219
+ basicSpan(it, " parent" )
220
+ span {
221
+ serviceName expectedService(" SQS" , " SendMessage" )
222
+ operationName expectedOperation(" SQS" , " SendMessage" )
223
+ resourceName " SQS.SendMessage"
224
+ spanType DDSpanTypes . HTTP_CLIENT
225
+ errored false
226
+ childOf(span(0 ))
227
+ }
228
+ }
229
+ }
230
+
231
+ and :
232
+ def recv = new ReceiveMessageRequest (queueUrl)
233
+ recv. withMessageAttributeNames(" my_key" )
234
+ def messages = client. receiveMessage(recv). messages
235
+
236
+ assert messages[0 ]. messageAttributes. containsKey(" my_key" ) // what we set initially
237
+ assert messages[0 ]. messageAttributes. containsKey(" _datadog" ) // what was injected
238
+
239
+ cleanup :
240
+ client. shutdown()
241
+ }
242
+
191
243
@IgnoreIf ({ instance.isDataStreamsEnabled() })
192
244
def "trace details propagated via embedded SQS message attribute (string )" () {
193
245
setup:
@@ -196,8 +248,8 @@ abstract class SqsClientTest extends VersionedNamingTestBase {
196
248
when:
197
249
def message = new Message()
198
250
message.addMessageAttributesEntry('_datadog', new MessageAttributeValue().withDataType('String').withStringValue(
199
- " {\" x-datadog-trace-id\" : \" 4948377316357291421\" , \" x-datadog-parent-id\" : \" 6746998015037429512\" , \" x-datadog-sampling-priority\" : \" 1\" }"
200
- ))
251
+ " {\" x-datadog-trace-id\" : \" 4948377316357291421\" , \" x-datadog-parent-id\" : \" 6746998015037429512\" , \" x-datadog-sampling-priority\" : \" 1\" }"
252
+ ))
201
253
def messages = new TracingList ([message], " http://localhost:${ address.port} /000000000000/somequeue" )
202
254
203
255
messages. forEach {/* consume to create message spans */ }
@@ -237,8 +289,8 @@ abstract class SqsClientTest extends VersionedNamingTestBase {
237
289
when:
238
290
def message = new Message()
239
291
message.addMessageAttributesEntry('_datadog', new MessageAttributeValue().withDataType('Binary').withBinaryValue(
240
- headerValue
241
- ))
292
+ headerValue
293
+ ))
242
294
def messages = new TracingList([message], " http :// localhost:${address.port}/000000000000/somequeue")
243
295
244
296
messages. forEach {/* consume to create message spans */ }
@@ -281,9 +333,9 @@ abstract class SqsClientTest extends VersionedNamingTestBase {
281
333
def " trace details propagated from SQS to JMS" () {
282
334
setup :
283
335
def client = AmazonSQSClientBuilder . standard()
284
- .withEndpointConfiguration(endpoint)
285
- .withCredentials(credentialsProvider)
286
- .build()
336
+ .withEndpointConfiguration(endpoint)
337
+ .withCredentials(credentialsProvider)
338
+ .build()
287
339
288
340
def connectionFactory = new SQSConnectionFactory (new ProviderConfiguration (), client)
289
341
def connection = connectionFactory. createConnection()
@@ -295,12 +347,12 @@ abstract class SqsClientTest extends VersionedNamingTestBase {
295
347
296
348
when :
297
349
def ddMsgAttribute = new MessageAttributeValue ()
298
- .withBinaryValue(ByteBuffer . wrap(" hello world" . getBytes(Charset . defaultCharset())))
299
- .withDataType(" Binary" )
350
+ .withBinaryValue(ByteBuffer . wrap(" hello world" . getBytes(Charset . defaultCharset())))
351
+ .withDataType(" Binary" )
300
352
connection. start()
301
353
TraceUtils . runUnderTrace(' parent' ) {
302
354
client. sendMessage(new SendMessageRequest (queue. queueUrl, ' sometext' )
303
- .withMessageAttributes([_datadog : ddMsgAttribute]))
355
+ .withMessageAttributes([_datadog : ddMsgAttribute]))
304
356
}
305
357
def message = consumer. receive()
306
358
consumer. receiveNoWait()
@@ -558,9 +610,9 @@ class SqsClientV1DataStreamsForkedTest extends SqsClientTest {
558
610
def " Data streams context extracted from message body" () {
559
611
setup :
560
612
def client = AmazonSQSClientBuilder . standard()
561
- .withEndpointConfiguration(endpoint)
562
- .withCredentials(credentialsProvider)
563
- .build()
613
+ .withEndpointConfiguration(endpoint)
614
+ .withCredentials(credentialsProvider)
615
+ .build()
564
616
def queueUrl = client. createQueue(' somequeue' ). queueUrl
565
617
TEST_WRITER . clear()
566
618
@@ -588,9 +640,9 @@ class SqsClientV1DataStreamsForkedTest extends SqsClientTest {
588
640
def " Data streams context not extracted from message body when message attributes are not present" () {
589
641
setup :
590
642
def client = AmazonSQSClientBuilder . standard()
591
- .withEndpointConfiguration(endpoint)
592
- .withCredentials(credentialsProvider)
593
- .build()
643
+ .withEndpointConfiguration(endpoint)
644
+ .withCredentials(credentialsProvider)
645
+ .build()
594
646
def queueUrl = client. createQueue(' somequeue' ). queueUrl
595
647
TEST_WRITER . clear()
596
648
@@ -619,9 +671,9 @@ class SqsClientV1DataStreamsForkedTest extends SqsClientTest {
619
671
def " Data streams context not extracted from message body when message is not a Json" () {
620
672
setup :
621
673
def client = AmazonSQSClientBuilder . standard()
622
- .withEndpointConfiguration(endpoint)
623
- .withCredentials(credentialsProvider)
624
- .build()
674
+ .withEndpointConfiguration(endpoint)
675
+ .withCredentials(credentialsProvider)
676
+ .build()
625
677
def queueUrl = client. createQueue(' somequeue' ). queueUrl
626
678
TEST_WRITER . clear()
627
679
0 commit comments