Skip to content

Commit eab0ccb

Browse files
committed
add db client metrics for JDBC, vertx, r2dbc, cassandra, add tests
1 parent f143d47 commit eab0ccb

File tree

13 files changed

+88
-2
lines changed

13 files changed

+88
-2
lines changed

instrumentation/cassandra/cassandra-3.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v3_0/CassandraSingletons.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.datastax.driver.core.ExecutionInfo;
99
import io.opentelemetry.api.GlobalOpenTelemetry;
10+
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics;
1011
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor;
1112
import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesExtractor;
1213
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
@@ -40,6 +41,7 @@ public final class CassandraSingletons {
4041
.addAttributesExtractor(
4142
NetworkAttributesExtractor.create(new CassandraNetworkAttributesGetter()))
4243
.addAttributesExtractor(new CassandraAttributesExtractor())
44+
.addOperationMetrics(DbClientMetrics.get())
4345
.buildInstrumenter(SpanKindExtractor.alwaysClient());
4446
}
4547

instrumentation/cassandra/cassandra-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraSingletons.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.datastax.oss.driver.api.core.cql.ExecutionInfo;
99
import io.opentelemetry.api.GlobalOpenTelemetry;
10+
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics;
1011
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor;
1112
import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesExtractor;
1213
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
@@ -39,6 +40,7 @@ public final class CassandraSingletons {
3940
.addAttributesExtractor(
4041
NetworkAttributesExtractor.create(new CassandraNetworkAttributesGetter()))
4142
.addAttributesExtractor(new CassandraAttributesExtractor())
43+
.addOperationMetrics(DbClientMetrics.get())
4244
.buildInstrumenter(SpanKindExtractor.alwaysClient());
4345
}
4446

instrumentation/cassandra/cassandra-4.4/library/src/main/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTelemetryBuilder.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.google.errorprone.annotations.CanIgnoreReturnValue;
1010
import io.opentelemetry.api.OpenTelemetry;
1111
import io.opentelemetry.api.common.AttributeKey;
12+
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics;
1213
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor;
1314
import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesExtractor;
1415
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
@@ -65,6 +66,7 @@ protected Instrumenter<CassandraRequest, ExecutionInfo> createInstrumenter(
6566
.addAttributesExtractor(
6667
NetworkAttributesExtractor.create(new CassandraNetworkAttributesGetter()))
6768
.addAttributesExtractor(new CassandraAttributesExtractor())
69+
.addOperationMetrics(DbClientMetrics.get())
6870
.buildInstrumenter(SpanKindExtractor.alwaysClient());
6971
}
7072
}

instrumentation/jdbc/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/jdbc/JdbcSingletons.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import static io.opentelemetry.instrumentation.jdbc.internal.JdbcInstrumenterFactory.createDataSourceInstrumenter;
99

1010
import io.opentelemetry.api.GlobalOpenTelemetry;
11+
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics;
1112
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor;
1213
import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesExtractor;
1314
import io.opentelemetry.instrumentation.api.incubator.semconv.net.PeerServiceAttributesExtractor;
@@ -50,6 +51,7 @@ public final class JdbcSingletons {
5051
.addAttributesExtractor(
5152
PeerServiceAttributesExtractor.create(
5253
netAttributesGetter, AgentCommonConfig.get().getPeerServiceResolver()))
54+
.addOperationMetrics(DbClientMetrics.get())
5355
.buildInstrumenter(SpanKindExtractor.alwaysClient());
5456
}
5557

instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,21 @@
66
package io.opentelemetry.javaagent.instrumentation.jdbc.test;
77

88
import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv;
9+
import static io.opentelemetry.instrumentation.jdbc.DbClientMetricsTestUtil.assertDurationMetric;
910
import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable;
11+
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
1012
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
1113
import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS;
14+
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_COLLECTION_NAME;
1215
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME;
16+
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAMESPACE;
1317
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION;
18+
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION_NAME;
1419
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE;
1520
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT;
1621
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM;
1722
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER;
1823
import static java.util.Arrays.asList;
19-
import static org.assertj.core.api.Assertions.assertThat;
2024

