@@ -339,45 +339,24 @@ public void AddOpenTelemetry_WhenMethodIsInvokedAfterQuery_TraceIdIsTheSameThrou
339
339
{
340
340
var firstMethodName = "FirstMethod" ;
341
341
var secondMethodName = "SecondMethod" ;
342
+ var keyspace = TestUtils . GetUniqueKeyspaceName ( ) . ToLowerInvariant ( ) ;
342
343
343
344
using ( var _ = _internalActivitySource . StartActivity ( firstMethodName , ActivityKind . Internal ) )
344
345
{
345
346
var cluster = GetNewTemporaryCluster ( b => b . WithOpenTelemetryInstrumentation ( ) ) ;
346
347
var session = cluster . Connect ( ) ;
347
348
348
- var keyspace = TestUtils . GetUniqueKeyspaceName ( ) . ToLowerInvariant ( ) ;
349
349
session . CreateKeyspaceIfNotExists ( keyspace ) ;
350
350
session . ChangeKeyspace ( keyspace ) ;
351
351
352
352
SimpleStatementMethod ( session ) ;
353
353
LinqMethod ( session ) ;
354
354
MapperMethod ( session ) ;
355
355
356
-
357
356
SecondMethod ( secondMethodName ) ;
358
357
}
359
358
360
- var prepareCount = 2 * this . AmountOfNodes ; // 2 * because Mapper + LINQ, AmountOfNodes because PREPARE goes to every node by default
361
-
362
- RetryUntilActivities ( _testStartDateTime , SessionActivityName , 7 + prepareCount , displayNameStartsWith : true ) ; // create + change keyspace + simple + 2xlinq(create+bound) + 2xmapper(create+bound) + PREPAREs
363
- RetryUntilActivities ( _testStartDateTime , secondMethodName , 1 ) ;
364
- RetryUntilActivities ( _testStartDateTime , firstMethodName , 1 ) ;
365
- var activities = GetActivities ( _testStartDateTime ) . ToList ( ) ;
366
-
367
- var firstMethodActivity = activities . First ( x => x . DisplayName == firstMethodName ) ;
368
- var secondMethodActivity = activities . First ( x => x . DisplayName == secondMethodName ) ;
369
- var sessionActivities = activities . Where ( x => x . DisplayName . StartsWith ( SessionActivityName ) ) . ToList ( ) ;
370
-
371
- Assert . AreEqual ( 7 + prepareCount , sessionActivities . Count ) ; // create + change keyspace + simple + 2xlinq(create+bound) + 2xmapper(create+bound) + PREPAREs
372
-
373
- sessionActivities . ForEach ( act =>
374
- {
375
- Assert . AreEqual ( firstMethodActivity . TraceId , act . TraceId ) ;
376
- Assert . AreEqual ( firstMethodActivity . SpanId , act . ParentSpanId ) ;
377
- } ) ;
378
-
379
- Assert . AreEqual ( firstMethodActivity . TraceId , secondMethodActivity . TraceId ) ;
380
- Assert . AreEqual ( firstMethodActivity . SpanId , secondMethodActivity . ParentSpanId ) ;
359
+ Assert_WhenMethodIsInvokedAfterQuery_TraceIdIsTheSameThroughRequest ( keyspace ) ;
381
360
}
382
361
383
362
[ Test ]
@@ -387,12 +366,12 @@ public async Task AddOpenTelemetry_WhenMethodIsInvokedAfterQuery_TraceIdIsTheSam
387
366
var firstMethodName = "FirstMethod" ;
388
367
var secondMethodName = "SecondMethod" ;
389
368
369
+ var keyspace = TestUtils . GetUniqueKeyspaceName ( ) . ToLowerInvariant ( ) ;
390
370
using ( var _ = _internalActivitySource . StartActivity ( firstMethodName , ActivityKind . Internal ) )
391
371
{
392
372
var cluster = GetNewTemporaryCluster ( b => b . WithOpenTelemetryInstrumentation ( ) ) ;
393
373
var session = await cluster . ConnectAsync ( ) . ConfigureAwait ( false ) ;
394
374
395
- var keyspace = TestUtils . GetUniqueKeyspaceName ( ) . ToLowerInvariant ( ) ;
396
375
session . CreateKeyspaceIfNotExists ( keyspace ) ;
397
376
session . ChangeKeyspace ( keyspace ) ;
398
377
@@ -403,27 +382,7 @@ public async Task AddOpenTelemetry_WhenMethodIsInvokedAfterQuery_TraceIdIsTheSam
403
382
SecondMethod ( secondMethodName ) ;
404
383
}
405
384
406
- var prepareCount = 2 * this . AmountOfNodes ; // 2 * because Mapper + LINQ, AmountOfNodes because PREPARE goes to every node by default
407
-
408
- RetryUntilActivities ( _testStartDateTime , SessionActivityName , 7 + prepareCount , displayNameStartsWith : true ) ; // create + change keyspace + simple + 2xlinq(create+bound) + 2xmapper(create+bound) + PREPAREs
409
- RetryUntilActivities ( _testStartDateTime , secondMethodName , 1 ) ;
410
- RetryUntilActivities ( _testStartDateTime , firstMethodName , 1 ) ;
411
- var activities = GetActivities ( _testStartDateTime ) . ToList ( ) ;
412
-
413
- var firstMethodActivity = activities . First ( x => x . DisplayName == firstMethodName ) ;
414
- var secondMethodActivity = activities . First ( x => x . DisplayName == secondMethodName ) ;
415
- var sessionActivities = activities . Where ( x => x . DisplayName . StartsWith ( SessionActivityName ) ) . ToList ( ) ;
416
-
417
- Assert . AreEqual ( 7 + prepareCount , sessionActivities . Count ) ; // create + change keyspace + simple + 3xlinq(create+prepare+bound) + 3xmapper(create+prepare+bound)
418
-
419
- sessionActivities . ForEach ( act =>
420
- {
421
- Assert . AreEqual ( firstMethodActivity . TraceId , act . TraceId ) ;
422
- Assert . AreEqual ( firstMethodActivity . SpanId , act . ParentSpanId ) ;
423
- } ) ;
424
-
425
- Assert . AreEqual ( firstMethodActivity . TraceId , secondMethodActivity . TraceId ) ;
426
- Assert . AreEqual ( firstMethodActivity . SpanId , secondMethodActivity . ParentSpanId ) ;
385
+ Assert_WhenMethodIsInvokedAfterQuery_TraceIdIsTheSameThroughRequest ( keyspace ) ;
427
386
}
428
387
429
388
[ Test ]
@@ -684,27 +643,50 @@ public async Task AddOpenTelemetry_Mapper_ExpectedPrepareActivities(bool prepare
684
643
await mapper . InsertAsync ( songOne ) . ConfigureAwait ( false ) ;
685
644
686
645
RetryUntilActivities ( localDateTime , $ "{ SessionActivityName } ({ nameof ( BoundStatement ) } ) { keyspace } ", 1 ) ;
687
- RetryUntilActivities ( localDateTime , $ "{ NodeActivityName } ({ nameof ( BoundStatement ) } ) { keyspace } ", 1 ) ;
688
- RetryUntilActivities ( localDateTime , $ "{ SessionActivityName } ({ nameof ( PrepareRequest ) } ) { keyspace } ", prepareOnAllHosts ? AmountOfNodes : 1 ) ;
689
- RetryUntilActivities ( localDateTime , $ "{ NodeActivityName } ({ nameof ( PrepareRequest ) } ) { keyspace } ", prepareOnAllHosts ? AmountOfNodes : 1 ) ;
646
+ RetryUntilActivities ( localDateTime , $ "{ SessionActivityName } ({ nameof ( PrepareRequest ) } ) { keyspace } ", 1 ) ;
647
+
648
+ if ( prepareOnAllHosts )
649
+ {
650
+ RetryUntilActivities ( localDateTime , $ "{ NodeActivityName } ({ nameof ( BoundStatement ) } ) { keyspace } ", 1 ) ;
651
+ RetryUntilActivities ( localDateTime , $ "{ NodeActivityName } ({ nameof ( PrepareRequest ) } ) { keyspace } ", AmountOfNodes ) ;
652
+ }
653
+ else
654
+ {
655
+ RetryUntilActivities ( localDateTime , $ "{ NodeActivityName } ({ nameof ( BoundStatement ) } ) { keyspace } ", 1 , greaterOrEqual : true ) ;
656
+ RetryUntilActivities ( localDateTime , $ "{ NodeActivityName } ({ nameof ( PrepareRequest ) } ) { keyspace } ", 1 , greaterOrEqual : true ) ;
657
+ }
690
658
691
659
var allActivities = GetActivities ( localDateTime ) . ToList ( ) ;
692
660
var boundStmtSessionActivity = allActivities . Single ( x => x . DisplayName == $ "{ SessionActivityName } ({ nameof ( BoundStatement ) } ) { keyspace } ") ;
693
- var boundStmtNodeActivity = allActivities . Single ( x => x . DisplayName == $ "{ NodeActivityName } ({ nameof ( BoundStatement ) } ) { keyspace } ") ;
661
+ var boundStmtNodeActivities = allActivities . Where ( x => x . DisplayName == $ "{ NodeActivityName } ({ nameof ( BoundStatement ) } ) { keyspace } ") . ToList ( ) ;
694
662
var prepareStmtSessionActivities = allActivities . Where ( x => x . DisplayName == $ "{ SessionActivityName } ({ nameof ( PrepareRequest ) } ) { keyspace } ") . ToList ( ) ;
695
663
var prepareStmtNodeActivities = allActivities . Where ( x => x . DisplayName == $ "{ NodeActivityName } ({ nameof ( PrepareRequest ) } ) { keyspace } ") . ToList ( ) ;
696
664
697
- Assert . IsNull ( boundStmtSessionActivity . ParentId ) ;
698
- Assert . AreEqual ( boundStmtSessionActivity . TraceId , boundStmtNodeActivity . TraceId ) ;
699
- Assert . AreEqual ( boundStmtSessionActivity . SpanId , boundStmtNodeActivity . ParentSpanId ) ;
665
+ if ( ! prepareOnAllHosts )
666
+ {
667
+ if ( prepareStmtNodeActivities . Count == 2 )
668
+ {
669
+ Assert . AreEqual ( 2 , boundStmtNodeActivities . Count ) ;
670
+ }
671
+ else
672
+ {
673
+ Assert . AreEqual ( 1 , prepareStmtNodeActivities . Count ) ;
674
+ Assert . AreEqual ( 1 , boundStmtNodeActivities . Count ) ;
675
+ }
676
+ }
700
677
701
678
var expectedStatement = $ "INSERT INTO { keyspace } .song (Artist, Id, ReleaseDate, Title) VALUES (?, ?, ?, ?)";
702
-
679
+ Assert . IsNull ( boundStmtSessionActivity . ParentId ) ;
703
680
ValidateSessionActivityAttributes ( boundStmtSessionActivity , typeof ( BoundStatement ) ) ;
704
- ValidateNodeActivityAttributes ( boundStmtNodeActivity , typeof ( BoundStatement ) ) ;
705
681
Assert . Contains ( new KeyValuePair < string , string > ( "db.query.text" , expectedStatement ) , boundStmtSessionActivity . Tags . ToArray ( ) ) ;
706
- Assert . Contains ( new KeyValuePair < string , string > ( "db.query.text" , expectedStatement ) , boundStmtNodeActivity . Tags . ToArray ( ) ) ;
707
-
682
+ foreach ( var boundStmtNodeActivity in boundStmtNodeActivities )
683
+ {
684
+ Assert . AreEqual ( boundStmtSessionActivity . TraceId , boundStmtNodeActivity . TraceId ) ;
685
+ Assert . AreEqual ( boundStmtSessionActivity . SpanId , boundStmtNodeActivity . ParentSpanId ) ;
686
+ ValidateNodeActivityAttributes ( boundStmtNodeActivity , typeof ( BoundStatement ) ) ;
687
+ Assert . Contains ( new KeyValuePair < string , string > ( "db.query.text" , expectedStatement ) , boundStmtNodeActivity . Tags . ToArray ( ) ) ;
688
+ }
689
+
708
690
foreach ( var prepareStmtSessionActivity in prepareStmtSessionActivities )
709
691
{
710
692
ValidateSessionActivityAttributes ( prepareStmtSessionActivity , typeof ( PrepareRequest ) ) ;
@@ -716,11 +698,73 @@ public async Task AddOpenTelemetry_Mapper_ExpectedPrepareActivities(bool prepare
716
698
ValidateNodeActivityAttributes ( prepareStmtNodeActivity , typeof ( PrepareRequest ) ) ;
717
699
Assert . Contains ( new KeyValuePair < string , string > ( "db.query.text" , expectedStatement ) , prepareStmtNodeActivity . Tags . ToArray ( ) ) ;
718
700
Assert . IsNotNull ( prepareStmtNodeActivity . ParentId ) ;
719
- var parentActivity = prepareStmtSessionActivities . Single ( a => a . SpanId == prepareStmtNodeActivity . ParentSpanId ) ;
720
- ValidateSessionActivityAttributes ( parentActivity , typeof ( PrepareRequest ) ) ;
701
+ var parentActivity = allActivities . Single ( a => a . SpanId == prepareStmtNodeActivity . ParentSpanId ) ;
702
+ if ( prepareOnAllHosts )
703
+ {
704
+ ValidateSessionActivityAttributes ( parentActivity , typeof ( PrepareRequest ) ) ;
705
+ }
706
+ else
707
+ {
708
+ // if prepareOnAllHosts is false then a node prepare request can happen within the BoundStatement context (REPREPARE)
709
+ // or it could be the node where the prepared statement went to
710
+ ValidateSessionActivityAttributes (
711
+ parentActivity ,
712
+ parentActivity . DisplayName . StartsWith ( $ "{ SessionActivityName } ({ nameof ( PrepareRequest ) } )")
713
+ ? typeof ( PrepareRequest )
714
+ : typeof ( BoundStatement ) ) ;
715
+ }
721
716
}
722
717
}
723
718
719
+ private void Assert_WhenMethodIsInvokedAfterQuery_TraceIdIsTheSameThroughRequest ( string keyspace )
720
+ {
721
+ var firstMethodName = "FirstMethod" ;
722
+ var secondMethodName = "SecondMethod" ;
723
+
724
+ // create + change keyspace + simple + 2xlinq(prepare+create+bound) + 2xmapper(prepare+create+bound) + PREPAREs
725
+ RetryUntilActivities ( _testStartDateTime , SessionActivityName , 7 + 2 , displayNameStartsWith : true ) ;
726
+
727
+ var prepareNodeRequestCount = 2 * this . AmountOfNodes ; // 2 * because Mapper + LINQ, AmountOfNodes because PREPARE goes to every node by default
728
+ // create + change keyspace + simple + 2xlinq(prepare+create+bound) + 2xmapper(prepare+create+bound) + PREPAREs
729
+ RetryUntilActivities ( _testStartDateTime , NodeActivityName , 7 + prepareNodeRequestCount , displayNameStartsWith : true ) ;
730
+ RetryUntilActivities ( _testStartDateTime , secondMethodName , 1 ) ;
731
+ RetryUntilActivities ( _testStartDateTime , firstMethodName , 1 ) ;
732
+ var activities = GetActivities ( _testStartDateTime ) . ToList ( ) ;
733
+
734
+ var firstMethodActivity = activities . First ( x => x . DisplayName == firstMethodName ) ;
735
+ var secondMethodActivity = activities . First ( x => x . DisplayName == secondMethodName ) ;
736
+ var sessionActivities = activities . Where ( x => x . DisplayName . StartsWith ( SessionActivityName ) ) . ToList ( ) ;
737
+ var nodeActivities = activities . Where ( x => x . DisplayName . StartsWith ( NodeActivityName ) ) . ToList ( ) ;
738
+
739
+ // create + change keyspace + simple + 2xlinq(prepare+create+bound) + 2xmapper(prepare+create+bound) + PREPAREs
740
+ Assert . AreEqual ( 7 + 2 , sessionActivities . Count ) ;
741
+ Assert . AreEqual ( 7 + prepareNodeRequestCount , nodeActivities . Count ) ;
742
+
743
+ sessionActivities . ForEach ( act =>
744
+ {
745
+ Assert . AreEqual ( firstMethodActivity . TraceId , act . TraceId ) ;
746
+ Assert . AreEqual ( firstMethodActivity . SpanId , act . ParentSpanId ) ;
747
+ } ) ;
748
+
749
+ Assert . AreEqual ( firstMethodActivity . TraceId , secondMethodActivity . TraceId ) ;
750
+ Assert . AreEqual ( firstMethodActivity . SpanId , secondMethodActivity . ParentSpanId ) ;
751
+
752
+ var sessionPrepareActivities =
753
+ sessionActivities . Where ( x => x . DisplayName == $ "{ SessionActivityName } ({ nameof ( PrepareRequest ) } ) { keyspace } ") . ToList ( ) ;
754
+ var nodePrepareActivities =
755
+ nodeActivities . Where ( x => x . DisplayName == $ "{ NodeActivityName } ({ nameof ( PrepareRequest ) } ) { keyspace } ") . ToList ( ) ;
756
+
757
+ Assert . AreEqual ( 2 , sessionPrepareActivities . Count ) ;
758
+ Assert . AreEqual ( prepareNodeRequestCount , nodePrepareActivities . Count ) ;
759
+ sessionPrepareActivities . ForEach ( act =>
760
+ {
761
+ var childActivities = nodePrepareActivities . Where ( a => a . ParentSpanId == act . SpanId ) . ToList ( ) ;
762
+ Assert . AreEqual ( AmountOfNodes , childActivities . Count ) ;
763
+ var addresses = childActivities . Select ( a => a . Tags . Single ( t => t . Key == "server.address" ) . Value ) ;
764
+ CollectionAssert . AllItemsAreUnique ( addresses ) ;
765
+ } ) ;
766
+ }
767
+
724
768
private async Task SimpleStatementMethodAsync ( ISession session )
725
769
{
726
770
var statement = new SimpleStatement ( "SELECT key FROM system.local" ) ;
@@ -839,14 +883,13 @@ private static void ValidateSessionActivityAttributes(Activity activity, Type st
839
883
}
840
884
}
841
885
842
- private static void ValidateNodeActivityAttributes ( Activity activity , Type statementType )
886
+ private void ValidateNodeActivityAttributes ( Activity activity , Type statementType )
843
887
{
844
888
var expectedActivityKind = ActivityKind . Client ;
845
889
var expectedTags = new Dictionary < string , string > ( )
846
890
{
847
891
{ "db.system" , "cassandra" } ,
848
892
{ "db.operation.name" , $ "Node_Request({ statementType . Name } )" } ,
849
- { "server.address" , "127.0.0.1" } ,
850
893
{ "server.port" , "9042" } ,
851
894
} ;
852
895
@@ -858,6 +901,7 @@ private static void ValidateNodeActivityAttributes(Activity activity, Type state
858
901
{
859
902
Assert . AreEqual ( tags . FirstOrDefault ( x => x . Key == pair . Key ) . Value , expectedTags [ pair . Key ] ) ;
860
903
}
904
+ Assert . Contains ( tags . FirstOrDefault ( x => x . Key == "server.address" ) . Value , Cluster . AllHosts ( ) . Select ( h => h . Address . Address . ToString ( ) ) . ToList ( ) ) ;
861
905
}
862
906
863
907
private void SecondMethod ( string activityName )
0 commit comments