@@ -303,8 +303,8 @@ public void TracerBecomesNoopWhenParentProviderIsDisposedTest()
303
303
Tracer ? tracer1 ;
304
304
305
305
using ( var tracerProvider = Sdk . CreateTracerProviderBuilder ( )
306
- . AddSource ( "mytracer" )
307
- . Build ( ) )
306
+ . AddSource ( "mytracer" )
307
+ . Build ( ) )
308
308
{
309
309
provider = tracerProvider ;
310
310
tracer1 = tracerProvider . GetTracer ( "mytracer" ) ;
@@ -408,6 +408,143 @@ static void InnerTest()
408
408
}
409
409
}
410
410
411
+ [ Fact ]
412
+ public void GetTracer_WithSameTags_ReturnsSameInstance ( )
413
+ {
414
+ var tags1 = new List < KeyValuePair < string , object ? > > { new ( "tag1" , "value1" ) , new ( "tag2" , "value2" ) } ;
415
+ var tags2 = new List < KeyValuePair < string , object ? > > { new ( "tag1" , "value1" ) , new ( "tag2" , "value2" ) } ;
416
+
417
+ using var tracerProvider = new TestTracerProvider ( ) ;
418
+ var tracer1 = tracerProvider . GetTracer ( "test" , "1.0.0" , tags1 ) ;
419
+ var tracer2 = tracerProvider . GetTracer ( "test" , "1.0.0" , tags2 ) ;
420
+
421
+ Assert . Same ( tracer1 , tracer2 ) ;
422
+ }
423
+
424
+ [ Fact ]
425
+ public void GetTracer_WithoutTags_ReturnsSameInstance ( )
426
+ {
427
+ using var tracerProvider = new TestTracerProvider ( ) ;
428
+ var tracer1 = tracerProvider . GetTracer ( "test" , "1.0.0" ) ;
429
+ var tracer2 = tracerProvider . GetTracer ( "test" , "1.0.0" ) ;
430
+
431
+ Assert . Same ( tracer1 , tracer2 ) ;
432
+ }
433
+
434
+ [ Fact ]
435
+ public void GetTracer_WithDifferentTags_ReturnsDifferentInstances ( )
436
+ {
437
+ var tags1 = new List < KeyValuePair < string , object ? > > { new ( "tag1" , "value1" ) } ;
438
+ var tags2 = new List < KeyValuePair < string , object ? > > { new ( "tag2" , "value2" ) } ;
439
+
440
+ using var tracerProvider = new TestTracerProvider ( ) ;
441
+ var tracer1 = tracerProvider . GetTracer ( "test" , "1.0.0" , tags1 ) ;
442
+ var tracer2 = tracerProvider . GetTracer ( "test" , "1.0.0" , tags2 ) ;
443
+
444
+ Assert . NotSame ( tracer1 , tracer2 ) ;
445
+ }
446
+
447
+ [ Fact ]
448
+ public void GetTracer_WithDifferentOrderTags_ReturnsSameInstance ( )
449
+ {
450
+ var tags1 = new List < KeyValuePair < string , object ? > > { new ( "tag2" , "value2" ) , new ( "tag1" , "value1" ) , } ;
451
+ var tags2 = new List < KeyValuePair < string , object ? > > { new ( "tag1" , "value1" ) , new ( "tag2" , "value2" ) , } ;
452
+
453
+ using var tracerProvider = new TestTracerProvider ( ) ;
454
+ var tracer1 = tracerProvider . GetTracer ( "test" , "1.0.0" , tags1 ) ;
455
+ var tracer2 = tracerProvider . GetTracer ( "test" , "1.0.0" , tags2 ) ;
456
+
457
+ Assert . Same ( tracer1 , tracer2 ) ;
458
+ }
459
+
460
+ [ Fact ]
461
+ public void GetTracer_TagsValuesAreIntType_ReturnsSameInstance ( )
462
+ {
463
+ var tags1 = new List < KeyValuePair < string , object ? > > { new ( "tag2" , 2 ) , new ( "tag1" , 1 ) } ;
464
+ var tags2 = new List < KeyValuePair < string , object ? > > { new ( "tag1" , 1 ) , new ( "tag2" , 2 ) } ;
465
+
466
+ using var tracerProvider = new TestTracerProvider ( ) ;
467
+ var tracer1 = tracerProvider . GetTracer ( "test" , "1.0.0" , tags1 ) ;
468
+ var tracer2 = tracerProvider . GetTracer ( "test" , "1.0.0" , tags2 ) ;
469
+
470
+ Assert . Same ( tracer1 , tracer2 ) ;
471
+ }
472
+
473
+ [ Fact ]
474
+ public void GetTracer_TagsValuesAreSameWithDifferentOrder_ReturnsSameInstance ( )
475
+ {
476
+ var tags1 = new List < KeyValuePair < string , object ? > > { new ( "tag3" , 1 ) , new ( "tag1" , 1 ) , new ( "tag2" , 1 ) , new ( "tag1" , 2 ) , new ( "tag2" , 2 ) } ;
477
+ var tags2 = new List < KeyValuePair < string , object ? > > { new ( "tag2" , 1 ) , new ( "tag1" , 2 ) , new ( "tag1" , 1 ) , new ( "tag2" , 2 ) , new ( "tag3" , 1 ) } ;
478
+
479
+ using var tracerProvider = new TestTracerProvider ( ) ;
480
+ var tracer1 = tracerProvider . GetTracer ( "test" , "1.0.0" , tags1 ) ;
481
+ var tracer2 = tracerProvider . GetTracer ( "test" , "1.0.0" , tags2 ) ;
482
+
483
+ Assert . Same ( tracer1 , tracer2 ) ;
484
+ }
485
+
486
+ [ Fact ]
487
+ public void GetTracer_TagsContainNullValues_ReturnsSameInstance ( )
488
+ {
489
+ var tags1 = new List < KeyValuePair < string , object ? > > { new ( "tag3" , 1 ) , new ( "tag2" , 3 ) , new ( "tag1" , null ) , new ( "tag2" , null ) , new ( "tag1" , 2 ) , new ( "tag2" , 2 ) } ;
490
+ var tags2 = new List < KeyValuePair < string , object ? > > { new ( "tag2" , null ) , new ( "tag1" , 2 ) , new ( "tag2" , 3 ) , new ( "tag1" , null ) , new ( "tag2" , 2 ) , new ( "tag3" , 1 ) } ;
491
+
492
+ using var tracerProvider = new TestTracerProvider ( ) ;
493
+ var tracer1 = tracerProvider . GetTracer ( "test" , "1.0.0" , tags1 ) ;
494
+ var tracer2 = tracerProvider . GetTracer ( "test" , "1.0.0" , tags2 ) ;
495
+
496
+ Assert . Same ( tracer1 , tracer2 ) ;
497
+ }
498
+
499
+ [ Fact ]
500
+ public void GetTracer_WithDifferentTagsSize_ReturnsDifferentInstances ( )
501
+ {
502
+ var tags1 = new List < KeyValuePair < string , object ? > > { new ( "tag2" , 2 ) , new ( "tag1" , 1 ) } ;
503
+ var tags2 = new List < KeyValuePair < string , object ? > > { new ( "tag1" , 1 ) , new ( "tag2" , 2 ) , new ( "tag3" , 3 ) } ;
504
+
505
+ using var tracerProvider = new TestTracerProvider ( ) ;
506
+ var tracer1 = tracerProvider . GetTracer ( "test" , "1.0.0" , tags1 ) ;
507
+ var tracer2 = tracerProvider . GetTracer ( "test" , "1.0.0" , tags2 ) ;
508
+
509
+ Assert . NotSame ( tracer1 , tracer2 ) ;
510
+ }
511
+
512
+ [ Fact ]
513
+ public void GetTracer_WithTagsAndWithoutTags_ReturnsDifferentInstances ( )
514
+ {
515
+ var tags = new List < KeyValuePair < string , object ? > > { new ( "tag1" , "value1" ) } ;
516
+
517
+ using var tracerProvider = new TestTracerProvider ( ) ;
518
+ var tracerWithTags = tracerProvider . GetTracer ( "test" , "1.0.0" , tags ) ;
519
+ var tracerWithoutTags = tracerProvider . GetTracer ( "test" , "1.0.0" ) ;
520
+
521
+ Assert . NotEqual ( tracerWithTags , tracerWithoutTags ) ;
522
+ }
523
+
524
+ [ Fact ]
525
+ public void GetTracer_WithTags_AppliesTagsToActivities ( )
526
+ {
527
+ var exportedItems = new List < Activity > ( ) ;
528
+ var tags = new List < KeyValuePair < string , object ? > > { new ( "tracerTag" , "tracerValue" ) } ;
529
+
530
+ using var tracerProvider = Sdk . CreateTracerProviderBuilder ( )
531
+ . AddSource ( "test" )
532
+ . AddInMemoryExporter ( exportedItems )
533
+ . SetSampler ( new AlwaysOnSampler ( ) )
534
+ . Build ( ) ;
535
+
536
+ var tracer = tracerProvider . GetTracer ( "test" , "1.0.0" , tags ) ;
537
+
538
+ using ( var span = tracer . StartActiveSpan ( "TestSpan" ) )
539
+ {
540
+ // Activity started by the tracer with tags
541
+ }
542
+
543
+ var activity = Assert . Single ( exportedItems ) ;
544
+
545
+ Assert . Contains ( activity . Source . Tags ! , kvp => kvp . Key == "tracerTag" && ( string ) kvp . Value ! == "tracerValue" ) ;
546
+ }
547
+
411
548
public void Dispose ( )
412
549
{
413
550
Activity . Current = null ;
0 commit comments