Skip to content

Commit b4b7877

Browse files
committed
fix tests
1 parent 5e128fb commit b4b7877

File tree

2 files changed

+112
-63
lines changed

2 files changed

+112
-63
lines changed

src/Cassandra.IntegrationTests/OpenTelemetry/OpenTelemetryTests.cs

Lines changed: 104 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -339,45 +339,24 @@ public void AddOpenTelemetry_WhenMethodIsInvokedAfterQuery_TraceIdIsTheSameThrou
339339
{
340340
var firstMethodName = "FirstMethod";
341341
var secondMethodName = "SecondMethod";
342+
var keyspace = TestUtils.GetUniqueKeyspaceName().ToLowerInvariant();
342343

343344
using (var _ = _internalActivitySource.StartActivity(firstMethodName, ActivityKind.Internal))
344345
{
345346
var cluster = GetNewTemporaryCluster(b => b.WithOpenTelemetryInstrumentation());
346347
var session = cluster.Connect();
347348

348-
var keyspace = TestUtils.GetUniqueKeyspaceName().ToLowerInvariant();
349349
session.CreateKeyspaceIfNotExists(keyspace);
350350
session.ChangeKeyspace(keyspace);
351351

352352
SimpleStatementMethod(session);
353353
LinqMethod(session);
354354
MapperMethod(session);
355355

356-
357356
SecondMethod(secondMethodName);
358357
}
359358

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);
381360
}
382361

383362
[Test]
@@ -387,12 +366,12 @@ public async Task AddOpenTelemetry_WhenMethodIsInvokedAfterQuery_TraceIdIsTheSam
387366
var firstMethodName = "FirstMethod";
388367
var secondMethodName = "SecondMethod";
389368

369+
var keyspace = TestUtils.GetUniqueKeyspaceName().ToLowerInvariant();
390370
using (var _ = _internalActivitySource.StartActivity(firstMethodName, ActivityKind.Internal))
391371
{
392372
var cluster = GetNewTemporaryCluster(b => b.WithOpenTelemetryInstrumentation());
393373
var session = await cluster.ConnectAsync().ConfigureAwait(false);
394374

395-
var keyspace = TestUtils.GetUniqueKeyspaceName().ToLowerInvariant();
396375
session.CreateKeyspaceIfNotExists(keyspace);
397376
session.ChangeKeyspace(keyspace);
398377

@@ -403,27 +382,7 @@ public async Task AddOpenTelemetry_WhenMethodIsInvokedAfterQuery_TraceIdIsTheSam
403382
SecondMethod(secondMethodName);
404383
}
405384

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);
427386
}
428387

429388
[Test]
@@ -684,27 +643,50 @@ public async Task AddOpenTelemetry_Mapper_ExpectedPrepareActivities(bool prepare
684643
await mapper.InsertAsync(songOne).ConfigureAwait(false);
685644

686645
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+
}
690658

691659
var allActivities = GetActivities(localDateTime).ToList();
692660
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();
694662
var prepareStmtSessionActivities = allActivities.Where(x => x.DisplayName == $"{SessionActivityName}({nameof(PrepareRequest)}) {keyspace}").ToList();
695663
var prepareStmtNodeActivities = allActivities.Where(x => x.DisplayName == $"{NodeActivityName}({nameof(PrepareRequest)}) {keyspace}").ToList();
696664

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+
}
700677

701678
var expectedStatement = $"INSERT INTO {keyspace}.song (Artist, Id, ReleaseDate, Title) VALUES (?, ?, ?, ?)";
702-
679+
Assert.IsNull(boundStmtSessionActivity.ParentId);
703680
ValidateSessionActivityAttributes(boundStmtSessionActivity, typeof(BoundStatement));
704-
ValidateNodeActivityAttributes(boundStmtNodeActivity, typeof(BoundStatement));
705681
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+
708690
foreach (var prepareStmtSessionActivity in prepareStmtSessionActivities)
709691
{
710692
ValidateSessionActivityAttributes(prepareStmtSessionActivity, typeof(PrepareRequest));
@@ -716,11 +698,73 @@ public async Task AddOpenTelemetry_Mapper_ExpectedPrepareActivities(bool prepare
716698
ValidateNodeActivityAttributes(prepareStmtNodeActivity, typeof(PrepareRequest));
717699
Assert.Contains(new KeyValuePair<string, string>("db.query.text", expectedStatement), prepareStmtNodeActivity.Tags.ToArray());
718700
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+
}
721716
}
722717
}
723718

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+
724768
private async Task SimpleStatementMethodAsync(ISession session)
725769
{
726770
var statement = new SimpleStatement("SELECT key FROM system.local");
@@ -839,14 +883,13 @@ private static void ValidateSessionActivityAttributes(Activity activity, Type st
839883
}
840884
}
841885

