@@ -83,20 +83,25 @@ void AssertIntTagGreaterThanZero(Activity activity, string name)
83
83
}
84
84
85
85
[ Theory ]
86
- [ InlineData ( true ) ]
87
- [ InlineData ( false ) ]
88
- public async Task TestPublisherAndConsumerActivityTags ( bool useRoutingKeyAsOperationName )
86
+ [ InlineData ( true , true ) ]
87
+ [ InlineData ( true , false ) ]
88
+ [ InlineData ( false , true ) ]
89
+ [ InlineData ( false , false ) ]
90
+ public async Task TestPublisherAndConsumerActivityTags ( bool useRoutingKeyAsOperationName , bool useParentChildLinking )
89
91
{
90
92
var exportedItems = new List < Activity > ( ) ;
91
93
using var tracer = Sdk . CreateTracerProviderBuilder ( )
92
- . AddRabbitMQInstrumentation ( )
94
+ . AddRabbitMQInstrumentation ( options =>
95
+ {
96
+ options . UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName ;
97
+ options . LinkType = useParentChildLinking ? OpenTelemetryLinkType . AlwaysParentChild : OpenTelemetryLinkType . AlwaysLink ;
98
+ } )
93
99
. AddInMemoryExporter ( exportedItems )
94
100
. Build ( ) ;
95
101
string baggageGuid = Guid . NewGuid ( ) . ToString ( ) ;
96
102
Baggage . SetBaggage ( "TestItem" , baggageGuid ) ;
97
103
Assert . Equal ( baggageGuid , Baggage . GetBaggage ( "TestItem" ) ) ;
98
104
99
- RabbitMQActivitySource . UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName ;
100
105
await Task . Delay ( 500 ) ;
101
106
string queueName = $ "{ Guid . NewGuid ( ) } ";
102
107
QueueDeclareOk q = await _channel . QueueDeclareAsync ( queueName ) ;
@@ -132,24 +137,29 @@ public async Task TestPublisherAndConsumerActivityTags(bool useRoutingKeyAsOpera
132
137
133
138
await _channel . BasicCancelAsync ( consumerTag ) ;
134
139
await Task . Delay ( 500 ) ;
135
- AssertActivityData ( useRoutingKeyAsOperationName , queueName , exportedItems , true ) ;
140
+ AssertActivityData ( useRoutingKeyAsOperationName , useParentChildLinking , queueName , exportedItems , true ) ;
136
141
}
137
142
138
143
[ Theory ]
139
- [ InlineData ( true ) ]
140
- [ InlineData ( false ) ]
141
- public async Task TestPublisherAndConsumerActivityTagsAsync ( bool useRoutingKeyAsOperationName )
144
+ [ InlineData ( true , true ) ]
145
+ [ InlineData ( true , false ) ]
146
+ [ InlineData ( false , true ) ]
147
+ [ InlineData ( false , false ) ]
148
+ public async Task TestPublisherAndConsumerActivityTagsAsync ( bool useRoutingKeyAsOperationName , bool useParentChildLinking )
142
149
{
143
150
var exportedItems = new List < Activity > ( ) ;
144
151
using var tracer = Sdk . CreateTracerProviderBuilder ( )
145
- . AddRabbitMQInstrumentation ( )
152
+ . AddRabbitMQInstrumentation ( options =>
153
+ {
154
+ options . UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName ;
155
+ options . LinkType = useParentChildLinking ? OpenTelemetryLinkType . AlwaysParentChild : OpenTelemetryLinkType . AlwaysLink ;
156
+ } )
146
157
. AddInMemoryExporter ( exportedItems )
147
158
. Build ( ) ;
148
159
string baggageGuid = Guid . NewGuid ( ) . ToString ( ) ;
149
160
Baggage . SetBaggage ( "TestItem" , baggageGuid ) ;
150
161
Assert . Equal ( baggageGuid , Baggage . GetBaggage ( "TestItem" ) ) ;
151
162
152
- RabbitMQActivitySource . UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName ;
153
163
await Task . Delay ( 500 ) ;
154
164
155
165
string queueName = $ "{ Guid . NewGuid ( ) } ";
@@ -186,24 +196,29 @@ public async Task TestPublisherAndConsumerActivityTagsAsync(bool useRoutingKeyAs
186
196
187
197
await _channel . BasicCancelAsync ( consumerTag ) ;
188
198
await Task . Delay ( 500 ) ;
189
- AssertActivityData ( useRoutingKeyAsOperationName , queueName , exportedItems , true ) ;
199
+ AssertActivityData ( useRoutingKeyAsOperationName , useParentChildLinking , queueName , exportedItems , true ) ;
190
200
}
191
201
192
202
[ Theory ]
193
- [ InlineData ( true ) ]
194
- [ InlineData ( false ) ]
195
- public async Task TestPublisherWithPublicationAddressAndConsumerActivityTagsAsync ( bool useRoutingKeyAsOperationName )
203
+ [ InlineData ( true , true ) ]
204
+ [ InlineData ( true , false ) ]
205
+ [ InlineData ( false , true ) ]
206
+ [ InlineData ( false , false ) ]
207
+ public async Task TestPublisherWithPublicationAddressAndConsumerActivityTagsAsync ( bool useRoutingKeyAsOperationName , bool useParentChildLinking )
196
208
{
197
209
var exportedItems = new List < Activity > ( ) ;
198
210
using var tracer = Sdk . CreateTracerProviderBuilder ( )
199
- . AddRabbitMQInstrumentation ( )
211
+ . AddRabbitMQInstrumentation ( options =>
212
+ {
213
+ options . UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName ;
214
+ options . LinkType = useParentChildLinking ? OpenTelemetryLinkType . AlwaysParentChild : OpenTelemetryLinkType . AlwaysLink ;
215
+ } )
200
216
. AddInMemoryExporter ( exportedItems )
201
217
. Build ( ) ;
202
218
string baggageGuid = Guid . NewGuid ( ) . ToString ( ) ;
203
219
Baggage . SetBaggage ( "TestItem" , baggageGuid ) ;
204
220
Assert . Equal ( baggageGuid , Baggage . GetBaggage ( "TestItem" ) ) ;
205
221
206
- RabbitMQActivitySource . UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName ;
207
222
await Task . Delay ( 500 ) ;
208
223
209
224
string queueName = $ "{ Guid . NewGuid ( ) } ";
@@ -241,24 +256,29 @@ public async Task TestPublisherWithPublicationAddressAndConsumerActivityTagsAsyn
241
256
242
257
await _channel . BasicCancelAsync ( consumerTag ) ;
243
258
await Task . Delay ( 500 ) ;
244
- AssertActivityData ( useRoutingKeyAsOperationName , queueName , exportedItems , true ) ;
259
+ AssertActivityData ( useRoutingKeyAsOperationName , useParentChildLinking , queueName , exportedItems , true ) ;
245
260
}
246
261
247
262
[ Theory ]
248
- [ InlineData ( true ) ]
249
- [ InlineData ( false ) ]
250
- public async Task TestPublisherWithCachedStringsAndConsumerActivityTagsAsync ( bool useRoutingKeyAsOperationName )
263
+ [ InlineData ( true , true ) ]
264
+ [ InlineData ( true , false ) ]
265
+ [ InlineData ( false , true ) ]
266
+ [ InlineData ( false , false ) ]
267
+ public async Task TestPublisherWithCachedStringsAndConsumerActivityTagsAsync ( bool useRoutingKeyAsOperationName , bool useParentChildLinking )
251
268
{
252
269
var exportedItems = new List < Activity > ( ) ;
253
270
using var tracer = Sdk . CreateTracerProviderBuilder ( )
254
- . AddRabbitMQInstrumentation ( )
271
+ . AddRabbitMQInstrumentation ( options =>
272
+ {
273
+ options . UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName ;
274
+ options . LinkType = useParentChildLinking ? OpenTelemetryLinkType . AlwaysParentChild : OpenTelemetryLinkType . AlwaysLink ;
275
+ } )
255
276
. AddInMemoryExporter ( exportedItems )
256
277
. Build ( ) ;
257
278
string baggageGuid = Guid . NewGuid ( ) . ToString ( ) ;
258
279
Baggage . SetBaggage ( "TestItem" , baggageGuid ) ;
259
280
Assert . Equal ( baggageGuid , Baggage . GetBaggage ( "TestItem" ) ) ;
260
281
261
- RabbitMQActivitySource . UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName ;
262
282
await Task . Delay ( 500 ) ;
263
283
264
284
string queueName = $ "{ Guid . NewGuid ( ) } ";
@@ -297,23 +317,28 @@ public async Task TestPublisherWithCachedStringsAndConsumerActivityTagsAsync(boo
297
317
298
318
await _channel . BasicCancelAsync ( consumerTag ) ;
299
319
await Task . Delay ( 500 ) ;
300
- AssertActivityData ( useRoutingKeyAsOperationName , queueName , exportedItems , true ) ;
320
+ AssertActivityData ( useRoutingKeyAsOperationName , useParentChildLinking , queueName , exportedItems , true ) ;
301
321
}
302
322
303
323
[ Theory ]
304
- [ InlineData ( true ) ]
305
- [ InlineData ( false ) ]
306
- public async Task TestPublisherAndBasicGetActivityTags ( bool useRoutingKeyAsOperationName )
324
+ [ InlineData ( true , true ) ]
325
+ [ InlineData ( true , false ) ]
326
+ [ InlineData ( false , true ) ]
327
+ [ InlineData ( false , false ) ]
328
+ public async Task TestPublisherAndBasicGetActivityTags ( bool useRoutingKeyAsOperationName , bool useParentChildLinking )
307
329
{
308
330
var exportedItems = new List < Activity > ( ) ;
309
331
using var tracer = Sdk . CreateTracerProviderBuilder ( )
310
- . AddRabbitMQInstrumentation ( )
332
+ . AddRabbitMQInstrumentation ( options =>
333
+ {
334
+ options . UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName ;
335
+ options . LinkType = useParentChildLinking ? OpenTelemetryLinkType . AlwaysParentChild : OpenTelemetryLinkType . AlwaysLink ;
336
+ } )
311
337
. AddInMemoryExporter ( exportedItems )
312
338
. Build ( ) ;
313
339
string baggageGuid = Guid . NewGuid ( ) . ToString ( ) ;
314
340
Baggage . SetBaggage ( "TestItem" , baggageGuid ) ;
315
341
Assert . Equal ( baggageGuid , Baggage . GetBaggage ( "TestItem" ) ) ;
316
- RabbitMQActivitySource . UseRoutingKeyAsOperationName = useRoutingKeyAsOperationName ;
317
342
await Task . Delay ( 500 ) ;
318
343
string queue = $ "queue-{ Guid . NewGuid ( ) } ";
319
344
const string msg = "for basic.get" ;
@@ -331,15 +356,15 @@ public async Task TestPublisherAndBasicGetActivityTags(bool useRoutingKeyAsOpera
331
356
ok = await _channel . QueueDeclarePassiveAsync ( queue ) ;
332
357
Assert . Equal ( 0u , ok . MessageCount ) ;
333
358
await Task . Delay ( 500 ) ;
334
- AssertActivityData ( useRoutingKeyAsOperationName , queue , exportedItems , false ) ;
359
+ AssertActivityData ( useRoutingKeyAsOperationName , useParentChildLinking , queue , exportedItems , false ) ;
335
360
}
336
361
finally
337
362
{
338
363
await _channel . QueueDeleteAsync ( queue ) ;
339
364
}
340
365
}
341
366
342
- private void AssertActivityData ( bool useRoutingKeyAsOperationName , string queueName ,
367
+ private void AssertActivityData ( bool useRoutingKeyAsOperationName , bool useParentChildLinking , string queueName ,
343
368
List < Activity > activityList , bool isDeliver = false , string baggageGuid = null )
344
369
{
345
370
string childName = isDeliver ? "deliver" : "fetch" ;
@@ -359,11 +384,21 @@ private void AssertActivityData(bool useRoutingKeyAsOperationName, string queueN
359
384
x . GetTagItem ( RabbitMQActivitySource . MessagingDestinationRoutingKey ) is string routingKeyTag &&
360
385
routingKeyTag == $ "{ queueName } ") ;
361
386
Activity receiveActivity = activities . Single ( x =>
362
- x . OperationName == ( useRoutingKeyAsOperationName ? $ "{ childName } { queueName } " : childName ) &&
363
- x . Links . First ( ) . Context . TraceId == sendActivity . TraceId ) ;
387
+ x . OperationName == ( useRoutingKeyAsOperationName ? $ "{ childName } { queueName } " : childName ) ) ;
364
388
Assert . Equal ( ActivityKind . Producer , sendActivity . Kind ) ;
365
389
Assert . Equal ( ActivityKind . Consumer , receiveActivity . Kind ) ;
366
- Assert . Null ( receiveActivity . ParentId ) ;
390
+ if ( useParentChildLinking )
391
+ {
392
+ Assert . Empty ( receiveActivity . Links ) ;
393
+ Assert . Equal ( sendActivity . Id , receiveActivity . ParentId ) ;
394
+ Assert . Equal ( sendActivity . TraceId , receiveActivity . TraceId ) ;
395
+ }
396
+ else
397
+ {
398
+ Assert . Equal ( sendActivity . TraceId , receiveActivity . Links . Single ( ) . Context . TraceId ) ;
399
+ Assert . Null ( receiveActivity . ParentId ) ;
400
+ Assert . NotEqual ( sendActivity . TraceId , receiveActivity . TraceId ) ;
401
+ }
367
402
AssertStringTagNotNullOrEmpty ( sendActivity , "network.peer.address" ) ;
368
403
AssertStringTagNotNullOrEmpty ( sendActivity , "network.local.address" ) ;
369
404
AssertStringTagNotNullOrEmpty ( sendActivity , "server.address" ) ;
@@ -385,6 +420,7 @@ private void AssertActivityData(bool useRoutingKeyAsOperationName, string queueN
385
420
AssertStringTagEquals ( receiveActivity , RabbitMQActivitySource . MessagingOperationName , childName ) ;
386
421
AssertStringTagEquals ( sendActivity , RabbitMQActivitySource . MessagingOperationType , "send" ) ;
387
422
AssertStringTagEquals ( sendActivity , RabbitMQActivitySource . MessagingOperationName , "publish" ) ;
423
+
388
424
}
389
425
}
390
426
}
0 commit comments