Skip to content

Commit d4df11b

Browse files
committed
PR feedback refactoring:
- Moving Micrometer interfaces into internal package - Using an instance of ObservabilityRegistry instead of MicrometerTracer in the builder - Using bom deps
1 parent 427554b commit d4df11b

File tree

24 files changed

+146
-129
lines changed

24 files changed

+146
-129
lines changed

driver-core/build.gradle.kts

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

5555
optionalImplementation(libs.snappy.java)
5656
optionalImplementation(libs.zstd.jni)
57+
58+
optionalImplementation(platform(libs.micrometer.observation.bom))
5759
optionalImplementation(libs.micrometer.observation)
5860

5961
testImplementation(project(path = ":bson", configuration = "testArtifacts"))

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

Lines changed: 61 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
import com.mongodb.lang.Nullable;
3535
import com.mongodb.spi.dns.DnsClient;
3636
import com.mongodb.spi.dns.InetAddressResolver;
37-
import com.mongodb.tracing.Tracer;
37+
import io.micrometer.observation.ObservationRegistry;
3838
import org.bson.UuidRepresentation;
3939
import org.bson.codecs.BsonCodecProvider;
4040
import org.bson.codecs.BsonValueCodecProvider;
@@ -60,7 +60,6 @@
6060
import static com.mongodb.assertions.Assertions.notNull;
6161
import static com.mongodb.internal.TimeoutSettings.convertAndValidateTimeout;
6262
import static com.mongodb.internal.VisibleForTesting.AccessModifier.PRIVATE;
63-
import static java.lang.System.getenv;
6463
import static java.util.Arrays.asList;
6564
import static java.util.concurrent.TimeUnit.MILLISECONDS;
6665
import static org.bson.codecs.configuration.CodecRegistries.fromProviders;
@@ -124,8 +123,13 @@ public final class MongoClientSettings {
124123
private final Long timeoutMS;
125124

126125
@VisibleForTesting(otherwise = PRIVATE)
126+
// If set, this will enable/disable tracing even when an observationRegistry has been passed.
127127
public static final String ENV_OTEL_ENABLED = "OTEL_JAVA_INSTRUMENTATION_MONGODB_ENABLED";
128-
private final Tracer tracer;
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;
129133

130134
/**
131135
* Gets the default codec registry. It includes the following providers:
@@ -246,7 +250,8 @@ public static final class Builder {
246250
private ContextProvider contextProvider;
247251
private DnsClient dnsClient;
248252
private InetAddressResolver inetAddressResolver;
249-
private Tracer tracer;
253+
private ObservationRegistry observationRegistry;
254+
private boolean enableCommandPayloadTracing;
250255

251256
private Builder() {
252257
}
@@ -284,7 +289,8 @@ private Builder(final MongoClientSettings settings) {
284289
if (settings.heartbeatSocketTimeoutSetExplicitly) {
285290
heartbeatSocketTimeoutMS = settings.heartbeatSocketSettings.getReadTimeout(MILLISECONDS);
286291
}
287-
tracer = settings.tracer;
292+
observationRegistry = settings.observationRegistry;
293+
enableCommandPayloadTracing = settings.enableCommandPayloadTracing;
288294
}
289295

290296
/**
@@ -734,16 +740,43 @@ Builder heartbeatSocketTimeoutMS(final int heartbeatSocketTimeoutMS) {
734740
}
735741

736742
/**
737-
* Sets the tracer to use for creating Spans for operations, commands and transactions.
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.
738763
*
739-
* @param tracer the tracer
740-
* @see com.mongodb.tracing.MicrometerTracer
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.
741773
* @return this
742774
* @since 5.7
743775
*/
744776
@Alpha(Reason.CLIENT)
745-
public Builder tracer(final Tracer tracer) {
746-
this.tracer = tracer;
777+
public Builder observationRegistry(final ObservationRegistry observationRegistry, final boolean enableCommandPayload) {
778+
this.observationRegistry = observationRegistry;
779+
this.enableCommandPayloadTracing = enableCommandPayload;
747780
return this;
748781
}
749782

@@ -1064,14 +1097,25 @@ public ContextProvider getContextProvider() {
10641097
return contextProvider;
10651098
}
10661099

1067-
/**
1068-
* Get the tracer to create Spans for operations, commands and transactions.
1100+
/** Get the ObservationRegistry to create tracing Spans for operations, commands and transactions.
1101+
*
1102+
* @return the configured ObservationRegistry
1103+
* @since 5.7
1104+
*/
1105+
@Nullable
1106+
@Alpha(Reason.CLIENT)
1107+
public ObservationRegistry getObservationRegistry() {
1108+
return observationRegistry;
1109+
}
1110+
1111+
/** Returns true if command payload tracing is enabled.
10691112
*
1070-
* @return the configured Tracer
1113+
* @return the enableCommandPayloadTracing value
10711114
* @since 5.7
10721115
*/
1073-
public Tracer getTracer() {
1074-
return tracer;
1116+
@Alpha(Reason.CLIENT)
1117+
public boolean isCommandPayloadTracingEnabled() {
1118+
return enableCommandPayloadTracing;
10751119
}
10761120

10771121
@Override
@@ -1191,13 +1235,7 @@ private MongoClientSettings(final Builder builder) {
11911235
contextProvider = builder.contextProvider;
11921236
timeoutMS = builder.timeoutMS;
11931237

1194-
String envOtelInstrumentationEnabled = getenv(ENV_OTEL_ENABLED);
1195-
boolean enableTracing = true;
1196-
if (envOtelInstrumentationEnabled != null) {
1197-
enableTracing = Boolean.parseBoolean(envOtelInstrumentationEnabled);
1198-
}
1199-
tracer = (builder.tracer == null) ? Tracer.NO_OP
1200-
: (enableTracing) ? builder.tracer
1201-
: Tracer.NO_OP;
1238+
observationRegistry = builder.observationRegistry;
1239+
enableCommandPayloadTracing = builder.enableCommandPayloadTracing;
12021240
}
12031241
}

driver-core/src/main/com/mongodb/internal/connection/InternalStreamConnection.java

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353
import com.mongodb.internal.logging.StructuredLogger;
5454
import com.mongodb.internal.session.SessionContext;
5555
import com.mongodb.internal.time.Timeout;
56-
import com.mongodb.tracing.Span;
56+
import com.mongodb.internal.tracing.Span;
5757
import com.mongodb.internal.tracing.TracingManager;
5858
import com.mongodb.lang.Nullable;
5959
import io.micrometer.common.KeyValues;
@@ -99,22 +99,22 @@
9999
import static com.mongodb.internal.connection.ProtocolHelper.isCommandOk;
100100
import static com.mongodb.internal.logging.LogMessage.Level.DEBUG;
101101
import static com.mongodb.internal.thread.InterruptionUtil.translateInterruptedException;
102-
import static com.mongodb.tracing.MongodbObservation.HighCardinalityKeyNames.QUERY_TEXT;
103-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.CLIENT_CONNECTION_ID;
104-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.COLLECTION;
105-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.COMMAND_NAME;
106-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.CURSOR_ID;
107-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.NAMESPACE;
108-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.NETWORK_TRANSPORT;
109-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.QUERY_SUMMARY;
110-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.RESPONSE_STATUS_CODE;
111-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.SERVER_ADDRESS;
112-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.SERVER_CONNECTION_ID;
113-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.SERVER_PORT;
114-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.SERVER_TYPE;
115-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.SESSION_ID;
116-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.SYSTEM;
117-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.TRANSACTION_NUMBER;
102+
import static com.mongodb.internal.tracing.MongodbObservation.HighCardinalityKeyNames.QUERY_TEXT;
103+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.CLIENT_CONNECTION_ID;
104+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.COLLECTION;
105+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.COMMAND_NAME;
106+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.CURSOR_ID;
107+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.NAMESPACE;
108+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.NETWORK_TRANSPORT;
109+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.QUERY_SUMMARY;
110+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.RESPONSE_STATUS_CODE;
111+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.SERVER_ADDRESS;
112+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.SERVER_CONNECTION_ID;
113+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.SERVER_PORT;
114+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.SERVER_TYPE;
115+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.SESSION_ID;
116+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.SYSTEM;
117+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.TRANSACTION_NUMBER;
118118
import static java.util.Arrays.asList;
119119

120120
/**

driver-core/src/main/com/mongodb/internal/connection/OperationContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
import com.mongodb.internal.TimeoutSettings;
2828
import com.mongodb.internal.VisibleForTesting;
2929
import com.mongodb.internal.session.SessionContext;
30-
import com.mongodb.tracing.Span;
30+
import com.mongodb.internal.tracing.Span;
3131
import com.mongodb.internal.tracing.TracingManager;
3232
import com.mongodb.lang.Nullable;
3333
import com.mongodb.selector.ServerSelector;

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

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,9 @@
1414
* limitations under the License.
1515
*/
1616

17-
package com.mongodb.tracing;
17+
package com.mongodb.internal.tracing;
1818

1919
import com.mongodb.MongoNamespace;
20-
import com.mongodb.internal.VisibleForTesting;
2120
import com.mongodb.lang.Nullable;
2221
import io.micrometer.common.KeyValue;
2322
import io.micrometer.common.KeyValues;
@@ -32,11 +31,11 @@
3231
import java.io.PrintWriter;
3332
import java.io.StringWriter;
3433

35-
import static com.mongodb.internal.VisibleForTesting.AccessModifier.PRIVATE;
36-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.EXCEPTION_MESSAGE;
37-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.EXCEPTION_STACKTRACE;
38-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.EXCEPTION_TYPE;
39-
import static com.mongodb.tracing.MongodbObservation.MONGODB_OBSERVATION;
34+
import static com.mongodb.MongoClientSettings.ENV_OTEL_QUERY_TEXT_MAX_LENGTH;
35+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.EXCEPTION_MESSAGE;
36+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.EXCEPTION_STACKTRACE;
37+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.EXCEPTION_TYPE;
38+
import static com.mongodb.internal.tracing.MongodbObservation.MONGODB_OBSERVATION;
4039
import static java.lang.System.getenv;
4140
import static java.util.Optional.ofNullable;
4241

@@ -51,9 +50,6 @@
5150
* @since 5.7
5251
*/
5352
public class MicrometerTracer implements Tracer {
54-
@VisibleForTesting(otherwise = PRIVATE)
55-
public static final String ENV_OTEL_QUERY_TEXT_MAX_LENGTH = "OTEL_JAVA_INSTRUMENTATION_MONGODB_QUERY_TEXT_MAX_LENGTH";
56-
5753
private final ObservationRegistry observationRegistry;
5854
private final boolean allowCommandPayload;
5955
private final int textMaxLength;

driver-core/src/main/com/mongodb/tracing/MongodbObservation.java renamed to driver-core/src/main/com/mongodb/internal/tracing/MongodbObservation.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
package com.mongodb.tracing;
17+
package com.mongodb.internal.tracing;
1818

1919
import io.micrometer.common.docs.KeyName;
2020
import io.micrometer.observation.Observation;

driver-core/src/main/com/mongodb/tracing/Span.java renamed to driver-core/src/main/com/mongodb/internal/tracing/Span.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
package com.mongodb.tracing;
17+
package com.mongodb.internal.tracing;
1818

1919
import com.mongodb.MongoNamespace;
2020
import com.mongodb.lang.Nullable;

driver-core/src/main/com/mongodb/tracing/TraceContext.java renamed to driver-core/src/main/com/mongodb/internal/tracing/TraceContext.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
* limitations under the License.
1515
*/
1616

17-
package com.mongodb.tracing;
17+
package com.mongodb.internal.tracing;
1818

1919
@SuppressWarnings("InterfaceIsType")
2020
public interface TraceContext {

driver-core/src/main/com/mongodb/tracing/Tracer.java renamed to driver-core/src/main/com/mongodb/internal/tracing/Tracer.java

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* See the License for the specific language governing permissions and
1414
* limitations under the License.
1515
*/
16-
package com.mongodb.tracing;
16+
package com.mongodb.internal.tracing;
1717

1818
import com.mongodb.MongoNamespace;
1919
import com.mongodb.lang.Nullable;
@@ -25,10 +25,6 @@
2525
* It also includes a no-operation (NO_OP) implementation for cases where tracing is not required.
2626
* </p>
2727
*
28-
* Note: You can use the environment variable {@code OTEL_JAVA_INSTRUMENTATION_MONGODB_ENABLED} to override the behaviour of enabling/disabling
29-
* tracing before you create the {@link com.mongodb.MongoClientSettings} instance.
30-
* You can also use the environment variable {@code OTEL_JAVA_INSTRUMENTATION_MONGODB_QUERY_TEXT_MAX_LENGTH} to enable or disable command payload when tracing is enabled. .
31-
*
3228
* @since 5.7
3329
*/
3430
public interface Tracer {

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

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,11 @@
1818

1919
import com.mongodb.MongoNamespace;
2020
import com.mongodb.lang.Nullable;
21-
import com.mongodb.tracing.Span;
22-
import com.mongodb.tracing.TraceContext;
23-
import com.mongodb.tracing.Tracer;
21+
import io.micrometer.observation.ObservationRegistry;
2422

25-
import static com.mongodb.tracing.MongodbObservation.LowCardinalityKeyNames.SYSTEM;
23+
import static com.mongodb.MongoClientSettings.ENV_OTEL_ENABLED;
24+
import static com.mongodb.internal.tracing.MongodbObservation.LowCardinalityKeyNames.SYSTEM;
25+
import static java.lang.System.getenv;
2626

2727
/**
2828
* Manages tracing spans for MongoDB driver activities.
@@ -35,18 +35,26 @@ public class TracingManager {
3535
/**
3636
* A no-op instance of the TracingManager used when tracing is disabled.
3737
*/
38-
public static final TracingManager NO_OP = new TracingManager(Tracer.NO_OP);
38+
public static final TracingManager NO_OP = new TracingManager(ObservationRegistry.NOOP, false);
3939
private final Tracer tracer;
4040
private final boolean enableCommandPayload;
4141

4242
/**
43-
* Constructs a new TracingManager with the specified tracer and parent context.
44-
* Setting the environment variable {@code OTEL_JAVA_INSTRUMENTATION_MONGODB_QUERY_TEXT_MAX_LENGTH} will enable command payload tracing.
43+
* Constructs a new TracingManager with the specified observation registry.
4544
*
46-
* @param tracer The tracer to use for tracing operations.
45+
* @param observationRegistry The observation registry to use for tracing operations, may be null.
46+
* @param enableCommandPayload Whether to enable command payload tracing.
4747
*/
48-
public TracingManager(final Tracer tracer) {
49-
this.tracer = tracer;
48+
public TracingManager(@Nullable final ObservationRegistry observationRegistry, final boolean enableCommandPayload) {
49+
String envOtelInstrumentationEnabled = getenv(ENV_OTEL_ENABLED);
50+
boolean enableTracing = true;
51+
if (envOtelInstrumentationEnabled != null) {
52+
enableTracing = Boolean.parseBoolean(envOtelInstrumentationEnabled);
53+
}
54+
tracer = (observationRegistry == null) ? Tracer.NO_OP
55+
: (enableTracing) ? new MicrometerTracer(observationRegistry, enableCommandPayload)
56+
: Tracer.NO_OP;
57+
5058
this.enableCommandPayload = tracer.includeCommandPayload();
5159
}
5260

0 commit comments

Comments
 (0)