@@ -240,11 +240,11 @@ public async Task AddOpenTelemetry_MapperAndMapperAsync_SessionRequestIsParentOf
240
240
await mapper . InsertIfNotExistsAsync ( songOne , testProfile , true , null )
241
241
. ContinueWith ( t =>
242
242
{
243
- RetryUntilActivities ( localDateTime , SessionActivityName , 1 , displayNameStartsWith : true ) ;
244
- RetryUntilActivities ( localDateTime , NodeActivityName , 1 , displayNameStartsWith : true ) ;
243
+ RetryUntilActivities ( localDateTime , $ " { SessionActivityName } ( { nameof ( BoundStatement ) } ) { keyspace } " , 1 ) ;
244
+ RetryUntilActivities ( localDateTime , $ " { NodeActivityName } ( { nameof ( BoundStatement ) } ) { keyspace } " , 1 ) ;
245
245
var activities = GetActivities ( localDateTime ) ;
246
- var sessionActivity = activities . First ( x => x . DisplayName . StartsWith ( SessionActivityName ) ) ;
247
- var nodeActivity = activities . First ( x => x . DisplayName . StartsWith ( NodeActivityName ) ) ;
246
+ var sessionActivity = activities . First ( x => x . DisplayName == $ " { SessionActivityName } ( { nameof ( BoundStatement ) } ) { keyspace } " ) ;
247
+ var nodeActivity = activities . First ( x => x . DisplayName == $ " { NodeActivityName } ( { nameof ( BoundStatement ) } ) { keyspace } " ) ;
248
248
249
249
Assert . IsNull ( sessionActivity . ParentId ) ;
250
250
Assert . AreEqual ( sessionActivity . TraceId , nodeActivity . TraceId ) ;
@@ -313,12 +313,12 @@ public void AddOpenTelemetry_Linq_SessionRequestIsParentOfNodeRequest()
313
313
314
314
table . Insert ( song ) . Execute ( ) ;
315
315
316
- RetryUntilActivities ( _testStartDateTime , SessionActivityName , 1 , displayNameStartsWith : true ) ;
317
- RetryUntilActivities ( _testStartDateTime , NodeActivityName , 1 , displayNameStartsWith : true ) ;
316
+ RetryUntilActivities ( _testStartDateTime , $ " { SessionActivityName } ( { nameof ( BoundStatement ) } ) { keyspace } " , 1 ) ;
317
+ RetryUntilActivities ( _testStartDateTime , $ " { NodeActivityName } ( { nameof ( BoundStatement ) } ) { keyspace } " , 1 ) ;
318
318
var syncActivities = GetActivities ( _testStartDateTime ) ;
319
319
320
- var syncSessionActivity = syncActivities . First ( x => x . DisplayName . StartsWith ( SessionActivityName ) ) ;
321
- var syncNodeActivity = syncActivities . First ( x => x . DisplayName . StartsWith ( NodeActivityName ) ) ;
320
+ var syncSessionActivity = syncActivities . First ( x => x . DisplayName == $ " { SessionActivityName } ( { nameof ( BoundStatement ) } ) { keyspace } " ) ;
321
+ var syncNodeActivity = syncActivities . First ( x => x . DisplayName == $ " { NodeActivityName } ( { nameof ( BoundStatement ) } ) { keyspace } " ) ;
322
322
323
323
Assert . IsNull ( syncSessionActivity . ParentId ) ;
324
324
Assert . AreEqual ( syncSessionActivity . TraceId , syncNodeActivity . TraceId ) ;
@@ -352,7 +352,9 @@ public void AddOpenTelemetry_WhenMethodIsInvokedAfterQuery_TraceIdIsTheSameThrou
352
352
SecondMethod ( secondMethodName ) ;
353
353
}
354
354
355
- RetryUntilActivities ( _testStartDateTime , SessionActivityName , 7 ) ; // simple + 2xlinq(prepare+bound) + 2xmapper(prepare+bound) + create + change
355
+ var prepareCount = 2 * this . AmountOfNodes ; // 2 * because Mapper + LINQ, AmountOfNodes because PREPARE goes to every node by default
356
+
357
+ RetryUntilActivities ( _testStartDateTime , SessionActivityName , 7 + prepareCount ) ; // create + change keyspace + simple + 2xlinq(create+bound) + 2xmapper(create+bound) + PREPAREs
356
358
RetryUntilActivities ( _testStartDateTime , secondMethodName , 1 ) ;
357
359
RetryUntilActivities ( _testStartDateTime , firstMethodName , 1 ) ;
358
360
var activities = GetActivities ( _testStartDateTime ) . ToList ( ) ;
@@ -361,7 +363,7 @@ public void AddOpenTelemetry_WhenMethodIsInvokedAfterQuery_TraceIdIsTheSameThrou
361
363
var secondMethodActivity = activities . First ( x => x . DisplayName == secondMethodName ) ;
362
364
var sessionActivities = activities . Where ( x => x . DisplayName . StartsWith ( SessionActivityName ) ) . ToList ( ) ;
363
365
364
- Assert . AreEqual ( 7 , sessionActivities . Count ) ; // simple + 2xlinq(prepare +bound) + 2xmapper(prepare +bound) + create + change
366
+ Assert . AreEqual ( 7 + prepareCount , sessionActivities . Count ) ; // create + change keyspace + simple + 2xlinq(create +bound) + 2xmapper(create +bound) + PREPAREs
365
367
366
368
sessionActivities . ForEach ( act =>
367
369
{
@@ -396,7 +398,9 @@ public async Task AddOpenTelemetry_WhenMethodIsInvokedAfterQuery_TraceIdIsTheSam
396
398
SecondMethod ( secondMethodName ) ;
397
399
}
398
400
399
- RetryUntilActivities ( _testStartDateTime , SessionActivityName , 7 ) ; // simple + 2xlinq(prepare+bound) + 2xmapper(prepare+bound) + create + change
401
+ var prepareCount = 2 * this . AmountOfNodes ; // 2 * because Mapper + LINQ, AmountOfNodes because PREPARE goes to every node by default
402
+
403
+ RetryUntilActivities ( _testStartDateTime , SessionActivityName , 7 + prepareCount ) ; // create + change keyspace + simple + 2xlinq(create+bound) + 2xmapper(create+bound) + PREPAREs
400
404
RetryUntilActivities ( _testStartDateTime , secondMethodName , 1 ) ;
401
405
RetryUntilActivities ( _testStartDateTime , firstMethodName , 1 ) ;
402
406
var activities = GetActivities ( _testStartDateTime ) . ToList ( ) ;
@@ -405,7 +409,7 @@ public async Task AddOpenTelemetry_WhenMethodIsInvokedAfterQuery_TraceIdIsTheSam
405
409
var secondMethodActivity = activities . First ( x => x . DisplayName == secondMethodName ) ;
406
410
var sessionActivities = activities . Where ( x => x . DisplayName . StartsWith ( SessionActivityName ) ) . ToList ( ) ;
407
411
408
- Assert . AreEqual ( 7 , sessionActivities . Count ) ; // simple + 2xlinq(prepare+bound) + 2xmapper( prepare+bound) + create + change
412
+ Assert . AreEqual ( 7 + prepareCount , sessionActivities . Count ) ; // create + change keyspace + simple + 3xlinq(create+ prepare+bound) + 3xmapper( create+prepare+bound)
409
413
410
414
sessionActivities . ForEach ( act =>
411
415
{
@@ -621,8 +625,8 @@ public async Task AddOpenTelemetry_Batch_ExpectedStatement()
621
625
RetryUntilActivities ( localDateTime , $ "{ NodeActivityName } ({ nameof ( BatchStatement ) } ) { keyspace } ", 1 ) ;
622
626
623
627
var syncActivities = GetActivities ( localDateTime ) ;
624
- var syncSessionActivity = syncActivities . First ( x => x . DisplayName . StartsWith ( SessionActivityName ) ) ;
625
- var syncNodeActivity = syncActivities . First ( x => x . DisplayName . StartsWith ( NodeActivityName ) ) ;
628
+ var syncSessionActivity = syncActivities . First ( x => x . DisplayName == $ " { SessionActivityName } ( { nameof ( BatchStatement ) } ) { keyspace } " ) ;
629
+ var syncNodeActivity = syncActivities . First ( x => x . DisplayName == $ " { NodeActivityName } ( { nameof ( BatchStatement ) } ) { keyspace } " ) ;
626
630
627
631
Assert . IsNull ( syncSessionActivity . ParentId ) ;
628
632
Assert . AreEqual ( syncSessionActivity . TraceId , syncNodeActivity . TraceId ) ;
@@ -637,6 +641,81 @@ public async Task AddOpenTelemetry_Batch_ExpectedStatement()
637
641
Assert . Contains ( new KeyValuePair < string , string > ( "db.query.text" , expectedStatement ) , syncNodeActivity . Tags . ToArray ( ) ) ;
638
642
}
639
643
644
+ [ Category ( TestCategory . RealCluster ) ]
645
+ [ Test ]
646
+ [ TestCase ( true ) ]
647
+ [ TestCase ( false ) ]
648
+ public async Task AddOpenTelemetry_Mapper_ExpectedPrepareActivities ( bool prepareOnAllHosts )
649
+ {
650
+ var keyspace = TestUtils . GetUniqueKeyspaceName ( ) . ToLowerInvariant ( ) ;
651
+
652
+ var cluster = GetNewTemporaryCluster ( b => b
653
+ . WithOpenTelemetryInstrumentation ( opt => opt . IncludeDatabaseStatement = true )
654
+ . WithQueryOptions ( new QueryOptions ( ) . SetPrepareOnAllHosts ( prepareOnAllHosts ) ) ) ;
655
+
656
+ var session = cluster . Connect ( ) ;
657
+
658
+ session . CreateKeyspaceIfNotExists ( keyspace ) ;
659
+
660
+ session . ChangeKeyspace ( keyspace ) ;
661
+
662
+ CreateSongTable ( session ) ;
663
+
664
+ Task . Delay ( 100 ) . GetAwaiter ( ) . GetResult ( ) ;
665
+
666
+ var localDateTime = DateTime . UtcNow ;
667
+
668
+ var mapper = new Mapper ( session , new MappingConfiguration ( )
669
+ . Define ( new Map < Song > ( ) . PartitionKey ( s => s . Id ) . TableName ( "song" ) . KeyspaceName ( keyspace ) ) ) ;
670
+
671
+ var songOne = new Song
672
+ {
673
+ Id = Guid . NewGuid ( ) ,
674
+ Artist = "Led Zeppelin" ,
675
+ Title = "Mothership" ,
676
+ ReleaseDate = DateTimeOffset . UtcNow
677
+ } ;
678
+
679
+ await mapper . InsertAsync ( songOne ) . ConfigureAwait ( false ) ;
680
+
681
+ RetryUntilActivities ( localDateTime , $ "{ SessionActivityName } ({ nameof ( BoundStatement ) } ) { keyspace } ", 1 ) ;
682
+ RetryUntilActivities ( localDateTime , $ "{ NodeActivityName } ({ nameof ( BoundStatement ) } ) { keyspace } ", 1 ) ;
683
+ RetryUntilActivities ( localDateTime , $ "{ SessionActivityName } ({ nameof ( PrepareRequest ) } )", prepareOnAllHosts ? AmountOfNodes : 1 ) ;
684
+ RetryUntilActivities ( localDateTime , $ "{ NodeActivityName } ({ nameof ( PrepareRequest ) } )", prepareOnAllHosts ? AmountOfNodes : 1 ) ;
685
+
686
+ var allActivities = GetActivities ( localDateTime ) . ToList ( ) ;
687
+ var boundStmtSessionActivity = allActivities . Single ( x => x . DisplayName == $ "{ SessionActivityName } ({ nameof ( BoundStatement ) } ) { keyspace } ") ;
688
+ var boundStmtNodeActivity = allActivities . Single ( x => x . DisplayName == $ "{ NodeActivityName } ({ nameof ( BoundStatement ) } ) { keyspace } ") ;
689
+ var prepareStmtSessionActivities = allActivities . Where ( x => x . DisplayName == $ "{ SessionActivityName } ({ nameof ( PrepareRequest ) } )") . ToList ( ) ;
690
+ var prepareStmtNodeActivities = allActivities . Where ( x => x . DisplayName == $ "{ NodeActivityName } ({ nameof ( PrepareRequest ) } )") . ToList ( ) ;
691
+
692
+ Assert . IsNull ( boundStmtSessionActivity . ParentId ) ;
693
+ Assert . AreEqual ( boundStmtSessionActivity . TraceId , boundStmtNodeActivity . TraceId ) ;
694
+ Assert . AreEqual ( boundStmtSessionActivity . SpanId , boundStmtNodeActivity . ParentSpanId ) ;
695
+
696
+ var expectedStatement = $ "INSERT INTO { keyspace } .song (Artist, Id, ReleaseDate, Title) VALUES (?, ?, ?, ?)";
697
+
698
+ ValidateSessionActivityAttributes ( boundStmtSessionActivity , typeof ( BoundStatement ) ) ;
699
+ ValidateNodeActivityAttributes ( boundStmtNodeActivity , typeof ( BoundStatement ) ) ;
700
+ Assert . Contains ( new KeyValuePair < string , string > ( "db.query.text" , expectedStatement ) , boundStmtSessionActivity . Tags . ToArray ( ) ) ;
701
+ Assert . Contains ( new KeyValuePair < string , string > ( "db.query.text" , expectedStatement ) , boundStmtNodeActivity . Tags . ToArray ( ) ) ;
702
+
703
+ foreach ( var prepareStmtSessionActivity in prepareStmtSessionActivities )
704
+ {
705
+ ValidateSessionActivityAttributes ( prepareStmtSessionActivity , typeof ( PrepareRequest ) ) ;
706
+ Assert . Contains ( new KeyValuePair < string , string > ( "db.query.text" , expectedStatement ) , prepareStmtSessionActivity . Tags . ToArray ( ) ) ;
707
+ }
708
+
709
+ foreach ( var prepareStmtNodeActivity in prepareStmtNodeActivities )
710
+ {
711
+ ValidateNodeActivityAttributes ( prepareStmtNodeActivity , typeof ( PrepareRequest ) ) ;
712
+ Assert . Contains ( new KeyValuePair < string , string > ( "db.query.text" , expectedStatement ) , prepareStmtNodeActivity . Tags . ToArray ( ) ) ;
713
+ Assert . IsNotNull ( prepareStmtNodeActivity . ParentId ) ;
714
+ var parentActivity = prepareStmtSessionActivities . Single ( a => a . SpanId == prepareStmtNodeActivity . ParentSpanId ) ;
715
+ ValidateSessionActivityAttributes ( parentActivity , typeof ( PrepareRequest ) ) ;
716
+ }
717
+ }
718
+
640
719
private async Task SimpleStatementMethodAsync ( ISession session )
641
720
{
642
721
var statement = new SimpleStatement ( "SELECT key FROM system.local" ) ;
0 commit comments