2125
import com.google.common.collect.ImmutableMap;
2226
import com.google.common.collect.Maps;
@@ -379,6 +383,9 @@ public void testBasicStatement(
379383
equalTo(maybeStable(DB_STATEMENT), sanitizedQuery),
380384
equalTo(maybeStable(DB_OPERATION), "SELECT"),
381385
equalTo(maybeStable(DB_SQL_TABLE), table))));
386+
387+
assertDurationMetric(
388+
testing, "io.opentelemetry.jdbc", DB_SYSTEM, DB_COLLECTION_NAME, DB_NAMESPACE, DB_OPERATION_NAME);
382389
}
383390

384391
static Stream<Arguments> preparedStatementStream() throws SQLException {

instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/JdbcInstrumenterFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import io.opentelemetry.api.OpenTelemetry;
1010
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeAttributesExtractor;
1111
import io.opentelemetry.instrumentation.api.incubator.semconv.code.CodeSpanNameExtractor;
12+
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientMetrics;
1213
import io.opentelemetry.instrumentation.api.incubator.semconv.db.DbClientSpanNameExtractor;
1314
import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesExtractor;
1415
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
@@ -52,6 +53,7 @@ public static Instrumenter<DbRequest, Void> createStatementInstrumenter(
5253
.setStatementSanitizationEnabled(statementSanitizationEnabled)
5354
.build())
5455
.addAttributesExtractor(ServerAttributesExtractor.create(netAttributesGetter))
56+
.addOperationMetrics(DbClientMetrics.get())
5557
.setEnabled(enabled)
5658
.buildInstrumenter(SpanKindExtractor.alwaysClient());
5759
}

instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,15 @@
55

66
package io.opentelemetry.instrumentation.jdbc.datasource;
77

8+
import static io.opentelemetry.instrumentation.jdbc.DbClientMetricsTestUtil.assertDurationMetric;
89
import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable;
910
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
11+
import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS;
12+
import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT;
13+
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAMESPACE;
14+
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION_NAME;
1015
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT;
16+
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM;
1117
import static org.assertj.core.api.Assertions.assertThat;
1218

1319
import io.opentelemetry.instrumentation.jdbc.internal.OpenTelemetryConnection;
@@ -44,6 +50,9 @@ void buildWithDefaults() throws SQLException {
4450
span ->
4551
span.hasName("SELECT dbname")
4652
.hasAttribute(equalTo(maybeStable(DB_STATEMENT), "SELECT ?;"))));
53+
54+
assertDurationMetric(
55+
testing, "io.opentelemetry.jdbc", DB_NAMESPACE, DB_OPERATION_NAME, DB_SYSTEM, SERVER_ADDRESS, SERVER_PORT);
4756
}
4857

4958
@Test

instrumentation/jdbc/testing/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,5 @@ plugins {
99

1010
dependencies {
1111
implementation("org.apache.groovy:groovy")
12+
implementation("io.opentelemetry.javaagent:opentelemetry-testing-common")
1213
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.jdbc;
7+
8+
import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv;
9+
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat;
10+
11+
import io.opentelemetry.api.common.AttributeKey;
12+
import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension;
13+
14+
public class DbClientMetricsTestUtil {
15+
16+
private DbClientMetricsTestUtil() {}
17+
18+
public static void assertDurationMetric(
19+
InstrumentationExtension testing, String instrumentationName, AttributeKey<?>... expectedKeys) {
20+
if (!emitStableDatabaseSemconv()) {
21+
return;
22+
}
23+
testing.waitAndAssertMetrics(
24+
instrumentationName,
25+
metrics ->
26+
metrics.hasName("db.client.operation.duration")
27+
.hasUnit("s")
28+
.hasDescription("Duration of database client operations.")
29+
.hasHistogramSatisfying(
30+
histogram ->
31+
histogram.hasPointsSatisfying(
32+
point ->
33+
point.hasAttributesSatisfying(
34+
attributes ->
35+
//
36+
// assertThat(attributes.asMap().keySet())
37+
//
38+
// .isEmpty())))));
39+
assertThat(attributes.asMap())
40+
.containsOnlyKeys(expectedKeys)))));
41+
}
42+
}

instrumentation/jedis/jedis-3.0/javaagent/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ dependencies {
1919
annotationProcessor("com.google.auto.value:auto-value")
2020

2121
implementation(project(":instrumentation:jedis:jedis-common:javaagent"))
22+
testImplementation(project(":instrumentation:jdbc:testing"))
2223

2324
// ensures jedis-1.4 instrumentation does not load with jedis 3.0+ by failing
2425
// the tests in the event it does. The tests will end up with double spans

0 commit comments

Comments
 (0)