From d2bb876e18e768ea4b3e5eef9f6d35510330b241 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 20 Oct 2025 12:41:29 -0400 Subject: [PATCH 1/3] Cassandra and Clickhouse metadata updates --- docs/instrumentation-list.yaml | 89 ++++++++++++++++--- .../src/test/java/CassandraClientTest.java | 23 +++++ .../cassandra/cassandra-3.0/metadata.yaml | 9 +- .../v4/common/AbstractCassandraTest.java | 25 ++++++ .../cassandra/v4_0/CassandraTest.java | 5 ++ .../cassandra/cassandra-4.0/metadata.yaml | 9 +- .../cassandra/v4_4/CassandraTest.java | 7 +- .../cassandra/cassandra-4.4/metadata.yaml | 7 +- .../clickhouse-client-v1-0.5/metadata.yaml | 9 +- .../clickhouse-client-v2-0.8/metadata.yaml | 9 +- 10 files changed, 169 insertions(+), 23 deletions(-) diff --git a/docs/instrumentation-list.yaml b/docs/instrumentation-list.yaml index 711326046102..bc696e94f632 100644 --- a/docs/instrumentation-list.yaml +++ b/docs/instrumentation-list.yaml @@ -2309,7 +2309,10 @@ libraries: cassandra: - name: cassandra-3.0 description: | - Instruments the Cassandra database client, providing database client spans and metrics for Cassandra queries. + This instrumentation enables database client spans and database client metrics for the DataStax Cassandra Driver. + semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS library_link: https://github.com/apache/cassandra-java-driver source_path: instrumentation/cassandra/cassandra-3.0 scope: @@ -2348,6 +2351,24 @@ libraries: - 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.operation.name + type: STRING + - name: db.system.name + type: STRING + - name: network.peer.address + type: STRING + - name: network.peer.port + type: LONG + - name: server.address + type: STRING + - name: server.port + type: LONG spans: - span_kind: CLIENT attributes: @@ -2373,7 +2394,10 @@ libraries: type: LONG - name: cassandra-4.0 description: | - Instruments the Cassandra database client, providing database client spans and metrics for Cassandra queries. + This instrumentation enables database client spans and database client metrics for the DataStax Cassandra Driver. + semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS library_link: https://github.com/apache/cassandra-java-driver source_path: instrumentation/cassandra/cassandra-4.0 scope: @@ -2424,6 +2448,24 @@ libraries: - 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.operation.name + type: STRING + - name: db.system.name + type: STRING + - name: network.peer.address + type: STRING + - name: network.peer.port + type: LONG + - name: server.address + type: STRING + - name: server.port + type: LONG spans: - span_kind: CLIENT attributes: @@ -2461,7 +2503,10 @@ libraries: type: LONG - name: cassandra-4.4 description: | - Instruments the Cassandra database client, providing database client spans and metrics for Cassandra queries. + This instrumentation enables database client spans and database client metrics for the DataStax Cassandra Driver. + semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS library_link: https://github.com/apache/cassandra-java-driver source_path: instrumentation/cassandra/cassandra-4.4 scope: @@ -2514,6 +2559,24 @@ libraries: - 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.operation.name + type: STRING + - name: db.system.name + type: STRING + - name: network.peer.address + type: STRING + - name: network.peer.port + type: LONG + - name: server.address + type: STRING + - name: server.port + type: LONG spans: - span_kind: CLIENT attributes: @@ -2551,8 +2614,11 @@ libraries: type: LONG clickhouse: - name: clickhouse-client-v1-0.5 - description: This instrumentation enables database client spans and metrics for - the V1 ClickHouse client. + description: | + This instrumentation enables database client spans and database client metrics for the ClickHouse Java Client. + semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS library_link: https://github.com/ClickHouse/clickhouse-java source_path: instrumentation/clickhouse/clickhouse-client-v1-0.5 scope: @@ -2619,8 +2685,11 @@ libraries: - name: server.port type: LONG - name: clickhouse-client-v2-0.8 - description: This instrumentation enables database client spans and metrics for - the V2 ClickHouse client. + description: | + This instrumentation enables database client spans and database client metrics for the ClickHouse Java Client. + semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS library_link: https://github.com/ClickHouse/clickhouse-java source_path: instrumentation/clickhouse/clickhouse-client-v2-0.8 scope: @@ -7721,7 +7790,7 @@ libraries: default: SCOPE_ - name: spring-web-3.1 description: | - This instrumentation provides a library integration that enables capturing HTTP client spans and metrics for Spring's RestTemplate. The agent integration enriches HTTP server spans and metrics with route information. + This instrumentation provides a library integration that enables capturing HTTP client spans and metrics for Spring's RestTemplate. library_link: https://github.com/spring-projects/spring-framework source_path: instrumentation/spring/spring-web/spring-web-3.1 scope: @@ -7761,8 +7830,8 @@ libraries: - name: url.full type: STRING - name: spring-web-6.0 - description: This instrumentation enriches HTTP server spans and metrics with - route information. + description: | + This instrumentation provides a library integration that enables capturing HTTP client spans and metrics for Spring's RestTemplate. library_link: https://github.com/spring-projects/spring-framework source_path: instrumentation/spring/spring-web/spring-web-6.0 minimum_java_version: 17 diff --git a/instrumentation/cassandra/cassandra-3.0/javaagent/src/test/java/CassandraClientTest.java b/instrumentation/cassandra/cassandra-3.0/javaagent/src/test/java/CassandraClientTest.java index 9d9a14a5c0c1..df243eadb388 100644 --- a/instrumentation/cassandra/cassandra-3.0/javaagent/src/test/java/CassandraClientTest.java +++ b/instrumentation/cassandra/cassandra-3.0/javaagent/src/test/java/CassandraClientTest.java @@ -3,8 +3,11 @@ * SPDX-License-Identifier: Apache-2.0 */ +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.DbAttributes.DB_OPERATION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; @@ -33,6 +36,7 @@ import java.util.stream.Stream; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -231,6 +235,25 @@ void asyncTest(Parameter parameter) { session.close(); } + @Test + void testMetrics() { + Session session = cluster.connect(); + + session.execute("DROP KEYSPACE IF EXISTS non_existent"); + + assertDurationMetric( + testing, + "io.opentelemetry.cassandra-3.0", + DB_SYSTEM_NAME, + DB_OPERATION_NAME, + NETWORK_PEER_ADDRESS, + NETWORK_PEER_PORT, + SERVER_ADDRESS, + SERVER_PORT); + + session.close(); + } + private static Stream provideSyncParameters() { return Stream.of( Arguments.of( diff --git a/instrumentation/cassandra/cassandra-3.0/metadata.yaml b/instrumentation/cassandra/cassandra-3.0/metadata.yaml index 1ba853179653..0fedeca07874 100644 --- a/instrumentation/cassandra/cassandra-3.0/metadata.yaml +++ b/instrumentation/cassandra/cassandra-3.0/metadata.yaml @@ -1,9 +1,12 @@ description: > - Instruments the Cassandra database client, providing database client spans and metrics for - Cassandra queries. + This instrumentation enables database client spans and database client metrics for the DataStax + Cassandra Driver. +semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS library_link: https://github.com/apache/cassandra-java-driver configurations: - name: otel.instrumentation.common.db-statement-sanitizer.enabled description: Enables statement sanitization for database queries. type: boolean - default: true + default: true \ No newline at end of file diff --git a/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java b/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java index c9176f852922..74b6451eca98 100644 --- a/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java +++ b/instrumentation/cassandra/cassandra-4-common/testing/src/main/java/io/opentelemetry/cassandra/v4/common/AbstractCassandraTest.java @@ -5,9 +5,12 @@ package io.opentelemetry.cassandra.v4.common; +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_OPERATION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; @@ -41,6 +44,7 @@ import java.util.stream.Stream; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; @@ -62,6 +66,8 @@ public abstract class AbstractCassandraTest { protected abstract InstrumentationExtension testing(); + protected abstract String getInstrumentationName(); + protected CqlSession wrap(CqlSession session) { return session; } @@ -81,6 +87,25 @@ static void beforeAll() throws UnknownHostException { cassandraPort = cassandra.getMappedPort(9042); } + @Test + void testMetrics() { + CqlSession session = getSession(null); + + session.execute("DROP KEYSPACE IF EXISTS non_existent"); + + assertDurationMetric( + testing(), + getInstrumentationName(), + DB_SYSTEM_NAME, + DB_OPERATION_NAME, + NETWORK_PEER_ADDRESS, + NETWORK_PEER_PORT, + SERVER_ADDRESS, + SERVER_PORT); + + session.close(); + } + @AfterAll static void afterAll() { cassandra.stop(); diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTest.java b/instrumentation/cassandra/cassandra-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTest.java index 1df7618a85c9..0cd9472cb887 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTest.java +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_0/CassandraTest.java @@ -12,6 +12,11 @@ class CassandraTest extends AbstractCassandraTest { + @Override + protected String getInstrumentationName() { + return "io.opentelemetry.cassandra-4.0"; + } + @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); diff --git a/instrumentation/cassandra/cassandra-4.0/metadata.yaml b/instrumentation/cassandra/cassandra-4.0/metadata.yaml index 1ba853179653..0fedeca07874 100644 --- a/instrumentation/cassandra/cassandra-4.0/metadata.yaml +++ b/instrumentation/cassandra/cassandra-4.0/metadata.yaml @@ -1,9 +1,12 @@ description: > - Instruments the Cassandra database client, providing database client spans and metrics for - Cassandra queries. + This instrumentation enables database client spans and database client metrics for the DataStax + Cassandra Driver. +semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS library_link: https://github.com/apache/cassandra-java-driver configurations: - name: otel.instrumentation.common.db-statement-sanitizer.enabled description: Enables statement sanitization for database queries. type: boolean - default: true + default: true \ No newline at end of file diff --git a/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTest.java b/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTest.java index bb281d630b02..d1407d322e77 100644 --- a/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTest.java +++ b/instrumentation/cassandra/cassandra-4.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/cassandra/v4_4/CassandraTest.java @@ -10,7 +10,12 @@ import io.opentelemetry.testing.cassandra.v4_4.AbstractCassandra44Test; import org.junit.jupiter.api.extension.RegisterExtension; -public class CassandraTest extends AbstractCassandra44Test { +class CassandraTest extends AbstractCassandra44Test { + + @Override + protected String getInstrumentationName() { + return "io.opentelemetry.cassandra-4.4"; + } @RegisterExtension static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); diff --git a/instrumentation/cassandra/cassandra-4.4/metadata.yaml b/instrumentation/cassandra/cassandra-4.4/metadata.yaml index 1ba853179653..78f5f48b793a 100644 --- a/instrumentation/cassandra/cassandra-4.4/metadata.yaml +++ b/instrumentation/cassandra/cassandra-4.4/metadata.yaml @@ -1,6 +1,9 @@ description: > - Instruments the Cassandra database client, providing database client spans and metrics for - Cassandra queries. + This instrumentation enables database client spans and database client metrics for the DataStax + Cassandra Driver. +semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS library_link: https://github.com/apache/cassandra-java-driver configurations: - name: otel.instrumentation.common.db-statement-sanitizer.enabled diff --git a/instrumentation/clickhouse/clickhouse-client-v1-0.5/metadata.yaml b/instrumentation/clickhouse/clickhouse-client-v1-0.5/metadata.yaml index ba32cb2b0861..fc0236fee3de 100644 --- a/instrumentation/clickhouse/clickhouse-client-v1-0.5/metadata.yaml +++ b/instrumentation/clickhouse/clickhouse-client-v1-0.5/metadata.yaml @@ -1,7 +1,12 @@ -description: This instrumentation enables database client spans and metrics for the V1 ClickHouse client. +description: > + This instrumentation enables database client spans and database client metrics for the ClickHouse + Java Client. +semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS library_link: https://github.com/ClickHouse/clickhouse-java configurations: - name: otel.instrumentation.common.db-statement-sanitizer.enabled description: Enables statement sanitization for database queries. type: boolean - default: true + default: true \ No newline at end of file diff --git a/instrumentation/clickhouse/clickhouse-client-v2-0.8/metadata.yaml b/instrumentation/clickhouse/clickhouse-client-v2-0.8/metadata.yaml index 7eb21f947bc4..fc0236fee3de 100644 --- a/instrumentation/clickhouse/clickhouse-client-v2-0.8/metadata.yaml +++ b/instrumentation/clickhouse/clickhouse-client-v2-0.8/metadata.yaml @@ -1,7 +1,12 @@ -description: This instrumentation enables database client spans and metrics for the V2 ClickHouse client. +description: > + This instrumentation enables database client spans and database client metrics for the ClickHouse + Java Client. +semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS library_link: https://github.com/ClickHouse/clickhouse-java configurations: - name: otel.instrumentation.common.db-statement-sanitizer.enabled description: Enables statement sanitization for database queries. type: boolean - default: true + default: true \ No newline at end of file From fbfe978852b8b51295da7390a5ddd475fa5233a0 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 20 Oct 2025 13:32:38 -0400 Subject: [PATCH 2/3] instrumentation name --- .../instrumentation/cassandra/v4_4/CassandraTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/instrumentation/cassandra/cassandra-4.4/library/src/test/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTest.java b/instrumentation/cassandra/cassandra-4.4/library/src/test/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTest.java index dcb2bb7848f0..a0eae9b9024c 100644 --- a/instrumentation/cassandra/cassandra-4.4/library/src/test/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTest.java +++ b/instrumentation/cassandra/cassandra-4.4/library/src/test/java/io/opentelemetry/instrumentation/cassandra/v4_4/CassandraTest.java @@ -13,6 +13,11 @@ public class CassandraTest extends AbstractCassandra44Test { + @Override + protected String getInstrumentationName() { + return "io.opentelemetry.cassandra-4.4"; + } + @RegisterExtension static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); From 5f71aea5995e02f31839ed7839065684732ac6a3 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 20 Oct 2025 15:51:53 -0400 Subject: [PATCH 3/3] fix latest deps --- .../cassandra/cassandra-4.0/javaagent/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts index 2ccb1fda9e01..cec24c09da88 100644 --- a/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts +++ b/instrumentation/cassandra/cassandra-4.0/javaagent/build.gradle.kts @@ -13,6 +13,7 @@ muzzle { dependencies { library("com.datastax.oss:java-driver-core:4.0.0") + latestDepTestLibrary("com.datastax.oss:java-driver-core:4.3.+") // see cassandra-4.4 module compileOnly("com.google.auto.value:auto-value-annotations") annotationProcessor("com.google.auto.value:auto-value")