From f98ff969a420be2709c75f8b6ad5ba8537789fef Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Mon, 15 Jun 2026 11:12:39 -0700 Subject: [PATCH] Add JDBC transaction duration metrics --- .../internal/JdbcInstrumenterFactory.java | 1 + .../jdbc/datasource/JdbcTelemetryTest.java | 27 +++++++++++++++++++ 2 files changed, 28 insertions(+) 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 758e4bbd9c5a..62c28844ecc8 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 @@ -133,6 +133,7 @@ public static Instrumenter createTransactionInstrumenter( SqlClientAttributesExtractor.builder(new JdbcAttributesGetter()).build()) .addAttributesExtractor(new TransactionAttributeExtractor()) .addAttributesExtractors(extractors) + .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 0c28b0c009f4..f6daea823e6d 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 @@ -11,6 +11,7 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.semconv.DbAttributes.DB_NAMESPACE; import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_BATCH_SIZE; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; import static io.opentelemetry.semconv.DbAttributes.DB_QUERY_TEXT; import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; import static io.opentelemetry.semconv.DbAttributes.DbSystemNameValues.POSTGRESQL; @@ -203,6 +204,32 @@ void buildWithTransactionInstrumenterEnabled() throws SQLException { span -> span.hasName("ROLLBACK"))); } + @Test + void transactionMetrics() throws SQLException { + JdbcTelemetry telemetry = + JdbcTelemetry.builder(testing.getOpenTelemetry()) + .setTransactionInstrumenterEnabled(true) + .build(); + + DataSource dataSource = telemetry.wrap(new TestDataSource()); + + testing.runWithSpan("parent", () -> dataSource.getConnection().commit()); + + testing.waitAndAssertTraces( + trace -> + trace.hasSpansSatisfyingExactly( + span -> span.hasName("parent"), span -> span.hasName("COMMIT"))); + + assertDurationMetric( + testing, + "io.opentelemetry.jdbc", + DB_NAMESPACE, + DB_OPERATION_NAME, + DB_SYSTEM_NAME, + SERVER_ADDRESS, + SERVER_PORT); + } + @Test void buildWithSanitizationDisabled() throws SQLException { JdbcTelemetry telemetry =