Skip to content

Commit 7a4d1c7

Browse files
committed
Added TracingSettings
Updated MicrometerTracer NOOP to remove dependency on ObservationRegistry
1 parent 9a3696e commit 7a4d1c7

File tree

8 files changed

+252
-89
lines changed

8 files changed

+252
-89
lines changed

driver-core/src/main/com/mongodb/MongoClientSettings.java

Lines changed: 21 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,10 @@
3030
import com.mongodb.connection.SslSettings;
3131
import com.mongodb.connection.TransportSettings;
3232
import com.mongodb.event.CommandListener;
33-
import com.mongodb.internal.VisibleForTesting;
3433
import com.mongodb.lang.Nullable;
3534
import com.mongodb.spi.dns.DnsClient;
3635
import com.mongodb.spi.dns.InetAddressResolver;
37-
import io.micrometer.observation.ObservationRegistry;
36+
import com.mongodb.tracing.TracingSettings;
3837
import org.bson.UuidRepresentation;
3938
import org.bson.codecs.BsonCodecProvider;
4039
import org.bson.codecs.BsonValueCodecProvider;
@@ -59,7 +58,6 @@
5958
import static com.mongodb.assertions.Assertions.isTrueArgument;
6059
import static com.mongodb.assertions.Assertions.notNull;
6160
import static com.mongodb.internal.TimeoutSettings.convertAndValidateTimeout;
62-
import static com.mongodb.internal.VisibleForTesting.AccessModifier.PRIVATE;
6361
import static java.util.Arrays.asList;
6462
import static java.util.concurrent.TimeUnit.MILLISECONDS;
6563
import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
@@ -119,18 +117,10 @@ public final class MongoClientSettings {
119117
private final ContextProvider contextProvider;
120118
private final DnsClient dnsClient;
121119
private final InetAddressResolver inetAddressResolver;
120+
private final TracingSettings tracingSettings;
122121
@Nullable
123122
private final Long timeoutMS;
124123

125-
@VisibleForTesting(otherwise = PRIVATE)
126-
// If set, this will enable/disable tracing even when an observationRegistry has been passed.
127-
public static final String ENV_OTEL_ENABLED = "OTEL_JAVA_INSTRUMENTATION_MONGODB_ENABLED";
128-
@VisibleForTesting(otherwise = PRIVATE)
129-
// If set, this will truncate the command payload captured in the tracing span to the specified length.
130-
public static final String ENV_OTEL_QUERY_TEXT_MAX_LENGTH = "OTEL_JAVA_INSTRUMENTATION_MONGODB_QUERY_TEXT_MAX_LENGTH";
131-
private final ObservationRegistry observationRegistry;
132-
private final boolean enableCommandPayloadTracing;
133-
134124
/**
135125
* Gets the default codec registry. It includes the following providers:
136126
*
@@ -235,6 +225,7 @@ public static final class Builder {
235225
private final ConnectionPoolSettings.Builder connectionPoolSettingsBuilder = ConnectionPoolSettings.builder();
236226
private final ServerSettings.Builder serverSettingsBuilder = ServerSettings.builder();
237227
private final SslSettings.Builder sslSettingsBuilder = SslSettings.builder();
228+
private final TracingSettings.Builder tracingSettingsBuilder = TracingSettings.builder();
238229
private MongoCredential credential;
239230
private String applicationName;
240231
private List<MongoCompressor> compressorList = Collections.emptyList();
@@ -250,8 +241,6 @@ public static final class Builder {
250241
private ContextProvider contextProvider;
251242
private DnsClient dnsClient;
252243
private InetAddressResolver inetAddressResolver;
253-
private ObservationRegistry observationRegistry;
254-
private boolean enableCommandPayloadTracing;
255244

256245
private Builder() {
257246
}
@@ -282,15 +271,14 @@ private Builder(final MongoClientSettings settings) {
282271
socketSettingsBuilder.applySettings(settings.getSocketSettings());
283272
connectionPoolSettingsBuilder.applySettings(settings.getConnectionPoolSettings());
284273
sslSettingsBuilder.applySettings(settings.getSslSettings());
274+
tracingSettingsBuilder.applySettings(settings.getTracingSettings());
285275

286276
if (settings.heartbeatConnectTimeoutSetExplicitly) {
287277
heartbeatConnectTimeoutMS = settings.heartbeatSocketSettings.getConnectTimeout(MILLISECONDS);
288278
}
289279
if (settings.heartbeatSocketTimeoutSetExplicitly) {
290280
heartbeatSocketTimeoutMS = settings.heartbeatSocketSettings.getReadTimeout(MILLISECONDS);
291281
}
292-
observationRegistry = settings.observationRegistry;
293-
enableCommandPayloadTracing = settings.enableCommandPayloadTracing;
294282
}
295283

296284
/**
@@ -415,6 +403,18 @@ public Builder applyToSslSettings(final Block<SslSettings.Builder> block) {
415403
return this;
416404
}
417405

406+
/**
407+
* Applies the {@link TracingSettings.Builder} block and then sets the tracingSettings.
408+
*
409+
* @param block the block to apply to the TracingSettings.
410+
* @return this
411+
* @see MongoClientSettings#getTracingSettings()
412+
*/
413+
public Builder applyToTracingSettings(final Block<TracingSettings.Builder> block) {
414+
notNull("block", block).apply(tracingSettingsBuilder);
415+
return this;
416+
}
417+
418418
/**
419419
* Sets the read preference.
420420
*
@@ -739,47 +739,6 @@ Builder heartbeatSocketTimeoutMS(final int heartbeatSocketTimeoutMS) {
739739
return this;
740740
}
741741

742-
/**
743-
* Sets the observation registry to use for creating tracing Spans for operations, commands and transactions.
744-
*
745-
* <p> If set the environment variable {@value ENV_OTEL_ENABLED} is used to enable or disable the creation of tracing spans.
746-
*
747-
* <p> If set the environment variable {@value ENV_OTEL_QUERY_TEXT_MAX_LENGTH} is used to determine the maximum length
748-
* of command payloads captured in tracing spans. If the environment variable is not set, the entire command payloads is
749-
* captured.
750-
*
751-
* @param observationRegistry the observation registry
752-
* @return this
753-
* @since 5.7
754-
*/
755-
@Alpha(Reason.CLIENT)
756-
public Builder observationRegistry(final ObservationRegistry observationRegistry) {
757-
this.observationRegistry = observationRegistry;
758-
return this;
759-
}
760-
761-
/**
762-
* Sets the observation registry to use for creating tracing Spans for operations, commands and transactions.
763-
*
764-
* <p> If set the environment variable {@value ENV_OTEL_ENABLED} is used to enable or disable the creation of tracing spans.
765-
*
766-
* <p> If set the environment variable {@value ENV_OTEL_QUERY_TEXT_MAX_LENGTH} is used to determine the maximum length
767-
* of command payloads captured in tracing spans. If the environment variable is not set, the entire command payloads is
768-
* captured.
769-
*
770-
* @param observationRegistry the observation registry
771-
* @param enableCommandPayload whether command payloads should be captured in tracing spans. This may have performance
772-
* implications so should be used with care.
773-
* @return this
774-
* @since 5.7
775-
*/
776-
@Alpha(Reason.CLIENT)
777-
public Builder observationRegistry(final ObservationRegistry observationRegistry, final boolean enableCommandPayload) {
778-
this.observationRegistry = observationRegistry;
779-
this.enableCommandPayloadTracing = enableCommandPayload;
780-
return this;
781-
}
782-
783742
/**
784743
* Build an instance of {@code MongoClientSettings}.
785744
*
@@ -1097,25 +1056,14 @@ public ContextProvider getContextProvider() {
10971056
return contextProvider;
10981057
}
10991058

1100-
/** Get the ObservationRegistry to create tracing Spans for operations, commands and transactions.
1059+
/** Get the tracing settings.
11011060
*
1102-
* @return the configured ObservationRegistry
1061+
* @return the configured TracingSettings
11031062
* @since 5.7
11041063
*/
1105-
@Nullable
11061064
@Alpha(Reason.CLIENT)
1107-
public ObservationRegistry getObservationRegistry() {
1108-
return observationRegistry;
1109-
}
1110-
1111-
/** Returns true if command payload tracing is enabled.
1112-
*
1113-
* @return the enableCommandPayloadTracing value
1114-
* @since 5.7
1115-
*/
1116-
@Alpha(Reason.CLIENT)
1117-
public boolean isCommandPayloadTracingEnabled() {
1118-
return enableCommandPayloadTracing;
1065+
public TracingSettings getTracingSettings() {
1066+
return tracingSettings;
11191067
}
11201068

11211069
@Override
@@ -1215,6 +1163,7 @@ private MongoClientSettings(final Builder builder) {
12151163
socketSettings = builder.socketSettingsBuilder.build();
12161164
connectionPoolSettings = builder.connectionPoolSettingsBuilder.build();
12171165
sslSettings = builder.sslSettingsBuilder.build();
1166+
tracingSettings = builder.tracingSettingsBuilder.build();
12181167
compressorList = builder.compressorList;
12191168
uuidRepresentation = builder.uuidRepresentation;
12201169
serverApi = builder.serverApi;
@@ -1234,8 +1183,5 @@ private MongoClientSettings(final Builder builder) {
12341183
heartbeatConnectTimeoutSetExplicitly = builder.heartbeatConnectTimeoutMS != 0;
12351184
contextProvider = builder.contextProvider;
12361185
timeoutMS = builder.timeoutMS;
1237-
1238-
observationRegistry = builder.observationRegistry;
1239-
enableCommandPayloadTracing = builder.enableCommandPayloadTracing;
12401186
}
12411187
}

driver-core/src/main/com/mongodb/internal/tracing/MicrometerTracer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,11 @@
3131
import java.io.PrintWriter;
3232
import java.io.StringWriter;
3333

34-
import static com.mongodb.MongoClientSettings.ENV_OTEL_QUERY_TEXT_MAX_LENGTH;
3534
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.EXCEPTION_MESSAGE;
3635
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.EXCEPTION_STACKTRACE;
3736
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.EXCEPTION_TYPE;
3837
import static com.mongodb.internal.tracing.MongodbObservation.MONGODB_OBSERVATION;
38+
import static com.mongodb.tracing.TracingSettings.ENV_OTEL_QUERY_TEXT_MAX_LENGTH;
3939
import static java.lang.System.getenv;
4040
import static java.util.Optional.ofNullable;
4141

driver-core/src/main/com/mongodb/internal/tracing/TracingManager.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,14 @@
2424
import com.mongodb.internal.connection.OperationContext;
2525
import com.mongodb.internal.session.SessionContext;
2626
import com.mongodb.lang.Nullable;
27+
import com.mongodb.tracing.TracingSettings;
2728
import io.micrometer.common.KeyValues;
2829
import io.micrometer.observation.ObservationRegistry;
2930
import org.bson.BsonDocument;
3031

3132
import java.util.function.Predicate;
3233
import java.util.function.Supplier;
3334

34-
import static com.mongodb.MongoClientSettings.ENV_OTEL_ENABLED;
3535
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.CLIENT_CONNECTION_ID;
3636
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.COLLECTION;
3737
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.COMMAND_NAME;
@@ -45,6 +45,7 @@
4545
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.SESSION_ID;
4646
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.SYSTEM;
4747
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.TRANSACTION_NUMBER;
48+
import static com.mongodb.tracing.TracingSettings.ENV_OTEL_ENABLED;
4849
import static java.lang.System.getenv;
4950

5051
/**
@@ -58,24 +59,24 @@ public class TracingManager {
5859
/**
5960
* A no-op instance of the TracingManager used when tracing is disabled.
6061
*/
61-
public static final TracingManager NO_OP = new TracingManager(ObservationRegistry.NOOP, false);
62+
public static final TracingManager NO_OP = new TracingManager(TracingSettings.builder().build());
6263
private final Tracer tracer;
6364
private final boolean enableCommandPayload;
6465

6566
/**
6667
* Constructs a new TracingManager with the specified observation registry.
6768
*
68-
* @param observationRegistry The observation registry to use for tracing operations, may be null.
69-
* @param enableCommandPayload Whether to enable command payload tracing.
69+
* @param settings The tracing settings
7070
*/
71-
public TracingManager(@Nullable final ObservationRegistry observationRegistry, final boolean enableCommandPayload) {
71+
public TracingManager(final TracingSettings settings) {
7272
String envOtelInstrumentationEnabled = getenv(ENV_OTEL_ENABLED);
7373
boolean enableTracing = true;
7474
if (envOtelInstrumentationEnabled != null) {
7575
enableTracing = Boolean.parseBoolean(envOtelInstrumentationEnabled);
7676
}
77+
ObservationRegistry observationRegistry = settings.getObservationRegistry();
7778
tracer = (observationRegistry == null) ? Tracer.NO_OP
78-
: (enableTracing) ? new MicrometerTracer(observationRegistry, enableCommandPayload)
79+
: (enableTracing) ? new MicrometerTracer(observationRegistry, settings.isEnableCommandPayloadTracing())
7980
: Tracer.NO_OP;
8081

8182
this.enableCommandPayload = tracer.includeCommandPayload();

0 commit comments

Comments
 (0)