Skip to content

Commit 3fd27aa

Browse files
authored
add db client metrics for JDBC, vertx, r2dbc, cassandra, add tests (#12818)
1 parent 965e886 commit 3fd27aa

File tree

11 files changed

+101
-2
lines changed

11 files changed

+101
-2
lines changed

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

+2
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

+2
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

+2
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

+2
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

+18-1
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.testing.junit.db.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,19 @@ public void testBasicStatement(
379383
equalTo(maybeStable(DB_STATEMENT), sanitizedQuery),
380384
equalTo(maybeStable(DB_OPERATION), "SELECT"),
381385
equalTo(maybeStable(DB_SQL_TABLE), table))));
386+
387+
if (table != null) {
388+
assertDurationMetric(
389+
testing,
390+
"io.opentelemetry.jdbc",
391+
DB_SYSTEM,
392+
DB_COLLECTION_NAME,
393+
DB_NAMESPACE,
394+
DB_OPERATION_NAME);
395+
} else {
396+
assertDurationMetric(
397+
testing, "io.opentelemetry.jdbc", DB_SYSTEM, DB_OPERATION_NAME, DB_NAMESPACE);
398+
}
382399
}
383400

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

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

+2
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

+15
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.testing.junit.db.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,15 @@ void buildWithDefaults() throws SQLException {
4450
span ->
4551
span.hasName("SELECT dbname")
4652
.hasAttribute(equalTo(maybeStable(DB_STATEMENT), "SELECT ?;"))));
53+
54+
assertDurationMetric(
55+
testing,
56+
"io.opentelemetry.jdbc",
57+
DB_NAMESPACE,
58+
DB_OPERATION_NAME,
59+
DB_SYSTEM,
60+
SERVER_ADDRESS,
61+
SERVER_PORT);
4762
}
4863

4964
@Test

instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java

+12
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55

66
package io.opentelemetry.javaagent.instrumentation.jedis.v3_0;
77

8+
import static io.opentelemetry.instrumentation.testing.junit.db.DbClientMetricsTestUtil.assertDurationMetric;
89
import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable;
910
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo;
1011
import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies;
@@ -14,6 +15,7 @@
1415
import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS;
1516
import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT;
1617
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION;
18+
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION_NAME;
1719
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT;
1820
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM;
1921
import static org.assertj.core.api.Assertions.assertThat;
@@ -88,6 +90,16 @@ void setCommand() {
8890
equalTo(NETWORK_TYPE, "ipv4"),
8991
equalTo(NETWORK_PEER_ADDRESS, ip),
9092
satisfies(NETWORK_PEER_PORT, AbstractLongAssert::isNotNegative))));
93+
94+
assertDurationMetric(
95+
testing,
96+
"io.opentelemetry.jedis-3.0",
97+
DB_OPERATION_NAME,
98+
DB_SYSTEM,
99+
SERVER_ADDRESS,
100+
SERVER_PORT,
101+
NETWORK_PEER_ADDRESS,
102+
NETWORK_PEER_PORT);
91103
}
92104

93105
@Test

instrumentation/r2dbc-1.0/library/src/main/java/io/opentelemetry/instrumentation/r2dbc/v1_0/internal/R2dbcInstrumenterBuilder.java

+2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import com.google.errorprone.annotations.CanIgnoreReturnValue;
99
import io.opentelemetry.api.OpenTelemetry;
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.AttributesExtractor;
@@ -58,6 +59,7 @@ public Instrumenter<DbExecution, Void> build(
5859
.build())
5960
.addAttributesExtractor(ServerAttributesExtractor.create(R2dbcNetAttributesGetter.INSTANCE))
6061
.addAttributesExtractors(additionalExtractors)
62+
.addOperationMetrics(DbClientMetrics.get())
6163
.buildInstrumenter(SpanKindExtractor.alwaysClient());
6264
}
6365
}

instrumentation/vertx/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientSingletons.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import io.opentelemetry.api.GlobalOpenTelemetry;
99
import io.opentelemetry.context.Context;
1010
import io.opentelemetry.context.Scope;
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;
@@ -47,7 +48,8 @@ public final class VertxSqlClientSingletons {
4748
.addAttributesExtractor(
4849
PeerServiceAttributesExtractor.create(
4950
VertxSqlClientNetAttributesGetter.INSTANCE,
50-
AgentCommonConfig.get().getPeerServiceResolver()));
51+
AgentCommonConfig.get().getPeerServiceResolver()))
52+
.addOperationMetrics(DbClientMetrics.get());
5153

5254
INSTRUMENTER = builder.buildInstrumenter(SpanKindExtractor.alwaysClient());
5355
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.instrumentation.testing.junit.db;
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,
20+
String instrumentationName,
21+
AttributeKey<?>... expectedKeys) {
22+
if (!emitStableDatabaseSemconv()) {
23+
return;
24+
}
25+
testing.waitAndAssertMetrics(
26+
instrumentationName,
27+
metrics ->
28+
metrics
29+
.hasName("db.client.operation.duration")
30+
.hasUnit("s")
31+
.hasDescription("Duration of database client operations.")
32+
.hasHistogramSatisfying(
33+
histogram ->
34+
histogram.hasPointsSatisfying(
35+
point ->
36+
point.hasAttributesSatisfying(
37+
attributes ->
38+
assertThat(attributes.asMap())
39+
.containsOnlyKeys(expectedKeys)))));
40+
}
41+
}

0 commit comments

Comments
 (0)