Skip to content

Commit e6f3f2f

Browse files
committed
Modifying UnifiedTest runner to support collecting Micrometer spans
1 parent 9f3358b commit e6f3f2f

File tree

4 files changed

+66
-2
lines changed

4 files changed

+66
-2
lines changed

driver-sync/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ dependencies {
3838

3939
// lambda testing
4040
testImplementation(libs.aws.lambda.core)
41+
42+
testImplementation("io.micrometer:micrometer-tracing-test:1.4.5")
4143
}
4244

4345
configureMavenPublication {

driver-sync/src/test/functional/com/mongodb/client/unified/Entities.java

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@
6666
import com.mongodb.lang.NonNull;
6767
import com.mongodb.lang.Nullable;
6868
import com.mongodb.logging.TestLoggingInterceptor;
69+
import com.mongodb.tracing.MicrometerTracer;
70+
import io.micrometer.tracing.Tracer;
71+
import io.micrometer.tracing.test.simple.SimpleTracer;
6972
import org.bson.BsonArray;
7073
import org.bson.BsonBoolean;
7174
import org.bson.BsonDocument;
@@ -112,7 +115,7 @@ public final class Entities {
112115
private static final Set<String> SUPPORTED_CLIENT_ENTITY_OPTIONS = new HashSet<>(
113116
asList(
114117
"id", "uriOptions", "serverApi", "useMultipleMongoses", "storeEventsAsEntities",
115-
"observeEvents", "observeLogMessages", "observeSensitiveCommands", "ignoreCommandMonitoringEvents"));
118+
"observeEvents", "observeLogMessages", "observeSensitiveCommands", "ignoreCommandMonitoringEvents", "tracing"));
116119
private final Set<String> entityNames = new HashSet<>();
117120
private final Map<String, ExecutorService> threads = new HashMap<>();
118121
private final Map<String, ArrayList<Future<?>>> tasks = new HashMap<>();
@@ -126,6 +129,7 @@ public final class Entities {
126129
private final Map<String, ClientEncryption> clientEncryptions = new HashMap<>();
127130
private final Map<String, TestCommandListener> clientCommandListeners = new HashMap<>();
128131
private final Map<String, TestLoggingInterceptor> clientLoggingInterceptors = new HashMap<>();
132+
private final Map<String, Tracer> clientTracing = new HashMap<>();
129133
private final Map<String, TestConnectionPoolListener> clientConnectionPoolListeners = new HashMap<>();
130134
private final Map<String, TestServerListener> clientServerListeners = new HashMap<>();
131135
private final Map<String, TestClusterListener> clientClusterListeners = new HashMap<>();
@@ -294,6 +298,10 @@ public TestLoggingInterceptor getClientLoggingInterceptor(final String id) {
294298
return getEntity(id + "-logging-interceptor", clientLoggingInterceptors, "logging interceptor");
295299
}
296300

301+
public Tracer getClientTracer(final String id) {
302+
return getEntity(id + "-tracing", clientTracing, "micrometer tracing");
303+
}
304+
297305
public TestConnectionPoolListener getConnectionPoolListener(final String id) {
298306
return getEntity(id + "-connection-pool-listener", clientConnectionPoolListeners, "connection pool listener");
299307
}
@@ -604,6 +612,14 @@ private void initClient(final BsonDocument entity, final String id,
604612
}
605613
clientSettingsBuilder.serverApi(serverApiBuilder.build());
606614
}
615+
616+
if (entity.containsKey("tracing") && entity.getBoolean("tracing").getValue()) {
617+
Tracer tracer = new SimpleTracer();
618+
putEntity(id + "-tracing", tracer, clientTracing);
619+
620+
clientSettingsBuilder.tracer(new MicrometerTracer(tracer));
621+
}
622+
607623
MongoClientSettings clientSettings = clientSettingsBuilder.build();
608624

609625
if (entity.containsKey("observeLogMessages")) {

driver-sync/src/test/functional/com/mongodb/client/unified/UnifiedTest.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,10 @@
4444
import com.mongodb.lang.Nullable;
4545
import com.mongodb.logging.TestLoggingInterceptor;
4646
import com.mongodb.test.AfterBeforeParameterResolver;
47+
import io.micrometer.tracing.Tracer;
48+
import io.micrometer.tracing.test.simple.SimpleSpan;
49+
import io.micrometer.tracing.test.simple.SimpleTracer;
50+
import io.micrometer.tracing.test.simple.SpanAssert;
4751
import org.bson.BsonArray;
4852
import org.bson.BsonBoolean;
4953
import org.bson.BsonDocument;
@@ -68,6 +72,7 @@
6872
import java.util.Arrays;
6973
import java.util.Collection;
7074
import java.util.Collections;
75+
import java.util.Deque;
7176
import java.util.HashSet;
7277
import java.util.List;
7378
import java.util.Map;
@@ -380,6 +385,11 @@ public void shouldPassAllOutcomes(
380385
}
381386
compareLogMessages(rootContext, definition, tweaks);
382387
}
388+
389+
if (definition.containsKey("expectTracingSpans")) {
390+
compareTracingSpans(definition);
391+
}
392+
383393
} catch (TestAbortedException e) {
384394
// if a test is ignored, we do not retry
385395
throw e;
@@ -487,6 +497,42 @@ private void compareLogMessages(final UnifiedTestContext rootContext, final Bson
487497
}
488498
}
489499

500+
private void compareTracingSpans(final BsonDocument definition) {
501+
BsonDocument curTracingSpansForClient = definition.getDocument("expectTracingSpans");
502+
String clientId = curTracingSpansForClient.getString("client").getValue();
503+
504+
// Get the tracer for the client
505+
Tracer micrometerTracer = entities.getClientTracer(clientId);
506+
SimpleTracer simpleTracer = (SimpleTracer) micrometerTracer;
507+
508+
// Get the list of expected spans
509+
BsonArray expectedSpans = curTracingSpansForClient.getArray("spans");
510+
511+
// Get the actual reported spans
512+
Deque<SimpleSpan> reportedSpans = simpleTracer.getSpans();
513+
514+
// First assert that we have at least the number of expected spans
515+
assertEquals(reportedSpans.size(), expectedSpans.size(), "Expected at least " + expectedSpans.size() + " spans, but found " + reportedSpans.size());
516+
517+
for (BsonValue expectedSpan : expectedSpans) {
518+
BsonDocument expectedSpanDoc = expectedSpan.asDocument();
519+
String expectedName = expectedSpanDoc.getString("name").getValue();
520+
BsonDocument expectedTags = expectedSpanDoc.getDocument("tags");
521+
522+
SimpleSpan reportedSpan = reportedSpans.pop();
523+
524+
SpanAssert.assertThat(reportedSpan)
525+
.hasNameEqualTo(expectedName);
526+
527+
if (!expectedTags.isEmpty()) {
528+
for (Map.Entry<String, BsonValue> tag : expectedTags.entrySet()) {
529+
SpanAssert.assertThat(reportedSpan)
530+
.hasTag(tag.getKey(), tag.getValue().asString().getValue());
531+
}
532+
}
533+
}
534+
}
535+
490536
private void assertOutcome(final UnifiedTestContext context) {
491537
for (BsonValue cur : definition.getArray("outcome")) {
492538
BsonDocument curDocument = cur.asDocument();

0 commit comments

Comments
 (0)