842-
private static void ValidateNodeActivityAttributes(Activity activity, Type statementType)
886+
private void ValidateNodeActivityAttributes(Activity activity, Type statementType)
843887
{
844888
var expectedActivityKind = ActivityKind.Client;
845889
var expectedTags = new Dictionary<string, string>()
846890
{
847891
{"db.system", "cassandra" },
848892
{"db.operation.name", $"Node_Request({statementType.Name})" },
849-
{"server.address", "127.0.0.1" },
850893
{"server.port", "9042" },
851894
};
852895

@@ -858,6 +901,7 @@ private static void ValidateNodeActivityAttributes(Activity activity, Type state
858901
{
859902
Assert.AreEqual(tags.FirstOrDefault(x => x.Key == pair.Key).Value, expectedTags[pair.Key]);
860903
}
904+
Assert.Contains(tags.FirstOrDefault(x => x.Key == "server.address").Value, Cluster.AllHosts().Select(h => h.Address.Address.ToString()).ToList());
861905
}
862906

863907
private void SecondMethod(string activityName)

src/Extensions/Cassandra.OpenTelemetry/OpenTelemetryRequestTracker.cs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ public virtual Task OnStartAsync(SessionRequestInfo sessionRequest)
6767
{
6868
var operationName = GetSessionOperationName(sessionRequest);
6969

70-
var keyspace = GetKeyspace(sessionRequest);
70+
var keyspace = GetKeyspaceFromSessionRequest(sessionRequest);
7171
var activity = ActivitySource.StartActivity(GetActivityName(operationName, keyspace), ActivityKind.Client);
7272

7373
if (activity == null)
@@ -247,7 +247,7 @@ public virtual Task OnNodeStartAsync(SessionRequestInfo sessionRequest, NodeRequ
247247
}
248248

249249
var operationName = GetNodeOperationName(sessionRequest, nodeRequestInfo);
250-
var keyspace = GetKeyspace(sessionRequest);
250+
var keyspace = GetKeyspaceFromNodeRequest(nodeRequestInfo) ?? GetKeyspaceFromSessionRequest(sessionRequest);
251251
var activity = ActivitySource.StartActivity(GetActivityName(operationName, keyspace), ActivityKind.Client, parentActivity.Context);
252252

253253
if (activity == null)
@@ -292,12 +292,17 @@ private string GetNodeOperationName(SessionRequestInfo sessionRequest, NodeReque
292292
return $"{NodeOperationName}({nodePrepareRequestName ?? sessionRequest.Statement?.GetType().Name ?? sessionRequest.PrepareRequest?.GetType().Name})";
293293
}
294294

295-
private string GetKeyspace(SessionRequestInfo sessionRequest)
295+
private string GetKeyspaceFromSessionRequest(SessionRequestInfo sessionRequest)
296296
{
297297
var ks = sessionRequest.Statement == null ? sessionRequest.PrepareRequest?.Keyspace : sessionRequest.Statement?.Keyspace;
298298
return ks ?? sessionRequest.SessionKeyspace;
299299
}
300300

301+
private string GetKeyspaceFromNodeRequest(NodeRequestInfo nodeRequestInfo)
302+
{
303+
return nodeRequestInfo.PrepareRequest?.Keyspace;
304+
}
305+
301306
private string GetQueryText(SessionRequestInfo sessionRequest)
302307
{
303308
return sessionRequest.Statement == null ? sessionRequest.PrepareRequest?.Query : GetQueryTextFromStatement(sessionRequest.Statement);

0 commit comments

Comments
 (0)