From eab0ccb794b1cc556e414581a27e5da394bf2b36 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Fri, 29 Nov 2024 16:35:17 +0100 Subject: [PATCH 1/5] add db client metrics for JDBC, vertx, r2dbc, cassandra, add tests --- .../cassandra/v3_0/CassandraSingletons.java | 2 + .../cassandra/v4_0/CassandraSingletons.java | 2 + .../v4_4/CassandraTelemetryBuilder.java | 2 + .../instrumentation/jdbc/JdbcSingletons.java | 2 + .../jdbc/test/JdbcInstrumentationTest.java | 9 +++- .../internal/JdbcInstrumenterFactory.java | 2 + .../jdbc/datasource/JdbcTelemetryTest.java | 9 ++++ instrumentation/jdbc/testing/build.gradle.kts | 1 + .../jdbc/DbClientMetricsTestUtil.java | 42 +++++++++++++++++++ .../jedis-3.0/javaagent/build.gradle.kts | 1 + .../jedis/v3_0/Jedis30ClientTest.java | 12 ++++++ .../internal/R2dbcInstrumenterBuilder.java | 2 + .../v4_0/sql/VertxSqlClientSingletons.java | 4 +- 13 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/DbClientMetricsTestUtil.java diff --git a/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSingletons.java index 5598d2fcb994..7a8f81823692 100644 --- a/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSingletons.java @@ -7,6 +7,7 @@ import com.datastax.driver.core.ExecutionInfo; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; @@ -40,6 +41,7 @@ public final class CassandraSingletons { .addAttributesExtractor( NetworkAttributesExtractor.create(new CassandraNetworkAttributesGetter())) .addAttributesExtractor(new CassandraAttributesExtractor()) + .addOperationMetrics(DbClientMetrics.get()) .buildInstrumenter(SpanKindExtractor.alwaysClient()); } diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java index 668cf2f50974..624994166aa0 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java @@ -7,6 +7,7 @@ import com.datastax.oss.driver.api.core.cql.ExecutionInfo; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; @@ -39,6 +40,7 @@ public final class CassandraSingletons { .addAttributesExtractor( NetworkAttributesExtractor.create(new CassandraNetworkAttributesGetter())) .addAttributesExtractor(new CassandraAttributesExtractor()) + .addOperationMetrics(DbClientMetrics.get()) .buildInstrumenter(SpanKindExtractor.alwaysClient()); } diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java index d5a92eb7d936..40e8cccae1d8 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java @@ -9,6 +9,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; @@ -65,6 +66,7 @@ protected Instrumenter createInstrumenter( .addAttributesExtractor( NetworkAttributesExtractor.create(new CassandraNetworkAttributesGetter())) .addAttributesExtractor(new CassandraAttributesExtractor()) + .addOperationMetrics(DbClientMetrics.get()) .buildInstrumenter(SpanKindExtractor.alwaysClient()); } } diff --git a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcSingletons.java b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcSingletons.java index afc92f2fcad9..e9c5290aa217 100644 --- a/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcSingletons.java +++ b/instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcSingletons.java @@ -8,6 +8,7 @@ import static io.opentelemetry.instrumentation.jdbc.internal.JdbcInstrumenterFactory.createDataSourceInstrumenter; import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor; @@ -50,6 +51,7 @@ public final class JdbcSingletons { .addAttributesExtractor( PeerServiceAttributesExtractor.create( netAttributesGetter, AgentCommonConfig.get().getPeerServiceResolver())) + .addOperationMetrics(DbClientMetrics.get()) .buildInstrumenter(SpanKindExtractor.alwaysClient()); } diff --git a/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java b/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java index 649b5c480e45..0a4abfe62bce 100644 --- a/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java +++ b/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java @@ -6,17 +6,21 @@ package io.opentelemetry.javaagent.instrumentation.jdbc.test; import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.instrumentation.jdbc.DbClientMetricsTestUtil.assertDurationMetric; import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_COLLECTION_NAME; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAMESPACE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION_NAME; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import static java.util.Arrays.asList; -import static org.assertj.core.api.Assertions.assertThat; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; @@ -379,6 +383,9 @@ public void testBasicStatement( equalTo(maybeStable(DB_STATEMENT), sanitizedQuery), equalTo(maybeStable(DB_OPERATION), "SELECT"), equalTo(maybeStable(DB_SQL_TABLE), table)))); + + assertDurationMetric( + testing, "io.opentelemetry.jdbc", DB_SYSTEM, DB_COLLECTION_NAME, DB_NAMESPACE, DB_OPERATION_NAME); } static Stream preparedStatementStream() throws SQLException { diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcInstrumenterFactory.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcInstrumenterFactory.java index 2e0b1e583bb7..861e1dd11759 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcInstrumenterFactory.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcInstrumenterFactory.java @@ -9,6 +9,7 @@ import io.opentelemetry.api.OpenTelemetry; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor; +import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; @@ -52,6 +53,7 @@ public static Instrumenter createStatementInstrumenter( .setStatementSanitizationEnabled(statementSanitizationEnabled) .build()) .addAttributesExtractor(ServerAttributesExtractor.create(netAttributesGetter)) + .addOperationMetrics(DbClientMetrics.get()) .setEnabled(enabled) .buildInstrumenter(SpanKindExtractor.alwaysClient()); } diff --git a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java index 1f3db9d51bfa..17521873c9e6 100644 --- a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java +++ b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java @@ -5,9 +5,15 @@ package io.opentelemetry.instrumentation.jdbc.datasource; +import static io.opentelemetry.instrumentation.jdbc.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.semconv.ServerAttributes.SERVER_ADDRESS; +import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAMESPACE; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION_NAME; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.instrumentation.jdbc.internal.OpenTelemetryConnection; @@ -44,6 +50,9 @@ void buildWithDefaults() throws SQLException { span -> span.hasName("SELECT dbname") .hasAttribute(equalTo(maybeStable(DB_STATEMENT), "SELECT ?;")))); + + assertDurationMetric( + testing, "io.opentelemetry.jdbc", DB_NAMESPACE, DB_OPERATION_NAME, DB_SYSTEM, SERVER_ADDRESS, SERVER_PORT); } @Test diff --git a/instrumentation/jdbc/testing/build.gradle.kts b/instrumentation/jdbc/testing/build.gradle.kts index da5154c445ee..48480c5949b1 100644 --- a/instrumentation/jdbc/testing/build.gradle.kts +++ b/instrumentation/jdbc/testing/build.gradle.kts @@ -9,4 +9,5 @@ plugins { dependencies { implementation("org.apache.groovy:groovy") + implementation("io.opentelemetry.javaagent:opentelemetry-testing-common") } diff --git a/instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/DbClientMetricsTestUtil.java b/instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/DbClientMetricsTestUtil.java new file mode 100644 index 000000000000..fef4544cbd54 --- /dev/null +++ b/instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/DbClientMetricsTestUtil.java @@ -0,0 +1,42 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.jdbc; + +import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; + +public class DbClientMetricsTestUtil { + + private DbClientMetricsTestUtil() {} + + public static void assertDurationMetric( + InstrumentationExtension testing, String instrumentationName, AttributeKey... expectedKeys) { + if (!emitStableDatabaseSemconv()) { + return; + } + testing.waitAndAssertMetrics( + instrumentationName, + metrics -> + metrics.hasName("db.client.operation.duration") + .hasUnit("s") + .hasDescription("Duration of database client operations.") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfying( + attributes -> + // + // assertThat(attributes.asMap().keySet()) + // + // .isEmpty()))))); + assertThat(attributes.asMap()) + .containsOnlyKeys(expectedKeys))))); + } +} diff --git a/instrumentation/jedis/jedis-3.0/javaagent/build.gradle.kts b/instrumentation/jedis/jedis-3.0/javaagent/build.gradle.kts index 532a471e280b..48a7da566da8 100644 --- a/instrumentation/jedis/jedis-3.0/javaagent/build.gradle.kts +++ b/instrumentation/jedis/jedis-3.0/javaagent/build.gradle.kts @@ -19,6 +19,7 @@ dependencies { annotationProcessor("com.google.auto.value:auto-value") implementation(project(":instrumentation:jedis:jedis-common:javaagent")) + testImplementation(project(":instrumentation:jdbc:testing")) // ensures jedis-1.4 instrumentation does not load with jedis 3.0+ by failing // the tests in the event it does. The tests will end up with double spans diff --git a/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java b/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java index 921610937bc1..20722d3725a7 100644 --- a/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java +++ b/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java @@ -5,6 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.jedis.v3_0; +import static io.opentelemetry.instrumentation.jdbc.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; @@ -14,6 +15,7 @@ import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION_NAME; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static org.assertj.core.api.Assertions.assertThat; @@ -88,6 +90,16 @@ void setCommand() { equalTo(NETWORK_TYPE, "ipv4"), equalTo(NETWORK_PEER_ADDRESS, ip), satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative)))); + + assertDurationMetric( + testing, + "io.opentelemetry.jedis-3.0", + DB_OPERATION_NAME, + DB_SYSTEM, + SERVER_ADDRESS, + SERVER_PORT, + NETWORK_PEER_ADDRESS, + NETWORK_PEER_PORT); } @Test diff --git a/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/R2dbcInstrumenterBuilder.java b/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/R2dbcInstrumenterBuilder.java index 0b15861ff915..f094125633bb 100644 --- a/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/R2dbcInstrumenterBuilder.java +++ b/instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/R2dbcInstrumenterBuilder.java @@ -7,6 +7,7 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.api.OpenTelemetry; +import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesExtractor; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; @@ -58,6 +59,7 @@ public Instrumenter build( .build()) .addAttributesExtractor(ServerAttributesExtractor.create(R2dbcNetAttributesGetter.INSTANCE)) .addAttributesExtractors(additionalExtractors) + .addOperationMetrics(DbClientMetrics.get()) .buildInstrumenter(SpanKindExtractor.alwaysClient()); } } diff --git a/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientSingletons.java b/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientSingletons.java index a77338e5c811..071a27b768c3 100644 --- a/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientSingletons.java +++ b/instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientSingletons.java @@ -8,6 +8,7 @@ import io.opentelemetry.api.GlobalOpenTelemetry; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; +import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics; import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesExtractor; import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor; @@ -47,7 +48,8 @@ public final class VertxSqlClientSingletons { .addAttributesExtractor( PeerServiceAttributesExtractor.create( VertxSqlClientNetAttributesGetter.INSTANCE, - AgentCommonConfig.get().getPeerServiceResolver())); + AgentCommonConfig.get().getPeerServiceResolver())) + .addOperationMetrics(DbClientMetrics.get()); INSTRUMENTER = builder.buildInstrumenter(SpanKindExtractor.alwaysClient()); } From 63af1d6d25b894b71b95ef4fe60f0fbf82da9eef Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Fri, 29 Nov 2024 16:38:23 +0100 Subject: [PATCH 2/5] add db client metrics for JDBC, vertx, r2dbc, cassandra, add tests --- .../instrumentation/jdbc/DbClientMetricsTestUtil.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/DbClientMetricsTestUtil.java b/instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/DbClientMetricsTestUtil.java index fef4544cbd54..0f8619ac8789 100644 --- a/instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/DbClientMetricsTestUtil.java +++ b/instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/DbClientMetricsTestUtil.java @@ -32,10 +32,6 @@ public static void assertDurationMetric( point -> point.hasAttributesSatisfying( attributes -> - // - // assertThat(attributes.asMap().keySet()) - // - // .isEmpty()))))); assertThat(attributes.asMap()) .containsOnlyKeys(expectedKeys))))); } From 2c472679fd415776560c5f7b27732c3d6c39f343 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Fri, 29 Nov 2024 16:41:05 +0100 Subject: [PATCH 3/5] add db client metrics for JDBC, vertx, r2dbc, cassandra, add tests --- .../jdbc/test/JdbcInstrumentationTest.java | 7 ++++- .../jdbc/datasource/JdbcTelemetryTest.java | 8 +++++- .../jdbc/DbClientMetricsTestUtil.java | 27 ++++++++++--------- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java b/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java index 0a4abfe62bce..8b23a7a8c91b 100644 --- a/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java +++ b/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java @@ -385,7 +385,12 @@ public void testBasicStatement( equalTo(maybeStable(DB_SQL_TABLE), table)))); assertDurationMetric( - testing, "io.opentelemetry.jdbc", DB_SYSTEM, DB_COLLECTION_NAME, DB_NAMESPACE, DB_OPERATION_NAME); + testing, + "io.opentelemetry.jdbc", + DB_SYSTEM, + DB_COLLECTION_NAME, + DB_NAMESPACE, + DB_OPERATION_NAME); } static Stream preparedStatementStream() throws SQLException { diff --git a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java index 17521873c9e6..1b39934587c2 100644 --- a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java +++ b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java @@ -52,7 +52,13 @@ void buildWithDefaults() throws SQLException { .hasAttribute(equalTo(maybeStable(DB_STATEMENT), "SELECT ?;")))); assertDurationMetric( - testing, "io.opentelemetry.jdbc", DB_NAMESPACE, DB_OPERATION_NAME, DB_SYSTEM, SERVER_ADDRESS, SERVER_PORT); + testing, + "io.opentelemetry.jdbc", + DB_NAMESPACE, + DB_OPERATION_NAME, + DB_SYSTEM, + SERVER_ADDRESS, + SERVER_PORT); } @Test diff --git a/instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/DbClientMetricsTestUtil.java b/instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/DbClientMetricsTestUtil.java index 0f8619ac8789..c9e363b49633 100644 --- a/instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/DbClientMetricsTestUtil.java +++ b/instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/DbClientMetricsTestUtil.java @@ -16,23 +16,26 @@ public class DbClientMetricsTestUtil { private DbClientMetricsTestUtil() {} public static void assertDurationMetric( - InstrumentationExtension testing, String instrumentationName, AttributeKey... expectedKeys) { + InstrumentationExtension testing, + String instrumentationName, + AttributeKey... expectedKeys) { if (!emitStableDatabaseSemconv()) { return; } testing.waitAndAssertMetrics( instrumentationName, metrics -> - metrics.hasName("db.client.operation.duration") - .hasUnit("s") - .hasDescription("Duration of database client operations.") - .hasHistogramSatisfying( - histogram -> - histogram.hasPointsSatisfying( - point -> - point.hasAttributesSatisfying( - attributes -> - assertThat(attributes.asMap()) - .containsOnlyKeys(expectedKeys))))); + metrics + .hasName("db.client.operation.duration") + .hasUnit("s") + .hasDescription("Duration of database client operations.") + .hasHistogramSatisfying( + histogram -> + histogram.hasPointsSatisfying( + point -> + point.hasAttributesSatisfying( + attributes -> + assertThat(attributes.asMap()) + .containsOnlyKeys(expectedKeys))))); } } From 4ada25037b37cec11b59e7a3d0ba925a53d4e776 Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Fri, 29 Nov 2024 17:34:28 +0100 Subject: [PATCH 4/5] fix test --- .../jdbc/test/JdbcInstrumentationTest.java | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java b/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java index 8b23a7a8c91b..e7275ba63493 100644 --- a/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java +++ b/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java @@ -384,13 +384,18 @@ public void testBasicStatement( equalTo(maybeStable(DB_OPERATION), "SELECT"), equalTo(maybeStable(DB_SQL_TABLE), table)))); - assertDurationMetric( - testing, - "io.opentelemetry.jdbc", - DB_SYSTEM, - DB_COLLECTION_NAME, - DB_NAMESPACE, - DB_OPERATION_NAME); + if (table != null) { + assertDurationMetric( + testing, + "io.opentelemetry.jdbc", + DB_SYSTEM, + DB_COLLECTION_NAME, + DB_NAMESPACE, + DB_OPERATION_NAME); + } else { + assertDurationMetric( + testing, "io.opentelemetry.jdbc", DB_SYSTEM, DB_OPERATION_NAME, DB_NAMESPACE); + } } static Stream preparedStatementStream() throws SQLException { From b3ddbd0049dd919b55c22bd9ba426077f86f9b2a Mon Sep 17 00:00:00 2001 From: Gregor Zeitlinger Date: Mon, 2 Dec 2024 09:47:36 +0100 Subject: [PATCH 5/5] move test class --- .../instrumentation/jdbc/test/JdbcInstrumentationTest.java | 2 +- .../instrumentation/jdbc/datasource/JdbcTelemetryTest.java | 2 +- instrumentation/jdbc/testing/build.gradle.kts | 1 - instrumentation/jedis/jedis-3.0/javaagent/build.gradle.kts | 1 - .../javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java | 2 +- .../testing/junit/db}/DbClientMetricsTestUtil.java | 2 +- 6 files changed, 4 insertions(+), 6 deletions(-) rename {instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc => testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db}/DbClientMetricsTestUtil.java (95%) diff --git a/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java b/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java index e7275ba63493..92684a9026bf 100644 --- a/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java +++ b/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java @@ -6,7 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.jdbc.test; import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; -import static io.opentelemetry.instrumentation.jdbc.DbClientMetricsTestUtil.assertDurationMetric; +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.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; diff --git a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java index 1b39934587c2..dacd4b177934 100644 --- a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java +++ b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java @@ -5,7 +5,7 @@ package io.opentelemetry.instrumentation.jdbc.datasource; -import static io.opentelemetry.instrumentation.jdbc.DbClientMetricsTestUtil.assertDurationMetric; +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.semconv.ServerAttributes.SERVER_ADDRESS; diff --git a/instrumentation/jdbc/testing/build.gradle.kts b/instrumentation/jdbc/testing/build.gradle.kts index 48480c5949b1..da5154c445ee 100644 --- a/instrumentation/jdbc/testing/build.gradle.kts +++ b/instrumentation/jdbc/testing/build.gradle.kts @@ -9,5 +9,4 @@ plugins { dependencies { implementation("org.apache.groovy:groovy") - implementation("io.opentelemetry.javaagent:opentelemetry-testing-common") } diff --git a/instrumentation/jedis/jedis-3.0/javaagent/build.gradle.kts b/instrumentation/jedis/jedis-3.0/javaagent/build.gradle.kts index 48a7da566da8..532a471e280b 100644 --- a/instrumentation/jedis/jedis-3.0/javaagent/build.gradle.kts +++ b/instrumentation/jedis/jedis-3.0/javaagent/build.gradle.kts @@ -19,7 +19,6 @@ dependencies { annotationProcessor("com.google.auto.value:auto-value") implementation(project(":instrumentation:jedis:jedis-common:javaagent")) - testImplementation(project(":instrumentation:jdbc:testing")) // ensures jedis-1.4 instrumentation does not load with jedis 3.0+ by failing // the tests in the event it does. The tests will end up with double spans diff --git a/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java b/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java index 20722d3725a7..65578e6141c9 100644 --- a/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java +++ b/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java @@ -5,7 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.jedis.v3_0; -import static io.opentelemetry.instrumentation.jdbc.DbClientMetricsTestUtil.assertDurationMetric; +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; diff --git a/instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/DbClientMetricsTestUtil.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/DbClientMetricsTestUtil.java similarity index 95% rename from instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/DbClientMetricsTestUtil.java rename to testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/DbClientMetricsTestUtil.java index c9e363b49633..40f2832790c7 100644 --- a/instrumentation/jdbc/testing/src/main/java/io/opentelemetry/instrumentation/jdbc/DbClientMetricsTestUtil.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/DbClientMetricsTestUtil.java @@ -3,7 +3,7 @@ * SPDX-License-Identifier: Apache-2.0 */ -package io.opentelemetry.instrumentation.jdbc; +package io.opentelemetry.instrumentation.testing.junit.db; import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;