Skip to content

Commit d64a7a1

Browse files
committed
Modifying UnifiedTest runner to support collecting Micrometer spans
1 parent 94390c6 commit d64a7a1

File tree

4 files changed

+67
-2
lines changed

4 files changed

+67
-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: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,10 @@
4343
import com.mongodb.lang.Nullable;
4444
import com.mongodb.logging.TestLoggingInterceptor;
4545
import com.mongodb.test.AfterBeforeParameterResolver;
46+
import io.micrometer.tracing.Tracer;
47+
import io.micrometer.tracing.test.simple.SimpleSpan;
48+
import io.micrometer.tracing.test.simple.SimpleTracer;
49+
import io.micrometer.tracing.test.simple.SpanAssert;
4650
import org.bson.BsonArray;
4751
import org.bson.BsonBoolean;
4852
import org.bson.BsonDocument;
@@ -67,8 +71,10 @@
6771
import java.util.Arrays;
6872
import java.util.Collection;
6973
import java.util.Collections;
74+
import java.util.Deque;
7075
import java.util.HashSet;
7176
import java.util.List;
77+
import java.util.Map;
7278
import java.util.Set;
7379
import java.util.concurrent.ExecutionException;
7480
import java.util.concurrent.ExecutorService;
@@ -375,6 +381,11 @@ public void shouldPassAllOutcomes(
375381
}
376382
compareLogMessages(rootContext, definition, tweaks);
377383
}
384+
385+
if (definition.containsKey("expectTracingSpans")) {
386+
compareTracingSpans(definition);
387+
}
388+
378389
} catch (TestAbortedException e) {
379390
// if a test is ignored, we do not retry
380391
throw e;
@@ -455,6 +466,42 @@ private void compareLogMessages(final UnifiedTestContext rootContext, final Bson
455466
}
456467
}
457468

469+
private void compareTracingSpans(final BsonDocument definition) {
470+
BsonDocument curTracingSpansForClient = definition.getDocument("expectTracingSpans");
471+
String clientId = curTracingSpansForClient.getString("client").getValue();
472+
473+
// Get the tracer for the client
474+
Tracer micrometerTracer = entities.getClientTracer(clientId);
475+
SimpleTracer simpleTracer = (SimpleTracer) micrometerTracer;
476+
477+
// Get the list of expected spans
478+
BsonArray expectedSpans = curTracingSpansForClient.getArray("spans");
479+
480+
// Get the actual reported spans
481+
Deque<SimpleSpan> reportedSpans = simpleTracer.getSpans();
482+
483+
// First assert that we have at least the number of expected spans
484+
assertEquals(reportedSpans.size(), expectedSpans.size(), "Expected at least " + expectedSpans.size() + " spans, but found " + reportedSpans.size());
485+
486+
for (BsonValue expectedSpan : expectedSpans) {
487+
BsonDocument expectedSpanDoc = expectedSpan.asDocument();
488+
String expectedName = expectedSpanDoc.getString("name").getValue();
489+
BsonDocument expectedTags = expectedSpanDoc.getDocument("tags");
490+
491+
SimpleSpan reportedSpan = reportedSpans.pop();
492+
493+
SpanAssert.assertThat(reportedSpan)
494+
.hasNameEqualTo(expectedName);
495+
496+
if (!expectedTags.isEmpty()) {
497+
for (Map.Entry<String, BsonValue> tag : expectedTags.entrySet()) {
498+
SpanAssert.assertThat(reportedSpan)
499+
.hasTag(tag.getKey(), tag.getValue().asString().getValue());
500+
}
501+
}
502+
}
503+
}
504+
458505
private void assertOutcome(final UnifiedTestContext context) {
459506
for (BsonValue cur : definition.getArray("outcome")) {
460507
BsonDocument curDocument = cur.asDocument();

0 commit comments

Comments
 (0)