diff --git a/docs/instrumentation-list.yaml b/docs/instrumentation-list.yaml index 89c78da55f65..9e4381b43b8e 100644 --- a/docs/instrumentation-list.yaml +++ b/docs/instrumentation-list.yaml @@ -8250,6 +8250,13 @@ libraries: - io.micrometer:micrometer-core:1.5.0 mongo: - name: mongo-3.1 + display_name: MongoDB Driver + description: | + This instrumentation enables database client spans and database client metrics for the MongoDB Java driver. + semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS + library_link: https://www.mongodb.com/docs/drivers/java-drivers/ source_path: instrumentation/mongo/mongo-3.1 scope: name: io.opentelemetry.mongo-3.1 @@ -8258,7 +8265,81 @@ libraries: - org.mongodb:mongo-java-driver:[3.1,) library: - org.mongodb:mongo-java-driver:3.1.0 + configurations: + - name: otel.instrumentation.mongo.statement-sanitizer.enabled + description: | + Enables statement sanitization for MongoDB queries. Takes precedence over otel.instrumentation.common.db-statement-sanitizer.enabled. + type: boolean + default: true + - name: otel.instrumentation.common.db-statement-sanitizer.enabled + description: Enables statement sanitization for database queries. + type: boolean + default: true + telemetry: + - when: default + spans: + - span_kind: CLIENT + attributes: + - name: db.connection_string + type: STRING + - name: db.mongodb.collection + type: STRING + - name: db.name + type: STRING + - name: db.operation + type: STRING + - name: db.statement + type: STRING + - name: db.system + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.operation.duration + description: Duration of database client operations. + type: HISTOGRAM + unit: s + attributes: + - name: db.collection.name + type: STRING + - name: db.namespace + type: STRING + - name: db.operation.name + type: STRING + - name: db.system.name + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG + spans: + - span_kind: CLIENT + attributes: + - name: db.collection.name + type: STRING + - name: db.namespace + type: STRING + - name: db.operation.name + type: STRING + - name: db.query.text + type: STRING + - name: db.system.name + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG - name: mongo-3.7 + display_name: MongoDB Driver + description: | + This instrumentation enables database client spans and database client metrics for the MongoDB Java driver. + semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS + library_link: https://www.mongodb.com/docs/drivers/java-drivers/ source_path: instrumentation/mongo/mongo-3.7 scope: name: io.opentelemetry.mongo-3.7 @@ -8266,20 +8347,235 @@ libraries: javaagent: - org.mongodb:mongodb-driver-core:[3.7, 4.0) - org.mongodb:mongo-java-driver:[3.7, 4.0) + configurations: + - name: otel.instrumentation.mongo.statement-sanitizer.enabled + description: | + Enables statement sanitization for MongoDB queries. Takes precedence over otel.instrumentation.common.db-statement-sanitizer.enabled. + type: boolean + default: true + - name: otel.instrumentation.common.db-statement-sanitizer.enabled + description: Enables statement sanitization for database queries. + type: boolean + default: true + telemetry: + - when: default + spans: + - span_kind: CLIENT + attributes: + - name: db.connection_string + type: STRING + - name: db.mongodb.collection + type: STRING + - name: db.name + type: STRING + - name: db.operation + type: STRING + - name: db.statement + type: STRING + - name: db.system + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.operation.duration + description: Duration of database client operations. + type: HISTOGRAM + unit: s + attributes: + - name: db.collection.name + type: STRING + - name: db.namespace + type: STRING + - name: db.operation.name + type: STRING + - name: db.system.name + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG + spans: + - span_kind: CLIENT + attributes: + - name: db.collection.name + type: STRING + - name: db.namespace + type: STRING + - name: db.operation.name + type: STRING + - name: db.query.text + type: STRING + - name: db.system.name + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG - name: mongo-4.0 + display_name: MongoDB Driver + description: | + This instrumentation enables database client spans and database client metrics for the MongoDB Java driver. + semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS + library_link: https://www.mongodb.com/docs/drivers/java-drivers/ source_path: instrumentation/mongo/mongo-4.0 scope: name: io.opentelemetry.mongo-4.0 target_versions: javaagent: - org.mongodb:mongodb-driver-core:[4.0,) + configurations: + - name: otel.instrumentation.mongo.statement-sanitizer.enabled + description: | + Enables statement sanitization for MongoDB queries. Takes precedence over otel.instrumentation.common.db-statement-sanitizer.enabled. + type: boolean + default: true + - name: otel.instrumentation.common.db-statement-sanitizer.enabled + description: Enables statement sanitization for database queries. + type: boolean + default: true + telemetry: + - when: default + spans: + - span_kind: CLIENT + attributes: + - name: db.connection_string + type: STRING + - name: db.mongodb.collection + type: STRING + - name: db.name + type: STRING + - name: db.operation + type: STRING + - name: db.statement + type: STRING + - name: db.system + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.operation.duration + description: Duration of database client operations. + type: HISTOGRAM + unit: s + attributes: + - name: db.collection.name + type: STRING + - name: db.namespace + type: STRING + - name: db.operation.name + type: STRING + - name: db.system.name + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG + spans: + - span_kind: CLIENT + attributes: + - name: db.collection.name + type: STRING + - name: db.namespace + type: STRING + - name: db.operation.name + type: STRING + - name: db.query.text + type: STRING + - name: db.system.name + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG - name: mongo-async-3.3 + display_name: MongoDB Driver (Async) + description: | + This instrumentation enables database client spans and database client metrics for the MongoDB async Java driver. + semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS + library_link: https://www.mongodb.com/docs/drivers/java-drivers/ source_path: instrumentation/mongo/mongo-async-3.3 scope: name: io.opentelemetry.mongo-async-3.3 target_versions: javaagent: - org.mongodb:mongodb-driver-async:[3.3,) + configurations: + - name: otel.instrumentation.mongo.statement-sanitizer.enabled + description: | + Enables statement sanitization for MongoDB queries. Takes precedence over otel.instrumentation.common.db-statement-sanitizer.enabled. + type: boolean + default: true + - name: otel.instrumentation.common.db-statement-sanitizer.enabled + description: Enables statement sanitization for database queries. + type: boolean + default: true + telemetry: + - when: default + spans: + - span_kind: CLIENT + attributes: + - name: db.connection_string + type: STRING + - name: db.mongodb.collection + type: STRING + - name: db.name + type: STRING + - name: db.operation + type: STRING + - name: db.statement + type: STRING + - name: db.system + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.operation.duration + description: Duration of database client operations. + type: HISTOGRAM + unit: s + attributes: + - name: db.collection.name + type: STRING + - name: db.namespace + type: STRING + - name: db.operation.name + type: STRING + - name: db.system.name + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG + spans: + - span_kind: CLIENT + attributes: + - name: db.collection.name + type: STRING + - name: db.namespace + type: STRING + - name: db.operation.name + type: STRING + - name: db.query.text + type: STRING + - name: db.system.name + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG mybatis: - name: mybatis-3.2 display_name: MyBatis diff --git a/instrumentation-docs/instrumentations.sh b/instrumentation-docs/instrumentations.sh index 18e56b883ab1..7b0599cd8521 100755 --- a/instrumentation-docs/instrumentations.sh +++ b/instrumentation-docs/instrumentations.sh @@ -166,6 +166,14 @@ readonly INSTRUMENTATIONS=( "lettuce:lettuce-5.0:javaagent:testStableSemconv" "lettuce:lettuce-5.1:javaagent:test" "lettuce:lettuce-5.1:javaagent:testStableSemconv" + "mongo:mongo-3.1:javaagent:test" + "mongo:mongo-3.1:javaagent:testStableSemconv" + "mongo:mongo-3.7:javaagent:test" + "mongo:mongo-3.7:javaagent:testStableSemconv" + "mongo:mongo-4.0:javaagent:test" + "mongo:mongo-4.0:javaagent:testStableSemconv" + "mongo:mongo-async-3.3:javaagent:test" + "mongo:mongo-async-3.3:javaagent:testStableSemconv" "mybatis-3.2:javaagent:test" "nats:nats-2.17:javaagent:test" "nats:nats-2.17:javaagent:testExperimental" diff --git a/instrumentation/mongo/mongo-3.1/javaagent/build.gradle.kts b/instrumentation/mongo/mongo-3.1/javaagent/build.gradle.kts index 6aae40ef6776..b6d8895627d1 100644 --- a/instrumentation/mongo/mongo-3.1/javaagent/build.gradle.kts +++ b/instrumentation/mongo/mongo-3.1/javaagent/build.gradle.kts @@ -26,12 +26,14 @@ dependencies { tasks { withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") } val testStableSemconv by registering(Test::class) { testClassesDirs = sourceSets.test.get().output.classesDirs classpath = sourceSets.test.get().runtimeClasspath jvmArgs("-Dotel.semconv-stability.opt-in=database") + systemProperty("metadataConfig", "otel.semconv-stability.opt-in=database") } check { diff --git a/instrumentation/mongo/mongo-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_1/MongoInstrumentationSingletons.java b/instrumentation/mongo/mongo-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_1/MongoInstrumentationSingletons.java index e943f6fbc78c..8ae547d85d2a 100644 --- a/instrumentation/mongo/mongo-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_1/MongoInstrumentationSingletons.java +++ b/instrumentation/mongo/mongo-3.1/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_1/MongoInstrumentationSingletons.java @@ -6,22 +6,26 @@ package io.opentelemetry.javaagent.instrumentation.mongo.v3_1; import com.mongodb.event.CommandListener; +import com.mongodb.event.CommandStartedEvent; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.mongo.v3_1.MongoTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.mongo.v3_1.internal.MongoInstrumenterFactory; +import io.opentelemetry.instrumentation.mongo.v3_1.internal.TracingCommandListener; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class MongoInstrumentationSingletons { - public static final CommandListener LISTENER = - MongoTelemetry.builder(GlobalOpenTelemetry.get()) - .setStatementSanitizationEnabled( - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.mongo.statement-sanitizer.enabled", - AgentCommonConfig.get().isStatementSanitizationEnabled())) - .build() - .newCommandListener(); + private static final Instrumenter INSTRUMENTER = + MongoInstrumenterFactory.createInstrumenter( + GlobalOpenTelemetry.get(), + "io.opentelemetry.mongo-3.1", + AgentInstrumentationConfig.get() + .getBoolean( + "otel.instrumentation.mongo.statement-sanitizer.enabled", + AgentCommonConfig.get().isStatementSanitizationEnabled())); + + public static final CommandListener LISTENER = new TracingCommandListener(INSTRUMENTER); public static boolean isTracingListener(CommandListener listener) { return listener.getClass().getName().equals(LISTENER.getClass().getName()); diff --git a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoTelemetry.java b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoTelemetry.java index d1c27ef1c6a4..76dbf7664616 100644 --- a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoTelemetry.java +++ b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoTelemetry.java @@ -9,6 +9,8 @@ import com.mongodb.event.CommandStartedEvent; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.mongo.v3_1.internal.MongoInstrumenterFactory; +import io.opentelemetry.instrumentation.mongo.v3_1.internal.TracingCommandListener; // TODO this class is used for all Mongo versions. Extract to mongo-common module /** Entrypoint to OpenTelemetry instrumentation of the MongoDB client. */ @@ -23,18 +25,22 @@ public static MongoTelemetry create(OpenTelemetry openTelemetry) { * Returns a new {@link MongoTelemetryBuilder} configured with the given {@link OpenTelemetry}. */ public static MongoTelemetryBuilder builder(OpenTelemetry openTelemetry) { - return new MongoTelemetryBuilder(openTelemetry); + return new MongoTelemetryBuilder(openTelemetry, "io.opentelemetry.mongo-3.1"); } private final Instrumenter instrumenter; MongoTelemetry( OpenTelemetry openTelemetry, + String instrumentationName, boolean statementSanitizationEnabled, int maxNormalizedQueryLength) { this.instrumenter = MongoInstrumenterFactory.createInstrumenter( - openTelemetry, statementSanitizationEnabled, maxNormalizedQueryLength); + openTelemetry, + instrumentationName, + statementSanitizationEnabled, + maxNormalizedQueryLength); } /** diff --git a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoTelemetryBuilder.java b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoTelemetryBuilder.java index e7fa6d715dc5..ad31ab6b07ce 100644 --- a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoTelemetryBuilder.java +++ b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoTelemetryBuilder.java @@ -15,12 +15,14 @@ public final class MongoTelemetryBuilder { static final int DEFAULT_MAX_NORMALIZED_QUERY_LENGTH = 32 * 1024; private final OpenTelemetry openTelemetry; + private final String instrumentationName; private boolean statementSanitizationEnabled = true; private int maxNormalizedQueryLength = DEFAULT_MAX_NORMALIZED_QUERY_LENGTH; - MongoTelemetryBuilder(OpenTelemetry openTelemetry) { + MongoTelemetryBuilder(OpenTelemetry openTelemetry, String instrumentationName) { this.openTelemetry = openTelemetry; + this.instrumentationName = instrumentationName; } /** @@ -50,6 +52,6 @@ public MongoTelemetryBuilder setMaxNormalizedQueryLength(int maxNormalizedQueryL */ public MongoTelemetry build() { return new MongoTelemetry( - openTelemetry, statementSanitizationEnabled, maxNormalizedQueryLength); + openTelemetry, instrumentationName, statementSanitizationEnabled, maxNormalizedQueryLength); } } diff --git a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/ContextAndRequest.java b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/ContextAndRequest.java similarity index 88% rename from instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/ContextAndRequest.java rename to instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/ContextAndRequest.java index f1a064e6857c..fe15ba5b3924 100644 --- a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/ContextAndRequest.java +++ b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/ContextAndRequest.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.mongo.v3_1; +package io.opentelemetry.instrumentation.mongo.v3_1.internal; import com.google.auto.value.AutoValue; import com.mongodb.event.CommandStartedEvent; diff --git a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoAttributesExtractor.java b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoAttributesExtractor.java similarity index 97% rename from instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoAttributesExtractor.java rename to instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoAttributesExtractor.java index 1d1cf58f2e0a..1900e432a0bd 100644 --- a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoAttributesExtractor.java +++ b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoAttributesExtractor.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.mongo.v3_1; +package io.opentelemetry.instrumentation.mongo.v3_1.internal; import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitOldDatabaseSemconv; import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; diff --git a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoDbAttributesGetter.java b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoDbAttributesGetter.java similarity index 99% rename from instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoDbAttributesGetter.java rename to instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoDbAttributesGetter.java index 7c7bc9886362..1cdf2a1f2469 100644 --- a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoDbAttributesGetter.java +++ b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoDbAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.mongo.v3_1; +package io.opentelemetry.instrumentation.mongo.v3_1.internal; import com.mongodb.MongoException; import com.mongodb.ServerAddress; diff --git a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoInstrumenterFactory.java b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoInstrumenterFactory.java similarity index 66% rename from instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoInstrumenterFactory.java rename to instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoInstrumenterFactory.java index 41cfc6c92bfc..3fce05963540 100644 --- a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoInstrumenterFactory.java +++ b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoInstrumenterFactory.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.mongo.v3_1; +package io.opentelemetry.instrumentation.mongo.v3_1.internal; import com.mongodb.event.CommandStartedEvent; import io.opentelemetry.api.OpenTelemetry; @@ -14,13 +14,31 @@ import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesExtractor; -class MongoInstrumenterFactory { +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public final class MongoInstrumenterFactory { + + public static final int DEFAULT_MAX_NORMALIZED_QUERY_LENGTH = 32 * 1024; private static final MongoAttributesExtractor attributesExtractor = new MongoAttributesExtractor(); - static Instrumenter createInstrumenter( + public static Instrumenter createInstrumenter( + OpenTelemetry openTelemetry, + String instrumentationName, + boolean statementSanitizationEnabled) { + return createInstrumenter( + openTelemetry, + instrumentationName, + statementSanitizationEnabled, + DEFAULT_MAX_NORMALIZED_QUERY_LENGTH); + } + + public static Instrumenter createInstrumenter( OpenTelemetry openTelemetry, + String instrumentationName, boolean statementSanitizationEnabled, int maxNormalizedQueryLength) { @@ -30,7 +48,7 @@ static Instrumenter createInstrumenter( new MongoSpanNameExtractor(dbAttributesGetter, attributesExtractor); return Instrumenter.builder( - openTelemetry, "io.opentelemetry.mongo-3.1", spanNameExtractor) + openTelemetry, instrumentationName, spanNameExtractor) .addAttributesExtractor(DbClientAttributesExtractor.create(dbAttributesGetter)) .addAttributesExtractor( ServerAttributesExtractor.create(new MongoNetworkAttributesGetter())) diff --git a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoNetworkAttributesGetter.java b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoNetworkAttributesGetter.java similarity index 93% rename from instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoNetworkAttributesGetter.java rename to instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoNetworkAttributesGetter.java index 28cd334047c1..ae855669a0da 100644 --- a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoNetworkAttributesGetter.java +++ b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoNetworkAttributesGetter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.mongo.v3_1; +package io.opentelemetry.instrumentation.mongo.v3_1.internal; import com.mongodb.event.CommandStartedEvent; import io.opentelemetry.instrumentation.api.semconv.network.ServerAttributesGetter; diff --git a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoSpanNameExtractor.java b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoSpanNameExtractor.java similarity index 96% rename from instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoSpanNameExtractor.java rename to instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoSpanNameExtractor.java index d770fe9320b0..658e2b95ddfb 100644 --- a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoSpanNameExtractor.java +++ b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoSpanNameExtractor.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.mongo.v3_1; +package io.opentelemetry.instrumentation.mongo.v3_1.internal; import com.mongodb.event.CommandStartedEvent; import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; diff --git a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/StringBuilderWriter.java b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/StringBuilderWriter.java similarity index 90% rename from instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/StringBuilderWriter.java rename to instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/StringBuilderWriter.java index 1178b76bd224..1d0237dbf6d4 100644 --- a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/StringBuilderWriter.java +++ b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/StringBuilderWriter.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.mongo.v3_1; +package io.opentelemetry.instrumentation.mongo.v3_1.internal; import java.io.Writer; diff --git a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/TracingCommandListener.java b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/TracingCommandListener.java similarity index 83% rename from instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/TracingCommandListener.java rename to instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/TracingCommandListener.java index 158d9eabf82a..0fc250fce87e 100644 --- a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/TracingCommandListener.java +++ b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/TracingCommandListener.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.mongo.v3_1; +package io.opentelemetry.instrumentation.mongo.v3_1.internal; import com.mongodb.event.CommandFailedEvent; import com.mongodb.event.CommandListener; @@ -14,12 +14,16 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -final class TracingCommandListener implements CommandListener { +/** + * This class is internal and is hence not for public use. Its APIs are unstable and can change at + * any time. + */ +public final class TracingCommandListener implements CommandListener { private final Instrumenter instrumenter; private final Map requestMap; - TracingCommandListener(Instrumenter instrumenter) { + public TracingCommandListener(Instrumenter instrumenter) { this.instrumenter = instrumenter; this.requestMap = new ConcurrentHashMap<>(); } diff --git a/instrumentation/mongo/mongo-3.1/library/src/test/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoDbAttributesGetterTest.java b/instrumentation/mongo/mongo-3.1/library/src/test/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoDbAttributesGetterTest.java similarity index 95% rename from instrumentation/mongo/mongo-3.1/library/src/test/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoDbAttributesGetterTest.java rename to instrumentation/mongo/mongo-3.1/library/src/test/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoDbAttributesGetterTest.java index fd3ecd71819d..9189528e9035 100644 --- a/instrumentation/mongo/mongo-3.1/library/src/test/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoDbAttributesGetterTest.java +++ b/instrumentation/mongo/mongo-3.1/library/src/test/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoDbAttributesGetterTest.java @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.mongo.v3_1; +package io.opentelemetry.instrumentation.mongo.v3_1.internal; -import static io.opentelemetry.instrumentation.mongo.v3_1.MongoTelemetryBuilder.DEFAULT_MAX_NORMALIZED_QUERY_LENGTH; +import static io.opentelemetry.instrumentation.mongo.v3_1.internal.MongoInstrumenterFactory.DEFAULT_MAX_NORMALIZED_QUERY_LENGTH; import static java.util.Arrays.asList; import static java.util.Collections.singletonList; import static org.assertj.core.api.Assertions.assertThat; diff --git a/instrumentation/mongo/mongo-3.1/library/src/test/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoSpanNameExtractorTest.java b/instrumentation/mongo/mongo-3.1/library/src/test/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoSpanNameExtractorTest.java similarity index 83% rename from instrumentation/mongo/mongo-3.1/library/src/test/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoSpanNameExtractorTest.java rename to instrumentation/mongo/mongo-3.1/library/src/test/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoSpanNameExtractorTest.java index fce0cbb1fdb9..dfb5cf0cd487 100644 --- a/instrumentation/mongo/mongo-3.1/library/src/test/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoSpanNameExtractorTest.java +++ b/instrumentation/mongo/mongo-3.1/library/src/test/java/io/opentelemetry/instrumentation/mongo/v3_1/internal/MongoSpanNameExtractorTest.java @@ -3,9 +3,9 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.mongo.v3_1; +package io.opentelemetry.instrumentation.mongo.v3_1.internal; -import static io.opentelemetry.instrumentation.mongo.v3_1.MongoTelemetryBuilder.DEFAULT_MAX_NORMALIZED_QUERY_LENGTH; +import static io.opentelemetry.instrumentation.mongo.v3_1.internal.MongoInstrumenterFactory.DEFAULT_MAX_NORMALIZED_QUERY_LENGTH; import static org.assertj.core.api.Assertions.assertThat; import com.mongodb.event.CommandStartedEvent; diff --git a/instrumentation/mongo/mongo-3.1/metadata.yaml b/instrumentation/mongo/mongo-3.1/metadata.yaml new file mode 100644 index 000000000000..46c9e7d20cd4 --- /dev/null +++ b/instrumentation/mongo/mongo-3.1/metadata.yaml @@ -0,0 +1,19 @@ +display_name: MongoDB Driver +description: > + This instrumentation enables database client spans and database client metrics for the MongoDB + Java driver. +semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS +library_link: https://www.mongodb.com/docs/drivers/java-drivers/ +configurations: + - name: otel.instrumentation.mongo.statement-sanitizer.enabled + description: > + Enables statement sanitization for MongoDB queries. Takes precedence over + otel.instrumentation.common.db-statement-sanitizer.enabled. + type: boolean + default: true + - name: otel.instrumentation.common.db-statement-sanitizer.enabled + description: Enables statement sanitization for database queries. + type: boolean + default: true diff --git a/instrumentation/mongo/mongo-3.7/javaagent/build.gradle.kts b/instrumentation/mongo/mongo-3.7/javaagent/build.gradle.kts index 705fb69ff07a..1604169e258b 100644 --- a/instrumentation/mongo/mongo-3.7/javaagent/build.gradle.kts +++ b/instrumentation/mongo/mongo-3.7/javaagent/build.gradle.kts @@ -36,12 +36,14 @@ dependencies { tasks { withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") } val testStableSemconv by registering(Test::class) { testClassesDirs = sourceSets.test.get().output.classesDirs classpath = sourceSets.test.get().runtimeClasspath jvmArgs("-Dotel.semconv-stability.opt-in=database") + systemProperty("metadataConfig", "otel.semconv-stability.opt-in=database") } check { diff --git a/instrumentation/mongo/mongo-3.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_7/MongoInstrumentationSingletons.java b/instrumentation/mongo/mongo-3.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_7/MongoInstrumentationSingletons.java index 9657ac335cbd..e8928e5f93a6 100644 --- a/instrumentation/mongo/mongo-3.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_7/MongoInstrumentationSingletons.java +++ b/instrumentation/mongo/mongo-3.7/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_7/MongoInstrumentationSingletons.java @@ -6,22 +6,26 @@ package io.opentelemetry.javaagent.instrumentation.mongo.v3_7; import com.mongodb.event.CommandListener; +import com.mongodb.event.CommandStartedEvent; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.mongo.v3_1.MongoTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.mongo.v3_1.internal.MongoInstrumenterFactory; +import io.opentelemetry.instrumentation.mongo.v3_1.internal.TracingCommandListener; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class MongoInstrumentationSingletons { - public static final CommandListener LISTENER = - MongoTelemetry.builder(GlobalOpenTelemetry.get()) - .setStatementSanitizationEnabled( - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.mongo.statement-sanitizer.enabled", - AgentCommonConfig.get().isStatementSanitizationEnabled())) - .build() - .newCommandListener(); + private static final Instrumenter INSTRUMENTER = + MongoInstrumenterFactory.createInstrumenter( + GlobalOpenTelemetry.get(), + "io.opentelemetry.mongo-3.7", + AgentInstrumentationConfig.get() + .getBoolean( + "otel.instrumentation.mongo.statement-sanitizer.enabled", + AgentCommonConfig.get().isStatementSanitizationEnabled())); + + public static final CommandListener LISTENER = new TracingCommandListener(INSTRUMENTER); public static boolean isTracingListener(CommandListener listener) { return listener.getClass().getName().equals(LISTENER.getClass().getName()); diff --git a/instrumentation/mongo/mongo-3.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_7/MongoClientTest.java b/instrumentation/mongo/mongo-3.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_7/MongoClientTest.java index a8614bce27ef..9545442e11fe 100644 --- a/instrumentation/mongo/mongo-3.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_7/MongoClientTest.java +++ b/instrumentation/mongo/mongo-3.7/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/mongo/v3_7/MongoClientTest.java @@ -33,7 +33,6 @@ import org.junit.jupiter.api.extension.RegisterExtension; class MongoClientTest extends AbstractMongoClientTest> { - @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); diff --git a/instrumentation/mongo/mongo-3.7/metadata.yaml b/instrumentation/mongo/mongo-3.7/metadata.yaml new file mode 100644 index 000000000000..46c9e7d20cd4 --- /dev/null +++ b/instrumentation/mongo/mongo-3.7/metadata.yaml @@ -0,0 +1,19 @@ +display_name: MongoDB Driver +description: > + This instrumentation enables database client spans and database client metrics for the MongoDB + Java driver. +semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS +library_link: https://www.mongodb.com/docs/drivers/java-drivers/ +configurations: + - name: otel.instrumentation.mongo.statement-sanitizer.enabled + description: > + Enables statement sanitization for MongoDB queries. Takes precedence over + otel.instrumentation.common.db-statement-sanitizer.enabled. + type: boolean + default: true + - name: otel.instrumentation.common.db-statement-sanitizer.enabled + description: Enables statement sanitization for database queries. + type: boolean + default: true diff --git a/instrumentation/mongo/mongo-4.0/javaagent/build.gradle.kts b/instrumentation/mongo/mongo-4.0/javaagent/build.gradle.kts index db3481d9a7fa..ec81bd1d5a26 100644 --- a/instrumentation/mongo/mongo-4.0/javaagent/build.gradle.kts +++ b/instrumentation/mongo/mongo-4.0/javaagent/build.gradle.kts @@ -32,12 +32,14 @@ dependencies { tasks { withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") } val testStableSemconv by registering(Test::class) { testClassesDirs = sourceSets.test.get().output.classesDirs classpath = sourceSets.test.get().runtimeClasspath jvmArgs("-Dotel.semconv-stability.opt-in=database") + systemProperty("metadataConfig", "otel.semconv-stability.opt-in=database") } check { diff --git a/instrumentation/mongo/mongo-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v4_0/MongoInstrumentationSingletons.java b/instrumentation/mongo/mongo-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v4_0/MongoInstrumentationSingletons.java index 3389cc5bb6a3..20dcba7da5bb 100644 --- a/instrumentation/mongo/mongo-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v4_0/MongoInstrumentationSingletons.java +++ b/instrumentation/mongo/mongo-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongo/v4_0/MongoInstrumentationSingletons.java @@ -6,22 +6,26 @@ package io.opentelemetry.javaagent.instrumentation.mongo.v4_0; import com.mongodb.event.CommandListener; +import com.mongodb.event.CommandStartedEvent; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.mongo.v3_1.MongoTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.mongo.v3_1.internal.MongoInstrumenterFactory; +import io.opentelemetry.instrumentation.mongo.v3_1.internal.TracingCommandListener; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class MongoInstrumentationSingletons { - public static final CommandListener LISTENER = - MongoTelemetry.builder(GlobalOpenTelemetry.get()) - .setStatementSanitizationEnabled( - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.mongo.statement-sanitizer.enabled", - AgentCommonConfig.get().isStatementSanitizationEnabled())) - .build() - .newCommandListener(); + private static final Instrumenter INSTRUMENTER = + MongoInstrumenterFactory.createInstrumenter( + GlobalOpenTelemetry.get(), + "io.opentelemetry.mongo-4.0", + AgentInstrumentationConfig.get() + .getBoolean( + "otel.instrumentation.mongo.statement-sanitizer.enabled", + AgentCommonConfig.get().isStatementSanitizationEnabled())); + + public static final CommandListener LISTENER = new TracingCommandListener(INSTRUMENTER); public static boolean isTracingListener(CommandListener listener) { return listener.getClass().getName().equals(LISTENER.getClass().getName()); diff --git a/instrumentation/mongo/mongo-4.0/metadata.yaml b/instrumentation/mongo/mongo-4.0/metadata.yaml new file mode 100644 index 000000000000..46c9e7d20cd4 --- /dev/null +++ b/instrumentation/mongo/mongo-4.0/metadata.yaml @@ -0,0 +1,19 @@ +display_name: MongoDB Driver +description: > + This instrumentation enables database client spans and database client metrics for the MongoDB + Java driver. +semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS +library_link: https://www.mongodb.com/docs/drivers/java-drivers/ +configurations: + - name: otel.instrumentation.mongo.statement-sanitizer.enabled + description: > + Enables statement sanitization for MongoDB queries. Takes precedence over + otel.instrumentation.common.db-statement-sanitizer.enabled. + type: boolean + default: true + - name: otel.instrumentation.common.db-statement-sanitizer.enabled + description: Enables statement sanitization for database queries. + type: boolean + default: true diff --git a/instrumentation/mongo/mongo-async-3.3/javaagent/build.gradle.kts b/instrumentation/mongo/mongo-async-3.3/javaagent/build.gradle.kts index 682a47f552e4..064032497ecd 100644 --- a/instrumentation/mongo/mongo-async-3.3/javaagent/build.gradle.kts +++ b/instrumentation/mongo/mongo-async-3.3/javaagent/build.gradle.kts @@ -27,12 +27,14 @@ dependencies { tasks { withType().configureEach { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") } val testStableSemconv by registering(Test::class) { testClassesDirs = sourceSets.test.get().output.classesDirs classpath = sourceSets.test.get().runtimeClasspath jvmArgs("-Dotel.semconv-stability.opt-in=database") + systemProperty("metadataConfig", "otel.semconv-stability.opt-in=database") } check { diff --git a/instrumentation/mongo/mongo-async-3.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongoasync/v3_3/MongoInstrumentationSingletons.java b/instrumentation/mongo/mongo-async-3.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongoasync/v3_3/MongoInstrumentationSingletons.java index 2280ce533637..2cb3352cdbc8 100644 --- a/instrumentation/mongo/mongo-async-3.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongoasync/v3_3/MongoInstrumentationSingletons.java +++ b/instrumentation/mongo/mongo-async-3.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/mongoasync/v3_3/MongoInstrumentationSingletons.java @@ -6,22 +6,26 @@ package io.opentelemetry.javaagent.instrumentation.mongoasync.v3_3; import com.mongodb.event.CommandListener; +import com.mongodb.event.CommandStartedEvent; import io.opentelemetry.api.GlobalOpenTelemetry; -import io.opentelemetry.instrumentation.mongo.v3_1.MongoTelemetry; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.mongo.v3_1.internal.MongoInstrumenterFactory; +import io.opentelemetry.instrumentation.mongo.v3_1.internal.TracingCommandListener; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class MongoInstrumentationSingletons { - public static final CommandListener LISTENER = - MongoTelemetry.builder(GlobalOpenTelemetry.get()) - .setStatementSanitizationEnabled( - AgentInstrumentationConfig.get() - .getBoolean( - "otel.instrumentation.mongo.statement-sanitizer.enabled", - AgentCommonConfig.get().isStatementSanitizationEnabled())) - .build() - .newCommandListener(); + private static final Instrumenter INSTRUMENTER = + MongoInstrumenterFactory.createInstrumenter( + GlobalOpenTelemetry.get(), + "io.opentelemetry.mongo-async-3.3", + AgentInstrumentationConfig.get() + .getBoolean( + "otel.instrumentation.mongo.statement-sanitizer.enabled", + AgentCommonConfig.get().isStatementSanitizationEnabled())); + + public static final CommandListener LISTENER = new TracingCommandListener(INSTRUMENTER); public static boolean isTracingListener(CommandListener listener) { return listener.getClass().getName().equals(LISTENER.getClass().getName()); diff --git a/instrumentation/mongo/mongo-async-3.3/metadata.yaml b/instrumentation/mongo/mongo-async-3.3/metadata.yaml new file mode 100644 index 000000000000..c9eaf14902c4 --- /dev/null +++ b/instrumentation/mongo/mongo-async-3.3/metadata.yaml @@ -0,0 +1,19 @@ +display_name: MongoDB Driver (Async) +description: > + This instrumentation enables database client spans and database client metrics for the MongoDB + async Java driver. +semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS +library_link: https://www.mongodb.com/docs/drivers/java-drivers/ +configurations: + - name: otel.instrumentation.mongo.statement-sanitizer.enabled + description: > + Enables statement sanitization for MongoDB queries. Takes precedence over + otel.instrumentation.common.db-statement-sanitizer.enabled. + type: boolean + default: true + - name: otel.instrumentation.common.db-statement-sanitizer.enabled + description: Enables statement sanitization for database queries. + type: boolean + default: true diff --git a/instrumentation/mongo/mongo-common/testing/src/main/java/io/opentelemetry/instrumentation/mongo/testing/AbstractMongoClientTest.java b/instrumentation/mongo/mongo-common/testing/src/main/java/io/opentelemetry/instrumentation/mongo/testing/AbstractMongoClientTest.java index e1fc1449595d..cbc718c84e6c 100644 --- a/instrumentation/mongo/mongo-common/testing/src/main/java/io/opentelemetry/instrumentation/mongo/testing/AbstractMongoClientTest.java +++ b/instrumentation/mongo/mongo-common/testing/src/main/java/io/opentelemetry/instrumentation/mongo/testing/AbstractMongoClientTest.java @@ -7,9 +7,14 @@ import static io.opentelemetry.api.trace.SpanKind.CLIENT; import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.testing.junit.db.DbClientMetricsTestUtil.assertDurationMetric; import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.DbAttributes.DB_COLLECTION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_NAMESPACE; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; @@ -31,6 +36,7 @@ import java.net.Socket; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; +import java.util.concurrent.atomic.AtomicReference; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.DisplayName; @@ -230,30 +236,45 @@ void testGetCollection() throws Exception { long count = testing().runWithSpan("parent", () -> getCollection(dbName, collectionName)); assertThat(count).isEqualTo(0); + // versions 3.7+ are instrumented by the mongo-3.7 module and have a different scope + AtomicReference scopeName = new AtomicReference<>(); + testing() .waitAndAssertTraces( trace -> trace.hasSpansSatisfyingExactly( span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), - span -> - mongoSpan( - span, - "count", - collectionName, - dbName, - trace.getSpan(0), - asList( - "{\"count\":\"" + collectionName + "\",\"query\":{}}", - "{\"count\":\"" + collectionName + "\",\"query\":{},\"$db\":\"?\"}", - "{\"count\":\"" - + collectionName - + "\",\"query\":{},\"$db\":\"?\",\"lsid\":{\"id\":\"?\"}}", - "{\"count\":\"" - + collectionName - + "\",\"query\":{},\"$db\":\"?\",\"$readPreference\":{\"mode\":\"?\"}}", - "{\"count\":\"" - + collectionName - + "\",\"$db\":\"?\",\"lsid\":{\"id\":\"?\"}}")))); + span -> { + scopeName.set(trace.getSpan(1).getInstrumentationScopeInfo().getName()); + mongoSpan( + span, + "count", + collectionName, + dbName, + trace.getSpan(0), + asList( + "{\"count\":\"" + collectionName + "\",\"query\":{}}", + "{\"count\":\"" + collectionName + "\",\"query\":{},\"$db\":\"?\"}", + "{\"count\":\"" + + collectionName + + "\",\"query\":{},\"$db\":\"?\",\"lsid\":{\"id\":\"?\"}}", + "{\"count\":\"" + + collectionName + + "\",\"query\":{},\"$db\":\"?\",\"$readPreference\":{\"mode\":\"?\"}}", + "{\"count\":\"" + + collectionName + + "\",\"$db\":\"?\",\"lsid\":{\"id\":\"?\"}}")); + })); + + assertDurationMetric( + testing(), + scopeName.get(), + DB_SYSTEM_NAME, + DB_OPERATION_NAME, + DB_NAMESPACE, + DB_COLLECTION_NAME, + SERVER_ADDRESS, + SERVER_PORT); } @Test