From 91cde4ccd1f99f1a4f2a88fe9a0819b571494b5a Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 18 Aug 2025 14:52:53 -0400 Subject: [PATCH 1/5] telemetry collection for couchbase --- instrumentation-docs/collect.sh | 24 +- instrumentation-docs/instrumentations.sh | 242 +++++++++--------- .../couchbase-2.0/javaagent/build.gradle.kts | 3 + .../couchbase/v2_0/CouchbaseClientTest.java | 23 ++ .../couchbase/couchbase-2.0/metadata.yaml | 6 +- .../couchbase-2.6/javaagent/build.gradle.kts | 10 +- .../couchbase/v2_6/Couchbase26Util.java | 12 +- .../couchbase/v2_6/CouchbaseClient26Test.java | 17 ++ .../couchbase/couchbase-3.1.6/metadata.yaml | 4 +- .../couchbase/couchbase-3.1/metadata.yaml | 4 +- .../couchbase/couchbase-3.2/metadata.yaml | 4 +- .../AbstractCouchbaseAsyncClientTest.java | 18 +- .../AbstractCouchbaseClientTest.java | 4 +- .../couchbase/AbstractCouchbaseTest.java | 5 +- 14 files changed, 206 insertions(+), 170 deletions(-) diff --git a/instrumentation-docs/collect.sh b/instrumentation-docs/collect.sh index 130aaff2d908..04301d83103f 100755 --- a/instrumentation-docs/collect.sh +++ b/instrumentation-docs/collect.sh @@ -143,7 +143,7 @@ find_and_remove_all_telemetry() { # Main execution main() { - colima stop +# colima stop # Process regular instrumentations echo "Processing standard instrumentations..." @@ -154,17 +154,17 @@ main() { run_gradle_tasks "${gradle_tasks[@]}" # Setup colima if needed - setup_colima - - # Process colima-specific instrumentations - echo "Processing colima instrumentations..." - gradle_tasks=() - while IFS= read -r line; do - gradle_tasks+=("$line") - done < <(process_descriptors "${COLIMA_INSTRUMENTATIONS[@]}") - run_gradle_tasks "${gradle_tasks[@]}" - - colima stop +# setup_colima +# +# # Process colima-specific instrumentations +# echo "Processing colima instrumentations..." +# gradle_tasks=() +# while IFS= read -r line; do +# gradle_tasks+=("$line") +# done < <(process_descriptors "${COLIMA_INSTRUMENTATIONS[@]}") +# run_gradle_tasks "${gradle_tasks[@]}" +# +# colima stop # uncomment the next line to remove all .telemetry directories #find_and_remove_all_telemetry diff --git a/instrumentation-docs/instrumentations.sh b/instrumentation-docs/instrumentations.sh index 87fd91e0f8a6..1ad39ceef044 100755 --- a/instrumentation-docs/instrumentations.sh +++ b/instrumentation-docs/instrumentations.sh @@ -7,124 +7,130 @@ set -euo pipefail # shellcheck disable=SC2034 readonly INSTRUMENTATIONS=( # : : [ gradle-task-suffix ] - "activej-http-6.0:javaagent:test" - "akka:akka-http-10.0:javaagent:test" - "armeria:armeria-grpc-1.14:javaagent:test" - "apache-httpasyncclient-4.1:javaagent:test" - "alibaba-druid-1.0:javaagent:test" - "alibaba-druid-1.0:javaagent:testStableSemconv" - "apache-dbcp-2.0:javaagent:test" - "apache-dbcp-2.0:javaagent:testStableSemconv" - "apache-httpclient:apache-httpclient-2.0:javaagent:test" - "apache-httpclient:apache-httpclient-4.0:javaagent:test" - "apache-httpclient:apache-httpclient-4.3:library:test" - "apache-httpclient:apache-httpclient-5.0:javaagent:test" - "apache-dubbo-2.7:javaagent:testDubbo" - "c3p0-0.9:javaagent:test" - "c3p0-0.9:javaagent:testStableSemconv" - "clickhouse-client-0.5:javaagent:test" - "clickhouse-client-0.5:javaagent:testStableSemconv" - "aws-sdk:aws-sdk-1.11:javaagent:test" - "google-http-client-1.19:javaagent:test" - "http-url-connection:javaagent:test" - "java-http-client:javaagent:test" - "jetty-httpclient:jetty-httpclient-9.2:javaagent:test" - "jetty-httpclient:jetty-httpclient-12.0:javaagent:test" - "jodd-http-4.2:javaagent:test" - "netty:netty-3.8:javaagent:test" - "netty:netty-4.0:javaagent:test" - "netty:netty-4.1:javaagent:test" - "okhttp:okhttp-2.2:javaagent:test" - "okhttp:okhttp-3.0:javaagent:test" - "pekko:pekko-http-1.0:javaagent:test" - "play:play-ws:play-ws-1.0:javaagent:test" - "play:play-ws:play-ws-2.0:javaagent:test" - "play:play-ws:play-ws-2.1:javaagent:test" - "reactor:reactor-netty:reactor-netty-0.9:javaagent:test" - "reactor:reactor-netty:reactor-netty-1.0:javaagent:test" - "spring:spring-webflux:spring-webflux-5.0:javaagent:test" - "vertx:vertx-http-client:vertx-http-client-3.0:javaagent:test" - "vertx:vertx-http-client:vertx-http-client-4.0:javaagent:test" - "vertx:vertx-http-client:vertx-http-client-5.0:javaagent:test" - "vertx:vertx-redis-client-4.0:javaagent:test" - "vertx:vertx-redis-client-4.0:javaagent:testStableSemconv" - "vertx:vertx-sql-client:vertx-sql-client-4.0:javaagent:test" - "vertx:vertx-sql-client:vertx-sql-client-4.0:javaagent:testStableSemconv" - "vertx:vertx-sql-client:vertx-sql-client-5.0:javaagent:test" - "vertx:vertx-sql-client:vertx-sql-client-5.0:javaagent:testStableSemconv" - "aws-sdk:aws-sdk-1.11:javaagent:testStableSemconv" - "aws-sdk:aws-sdk-2.2:javaagent:test" - "aws-sdk:aws-sdk-2.2:javaagent:testStableSemconv" - "aws-sdk:aws-sdk-2.2:javaagent:testBedrockRuntime" - "hikaricp-3.0:javaagent:test" - "hikaricp-3.0:javaagent:testStableSemconv" - "tomcat:tomcat-jdbc:javaagent:test" - "tomcat:tomcat-jdbc:javaagent:testStableSemconv" - "oshi:javaagent:test" - "oshi:javaagent:testExperimental" - "vibur-dbcp-11.0:javaagent:test" - "vibur-dbcp-11.0:javaagent:testStableSemconv" - "elasticsearch:elasticsearch-api-client-7.16:javaagent:test" - "elasticsearch:elasticsearch-api-client-7.16:javaagent:testStableSemconv" - "elasticsearch:elasticsearch-rest-7.0:javaagent:test" - "elasticsearch:elasticsearch-transport-5.0:javaagent:test" - "elasticsearch:elasticsearch-transport-5.0:javaagent:testStableSemconv" - "elasticsearch:elasticsearch-transport-5.0:javaagent:testExperimental" - "elasticsearch:elasticsearch-transport-5.3:javaagent:test" - "elasticsearch:elasticsearch-transport-5.3:javaagent:testStableSemconv" - "elasticsearch:elasticsearch-transport-5.3:javaagent:testExperimental" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6Test" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6TestStableSemconv" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6TestExperimental" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65Test" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65TestStableSemconv" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65TestExperimental" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7Test" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7TestStableSemconv" - "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7TestExperimental" - "apache-httpclient:apache-httpclient-5.2:library:test" - "armeria:armeria-1.3:javaagent:test" - "async-http-client:async-http-client-1.9:javaagent:test" - "async-http-client:async-http-client-2.0:javaagent:test" - "apache-dubbo-2.7:javaagent:testDubbo" - "finagle-http-23.11:javaagent:test" - "finatra-2.9:javaagent:test" - "spring:spring-batch-3.0:javaagent:test" - "spring:spring-data:spring-data-1.8:javaagent:test" - "spring:spring-integration-4.1:javaagent:test" - "spring:spring-integration-4.1:javaagent:testWithRabbitInstrumentation" - "spring:spring-integration-4.1:javaagent:testWithProducerInstrumentation" - "spring:spring-jms:spring-jms-2.0:javaagent:test" - "spring:spring-kafka-2.7:javaagent:test" - "spring:spring-kafka-2.7:javaagent:testNoReceiveTelemetry" - "spring:spring-pulsar-1.0:javaagent:test" - "spring:spring-rabbit-1.0:javaagent:test" - "spring:spring-rmi-4.0:javaagent:test" - "spring:spring-scheduling-3.1:javaagent:test" - "spring:spring-scheduling-3.1:javaagent:testExperimental" - "spring:spring-web:spring-web-3.1:library:test" - "spring:spring-web:spring-web-6.0:javaagent:test" - "spring:spring-webflux:spring-webflux-5.0:javaagent:test" - "spring:spring-webflux:spring-webflux-5.3:library:test" - "spring:spring-webmvc:spring-webmvc-3.1:javaagent:test" - "spring:spring-webmvc:spring-webmvc-3.1:javaagent:testExperimental" - "spring:spring-webmvc:spring-webmvc-5.3:library:test" - "spring:spring-webmvc:spring-webmvc-6.0:javaagent:test" - "spring:spring-webmvc:spring-webmvc-3.1:javaagent:testExperimental" - "spring:spring-webmvc:spring-webmvc-6.0:javaagent:test" - "spring:spring-webmvc:spring-webmvc-6.0:javaagent:testExperimental" - "openai:openai-java-1.1:javaagent:test" - "aws-lambda:aws-lambda-core-1.0:javaagent:test" - "aws-lambda:aws-lambda-events-2.2:javaagent:test" - "cassandra:cassandra-3.0:javaagent:test" - "cassandra:cassandra-3.0:javaagent:testStableSemconv" - "cassandra:cassandra-4.0:javaagent:test" - "cassandra:cassandra-4.0:javaagent:testStableSemconv" - "cassandra:cassandra-4.4:javaagent:test" - "cassandra:cassandra-4.4:javaagent:testStableSemconv" - "camel-2.20:javaagent:test" - "camel-2.20:javaagent:testStableSemconv" - "camel-2.20:javaagent:testExperimental" +# "activej-http-6.0:javaagent:test" +# "akka:akka-http-10.0:javaagent:test" +# "armeria:armeria-grpc-1.14:javaagent:test" +# "apache-httpasyncclient-4.1:javaagent:test" +# "alibaba-druid-1.0:javaagent:test" +# "alibaba-druid-1.0:javaagent:testStableSemconv" +# "apache-dbcp-2.0:javaagent:test" +# "apache-dbcp-2.0:javaagent:testStableSemconv" +# "apache-httpclient:apache-httpclient-2.0:javaagent:test" +# "apache-httpclient:apache-httpclient-4.0:javaagent:test" +# "apache-httpclient:apache-httpclient-4.3:library:test" +# "apache-httpclient:apache-httpclient-5.0:javaagent:test" +# "apache-dubbo-2.7:javaagent:testDubbo" +# "c3p0-0.9:javaagent:test" +# "c3p0-0.9:javaagent:testStableSemconv" +# "clickhouse-client-0.5:javaagent:test" +# "clickhouse-client-0.5:javaagent:testStableSemconv" +# "aws-sdk:aws-sdk-1.11:javaagent:test" +# "google-http-client-1.19:javaagent:test" +# "http-url-connection:javaagent:test" +# "java-http-client:javaagent:test" +# "jetty-httpclient:jetty-httpclient-9.2:javaagent:test" +# "jetty-httpclient:jetty-httpclient-12.0:javaagent:test" +# "jodd-http-4.2:javaagent:test" +# "netty:netty-3.8:javaagent:test" +# "netty:netty-4.0:javaagent:test" +# "netty:netty-4.1:javaagent:test" +# "okhttp:okhttp-2.2:javaagent:test" +# "okhttp:okhttp-3.0:javaagent:test" +# "pekko:pekko-http-1.0:javaagent:test" +# "play:play-ws:play-ws-1.0:javaagent:test" +# "play:play-ws:play-ws-2.0:javaagent:test" +# "play:play-ws:play-ws-2.1:javaagent:test" +# "reactor:reactor-netty:reactor-netty-0.9:javaagent:test" +# "reactor:reactor-netty:reactor-netty-1.0:javaagent:test" +# "spring:spring-webflux:spring-webflux-5.0:javaagent:test" +# "vertx:vertx-http-client:vertx-http-client-3.0:javaagent:test" +# "vertx:vertx-http-client:vertx-http-client-4.0:javaagent:test" +# "vertx:vertx-http-client:vertx-http-client-5.0:javaagent:test" +# "vertx:vertx-redis-client-4.0:javaagent:test" +# "vertx:vertx-redis-client-4.0:javaagent:testStableSemconv" +# "vertx:vertx-sql-client:vertx-sql-client-4.0:javaagent:test" +# "vertx:vertx-sql-client:vertx-sql-client-4.0:javaagent:testStableSemconv" +# "vertx:vertx-sql-client:vertx-sql-client-5.0:javaagent:test" +# "vertx:vertx-sql-client:vertx-sql-client-5.0:javaagent:testStableSemconv" +# "aws-sdk:aws-sdk-1.11:javaagent:testStableSemconv" +# "aws-sdk:aws-sdk-2.2:javaagent:test" +# "aws-sdk:aws-sdk-2.2:javaagent:testStableSemconv" +# "aws-sdk:aws-sdk-2.2:javaagent:testBedrockRuntime" +# "hikaricp-3.0:javaagent:test" +# "hikaricp-3.0:javaagent:testStableSemconv" +# "tomcat:tomcat-jdbc:javaagent:test" +# "tomcat:tomcat-jdbc:javaagent:testStableSemconv" +# "oshi:javaagent:test" +# "oshi:javaagent:testExperimental" +# "vibur-dbcp-11.0:javaagent:test" +# "vibur-dbcp-11.0:javaagent:testStableSemconv" +# "elasticsearch:elasticsearch-api-client-7.16:javaagent:test" +# "elasticsearch:elasticsearch-api-client-7.16:javaagent:testStableSemconv" +# "elasticsearch:elasticsearch-rest-7.0:javaagent:test" +# "elasticsearch:elasticsearch-transport-5.0:javaagent:test" +# "elasticsearch:elasticsearch-transport-5.0:javaagent:testStableSemconv" +# "elasticsearch:elasticsearch-transport-5.0:javaagent:testExperimental" +# "elasticsearch:elasticsearch-transport-5.3:javaagent:test" +# "elasticsearch:elasticsearch-transport-5.3:javaagent:testStableSemconv" +# "elasticsearch:elasticsearch-transport-5.3:javaagent:testExperimental" +# "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6Test" +# "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6TestStableSemconv" +# "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch6TestExperimental" +# "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65Test" +# "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65TestStableSemconv" +# "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch65TestExperimental" +# "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7Test" +# "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7TestStableSemconv" +# "elasticsearch:elasticsearch-transport-6.0:javaagent:elasticsearch7TestExperimental" +# "apache-httpclient:apache-httpclient-5.2:library:test" +# "armeria:armeria-1.3:javaagent:test" +# "async-http-client:async-http-client-1.9:javaagent:test" +# "async-http-client:async-http-client-2.0:javaagent:test" +# "apache-dubbo-2.7:javaagent:testDubbo" +# "finagle-http-23.11:javaagent:test" +# "finatra-2.9:javaagent:test" +# "spring:spring-batch-3.0:javaagent:test" +# "spring:spring-data:spring-data-1.8:javaagent:test" +# "spring:spring-integration-4.1:javaagent:test" +# "spring:spring-integration-4.1:javaagent:testWithRabbitInstrumentation" +# "spring:spring-integration-4.1:javaagent:testWithProducerInstrumentation" +# "spring:spring-jms:spring-jms-2.0:javaagent:test" +# "spring:spring-kafka-2.7:javaagent:test" +# "spring:spring-kafka-2.7:javaagent:testNoReceiveTelemetry" +# "spring:spring-pulsar-1.0:javaagent:test" +# "spring:spring-rabbit-1.0:javaagent:test" +# "spring:spring-rmi-4.0:javaagent:test" +# "spring:spring-scheduling-3.1:javaagent:test" +# "spring:spring-scheduling-3.1:javaagent:testExperimental" +# "spring:spring-web:spring-web-3.1:library:test" +# "spring:spring-web:spring-web-6.0:javaagent:test" +# "spring:spring-webflux:spring-webflux-5.0:javaagent:test" +# "spring:spring-webflux:spring-webflux-5.3:library:test" +# "spring:spring-webmvc:spring-webmvc-3.1:javaagent:test" +# "spring:spring-webmvc:spring-webmvc-3.1:javaagent:testExperimental" +# "spring:spring-webmvc:spring-webmvc-5.3:library:test" +# "spring:spring-webmvc:spring-webmvc-6.0:javaagent:test" +# "spring:spring-webmvc:spring-webmvc-3.1:javaagent:testExperimental" +# "spring:spring-webmvc:spring-webmvc-6.0:javaagent:test" +# "spring:spring-webmvc:spring-webmvc-6.0:javaagent:testExperimental" +# "openai:openai-java-1.1:javaagent:test" +# "aws-lambda:aws-lambda-core-1.0:javaagent:test" +# "aws-lambda:aws-lambda-events-2.2:javaagent:test" +# "cassandra:cassandra-3.0:javaagent:test" +# "cassandra:cassandra-3.0:javaagent:testStableSemconv" +# "cassandra:cassandra-4.0:javaagent:test" +# "cassandra:cassandra-4.0:javaagent:testStableSemconv" +# "cassandra:cassandra-4.4:javaagent:test" +# "cassandra:cassandra-4.4:javaagent:testStableSemconv" +# "camel-2.20:javaagent:test" +# "camel-2.20:javaagent:testStableSemconv" +# "camel-2.20:javaagent:testExperimental" + +# "couchbase:couchbase-2.0:javaagent:test" +# "couchbase:couchbase-2.0:javaagent:testStableSemconv" + "couchbase:couchbase-2.6:javaagent:test" + "couchbase:couchbase-2.6:javaagent:testStableSemconv" + "couchbase:couchbase-2.6:javaagent:testExperimental" ) # Some instrumentation test suites don't run ARM, so we use colima to run them in an x86_64 diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/build.gradle.kts b/instrumentation/couchbase/couchbase-2.0/javaagent/build.gradle.kts index 3f6ce16b21e7..76e51366e10a 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/build.gradle.kts +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/build.gradle.kts @@ -36,10 +36,13 @@ tasks { jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") jvmArgs("--add-opens=java.base/java.lang.invoke=ALL-UNNAMED") jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") + + systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") } val testStableSemconv by registering(Test::class) { jvmArgs("-Dotel.semconv-stability.opt-in=database") + systemProperty("metadataConfig", "otel.semconv-stability.opt-in=database") } check { diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseClientTest.java b/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseClientTest.java index 0890358a8ead..a1c2a41bb1fa 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseClientTest.java +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseClientTest.java @@ -5,9 +5,17 @@ package io.opentelemetry.javaagent.instrumentation.couchbase.v2_0; +import static io.opentelemetry.instrumentation.testing.junit.db.DbClientMetricsTestUtil.assertDurationMetric; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; +import static org.assertj.core.api.Assertions.assertThat; + +import com.couchbase.client.java.CouchbaseCluster; import com.couchbase.client.java.cluster.BucketSettings; +import com.couchbase.client.java.cluster.ClusterManager; import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; import io.opentelemetry.instrumentation.couchbase.AbstractCouchbaseClientTest; +import org.junit.jupiter.api.Test; class CouchbaseClientTest extends AbstractCouchbaseClientTest { @@ -16,4 +24,19 @@ protected DefaultCouchbaseEnvironment.Builder envBuilder( BucketSettings bucketSettings, int carrierDirectPort, int httpDirectPort) { return CouchbaseUtil.envBuilder(bucketSettings, carrierDirectPort, httpDirectPort); } + + @Test + void hasDurationMetric() { + CouchbaseCluster cluster = prepareCluster(bucketCouchbase); + ClusterManager manager = cluster.clusterManager(USERNAME, PASSWORD); + + testing.waitForTraces(1); + testing.clearData(); + + boolean hasBucket = manager.hasBucket(bucketCouchbase.name()); + assertThat(hasBucket).isTrue(); + + assertDurationMetric( + testing, "io.opentelemetry.couchbase-2.0", DB_SYSTEM_NAME, DB_OPERATION_NAME); + } } diff --git a/instrumentation/couchbase/couchbase-2.0/metadata.yaml b/instrumentation/couchbase/couchbase-2.0/metadata.yaml index 6295fa1c643e..512f25c90b24 100644 --- a/instrumentation/couchbase/couchbase-2.0/metadata.yaml +++ b/instrumentation/couchbase/couchbase-2.0/metadata.yaml @@ -1,5 +1 @@ -configurations: - - name: otel.instrumentation.couchbase.experimental-span-attributes - description: Enables experimental span attributes `couchbase.operation_id` and `couchbase.local.address` - type: boolean - default: false +descriptions: This instrumentation enables database CLIENT spans and metrics for Couchbase operations. diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts b/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts index 891771afade8..186799bf0fd1 100644 --- a/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts @@ -35,9 +35,6 @@ dependencies { tasks { withType().configureEach { - // TODO run tests both with and without experimental span attributes - jvmArgs("-Dotel.instrumentation.couchbase.experimental-span-attributes=true") - // required on jdk17 jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") @@ -47,7 +44,12 @@ tasks { jvmArgs("-Dotel.semconv-stability.opt-in=database") } + val testExperimental by registering(Test::class) { + jvmArgs("-Dotel.instrumentation.couchbase.experimental-span-attributes=true") + systemProperty("metadataConfig", "otel.instrumentation.couchbase.experimental-span-attributes=true") + } + check { - dependsOn(testStableSemconv) + dependsOn(testStableSemconv, testExperimental) } } diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/Couchbase26Util.java b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/Couchbase26Util.java index f884a4857eeb..e8e14e67861c 100644 --- a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/Couchbase26Util.java +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/Couchbase26Util.java @@ -5,20 +5,20 @@ package io.opentelemetry.javaagent.instrumentation.couchbase.v2_6; +import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; -import static org.assertj.core.api.Assertions.assertThat; import com.couchbase.client.core.metrics.DefaultLatencyMetricsCollectorConfig; import com.couchbase.client.core.metrics.DefaultMetricsCollectorConfig; import com.couchbase.client.java.cluster.BucketSettings; import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; -import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.semconv.NetworkAttributes; import java.util.Arrays; import java.util.List; import java.util.concurrent.TimeUnit; +import org.assertj.core.api.AbstractAssert; public class Couchbase26Util { @@ -50,11 +50,9 @@ public static List couchbaseAttributes() { return Arrays.asList( equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies(NetworkAttributes.NETWORK_PEER_PORT, val -> assertThat(val).isNotNull()), - satisfies( - AttributeKey.stringKey("couchbase.local.address"), val -> assertThat(val).isNotNull()), - satisfies( - AttributeKey.stringKey("couchbase.operation_id"), val -> assertThat(val).isNotNull())); + satisfies(NetworkAttributes.NETWORK_PEER_PORT, AbstractAssert::isNotNull), + satisfies(stringKey("couchbase.local.address"), AbstractAssert::isNotNull), + satisfies(stringKey("couchbase.operation_id"), AbstractAssert::isNotNull)); } private Couchbase26Util() {} diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseClient26Test.java b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseClient26Test.java index 65ace4b6f395..9d5817d6d9b5 100644 --- a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseClient26Test.java +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseClient26Test.java @@ -5,11 +5,16 @@ package io.opentelemetry.javaagent.instrumentation.couchbase.v2_6; +import static org.assertj.core.api.Assertions.assertThat; + +import com.couchbase.client.java.CouchbaseCluster; import com.couchbase.client.java.cluster.BucketSettings; +import com.couchbase.client.java.cluster.ClusterManager; import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; import io.opentelemetry.instrumentation.couchbase.AbstractCouchbaseClientTest; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import java.util.List; +import org.junit.jupiter.api.Test; class CouchbaseClient26Test extends AbstractCouchbaseClientTest { @@ -23,4 +28,16 @@ protected DefaultCouchbaseEnvironment.Builder envBuilder( protected List couchbaseAttributes() { return Couchbase26Util.couchbaseAttributes(); } + + @Test + void hasDurationMetric() { + CouchbaseCluster cluster = prepareCluster(bucketCouchbase); + ClusterManager manager = cluster.clusterManager(USERNAME, PASSWORD); + + testing.waitForTraces(1); + testing.clearData(); + + boolean hasBucket = manager.hasBucket(bucketCouchbase.name()); + assertThat(hasBucket).isTrue(); + } } diff --git a/instrumentation/couchbase/couchbase-3.1.6/metadata.yaml b/instrumentation/couchbase/couchbase-3.1.6/metadata.yaml index 3fec95f03fcf..959f05125813 100644 --- a/instrumentation/couchbase/couchbase-3.1.6/metadata.yaml +++ b/instrumentation/couchbase/couchbase-3.1.6/metadata.yaml @@ -1,3 +1,3 @@ description: > - Couchbase instrumentation is owned by the Couchbase project. This instrumentation automatically - configures the instrumentation provided by the Couchbase library. + Couchbase instrumentation is owned by the Couchbase project for versions 3+. This instrumentation + automatically configures the instrumentation provided by the Couchbase library. diff --git a/instrumentation/couchbase/couchbase-3.1/metadata.yaml b/instrumentation/couchbase/couchbase-3.1/metadata.yaml index 3fec95f03fcf..959f05125813 100644 --- a/instrumentation/couchbase/couchbase-3.1/metadata.yaml +++ b/instrumentation/couchbase/couchbase-3.1/metadata.yaml @@ -1,3 +1,3 @@ description: > - Couchbase instrumentation is owned by the Couchbase project. This instrumentation automatically - configures the instrumentation provided by the Couchbase library. + Couchbase instrumentation is owned by the Couchbase project for versions 3+. This instrumentation + automatically configures the instrumentation provided by the Couchbase library. diff --git a/instrumentation/couchbase/couchbase-3.2/metadata.yaml b/instrumentation/couchbase/couchbase-3.2/metadata.yaml index 3fec95f03fcf..959f05125813 100644 --- a/instrumentation/couchbase/couchbase-3.2/metadata.yaml +++ b/instrumentation/couchbase/couchbase-3.2/metadata.yaml @@ -1,3 +1,3 @@ description: > - Couchbase instrumentation is owned by the Couchbase project. This instrumentation automatically - configures the instrumentation provided by the Couchbase library. + Couchbase instrumentation is owned by the Couchbase project for versions 3+. This instrumentation + automatically configures the instrumentation provided by the Couchbase library. diff --git a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseAsyncClientTest.java b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseAsyncClientTest.java index 8e81e841615a..29f56eaf1c23 100644 --- a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseAsyncClientTest.java +++ b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseAsyncClientTest.java @@ -9,6 +9,7 @@ import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DbSystemNameIncubatingValues.COUCHBASE; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Named.named; @@ -24,7 +25,6 @@ import io.opentelemetry.instrumentation.testing.internal.AutoCleanupExtension; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Collections; import java.util.concurrent.CompletableFuture; import java.util.concurrent.ExecutionException; @@ -115,9 +115,7 @@ void hasBucket(BucketSettings bucketSettings) .hasKind(SpanKind.CLIENT) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo( - maybeStable(DB_SYSTEM), - DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), + equalTo(maybeStable(DB_SYSTEM), COUCHBASE), equalTo(maybeStable(DB_OPERATION), "Cluster.openBucket")), span -> assertCouchbaseSpan(span, "ClusterManager.hasBucket") @@ -156,9 +154,7 @@ void upsert(BucketSettings bucketSettings) .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo( - maybeStable(DB_SYSTEM), - DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), + equalTo(maybeStable(DB_SYSTEM), COUCHBASE), equalTo(maybeStable(DB_OPERATION), "Cluster.openBucket")), span -> assertCouchbaseSpan(span, "Bucket.upsert", bucketSettings.name()) @@ -204,9 +200,7 @@ void upsertAndGet(BucketSettings bucketSettings) .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo( - maybeStable(DB_SYSTEM), - DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), + equalTo(maybeStable(DB_SYSTEM), COUCHBASE), equalTo(maybeStable(DB_OPERATION), "Cluster.openBucket")), span -> assertCouchbaseSpan(span, "Bucket.upsert", bucketSettings.name()) @@ -249,9 +243,7 @@ void query() throws ExecutionException, InterruptedException, TimeoutException { .hasKind(SpanKind.CLIENT) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo( - maybeStable(DB_SYSTEM), - DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE), + equalTo(maybeStable(DB_SYSTEM), COUCHBASE), equalTo(maybeStable(DB_OPERATION), "Cluster.openBucket")), span -> assertCouchbaseSpan( diff --git a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseClientTest.java b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseClientTest.java index c39389ccf80c..fd33f5f3f5aa 100644 --- a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseClientTest.java +++ b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseClientTest.java @@ -39,7 +39,7 @@ public abstract class AbstractCouchbaseClientTest extends AbstractCouchbaseTest { @RegisterExtension - static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + protected static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); @RegisterExtension static final AutoCleanupExtension cleanup = AutoCleanupExtension.create(); @@ -49,7 +49,7 @@ private static Stream bucketSettings() { Arguments.of(named(bucketMemcache.type().name(), bucketMemcache))); } - private CouchbaseCluster prepareCluster(BucketSettings bucketSettings) { + protected CouchbaseCluster prepareCluster(BucketSettings bucketSettings) { CouchbaseEnvironment environment = envBuilder(bucketSettings).build(); CouchbaseCluster cluster = CouchbaseCluster.create(environment, Collections.singletonList("127.0.0.1")); diff --git a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java index ec8d82ce0555..25da415eb61d 100644 --- a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java +++ b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java @@ -12,6 +12,7 @@ import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; 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.DbSystemNameIncubatingValues.COUCHBASE; import com.couchbase.client.java.bucket.BucketType; import com.couchbase.client.java.cluster.BucketSettings; @@ -26,7 +27,6 @@ import io.opentelemetry.instrumentation.test.utils.PortUtils; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; -import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collections; @@ -125,8 +125,7 @@ protected SpanDataAssert assertCouchbaseSpan( span.hasName(spanName).hasKind(SpanKind.CLIENT); List assertions = new ArrayList<>(); - assertions.add( - equalTo(maybeStable(DB_SYSTEM), DbIncubatingAttributes.DbSystemIncubatingValues.COUCHBASE)); + assertions.add(equalTo(maybeStable(DB_SYSTEM), COUCHBASE)); if (operation != null) { assertions.add(equalTo(maybeStable(DB_OPERATION), operation)); } From ac93c3473821d6ed27313aa0c43eb925cc9d966e Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 18 Aug 2025 16:52:45 -0400 Subject: [PATCH 2/5] refactors --- docs/instrumentation-list.yaml | 59 +++++++++++++---- .../v2_0/CouchbaseAsyncClientTest.java | 22 +++++++ .../couchbase/v2_0/CouchbaseClientTest.java | 22 +++++++ .../couchbase/v2_0/CouchbaseUtil.java | 29 ++++++++ .../CouchbaseSpringRepositoryTest.java | 22 +++++++ .../CouchbaseSpringTemplateTest.java | 22 +++++++ .../couchbase/couchbase-2.0/metadata.yaml | 6 +- .../couchbase-2.6/javaagent/build.gradle.kts | 3 + .../couchbase/v2_6/Couchbase26Util.java | 66 ++++++++++++++++--- .../v2_6/CouchbaseAsyncClient26Test.java | 15 +++++ .../couchbase/v2_6/CouchbaseClient26Test.java | 29 ++++++++ .../CouchbaseSpringRepository26Test.java | 15 +++++ .../CouchbaseSpringTemplate26Test.java | 15 +++++ .../couchbase/couchbase-2.6/metadata.yaml | 13 +++- .../couchbase/AbstractCouchbaseTest.java | 30 ++++++++- 15 files changed, 344 insertions(+), 24 deletions(-) diff --git a/docs/instrumentation-list.yaml b/docs/instrumentation-list.yaml index c3726961b362..71580e3bdcaf 100644 --- a/docs/instrumentation-list.yaml +++ b/docs/instrumentation-list.yaml @@ -2082,19 +2082,54 @@ libraries: type: LONG couchbase: - name: couchbase-2.0 + description: This instrumentation enables database CLIENT spans and metrics for + Couchbase 2.0 operations. It automatically traces key-value operations (get, + upsert, replace, remove), view queries, N1QL queries, and cluster management + operations. Supports Spring Data integration for repositories and templates. source_path: instrumentation/couchbase/couchbase-2.0 scope: name: io.opentelemetry.couchbase-2.0 target_versions: javaagent: - com.couchbase.client:java-client:[2,3) - configurations: - - name: otel.instrumentation.couchbase.experimental-span-attributes - description: Enables experimental span attributes `couchbase.operation_id` and - `couchbase.local.address` - type: boolean - default: false + telemetry: + - when: default + spans: + - span_kind: CLIENT + attributes: + - name: db.name + type: STRING + - name: db.operation + type: STRING + - name: db.statement + type: STRING + - name: db.system + type: STRING + - 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 + spans: + - span_kind: CLIENT + attributes: + - name: db.namespace + type: STRING + - name: db.operation.name + type: STRING + - name: db.query.text + type: STRING + - name: db.system.name + type: STRING - name: couchbase-2.6 + description: | + This instrumentation enables database CLIENT spans and metrics for Couchbase 2.6 operations. It automatically traces key-value operations (get, upsert, replace, remove), view queries, N1QL queries, and cluster management operations. Supports Spring Data integration for repositories and templates. source_path: instrumentation/couchbase/couchbase-2.6 scope: name: io.opentelemetry.couchbase-2.6 @@ -2103,13 +2138,13 @@ libraries: - com.couchbase.client:java-client:[2.6.0,3) configurations: - name: otel.instrumentation.couchbase.experimental-span-attributes - description: Enables experimental span attributes couchbase.operation_id and - couchbase.local.address + description: | + Enables experimental span attributes `couchbase.operation_id` and `couchbase.local.address`. Different operation types receive different experimental attributes: key-value operations get both attributes, view queries get only local.address, N1QL queries get only operation_id, and cluster management operations get none. type: boolean default: false - name: couchbase-3.1 description: | - Couchbase instrumentation is owned by the Couchbase project. This instrumentation automatically configures the instrumentation provided by the Couchbase library. + Couchbase instrumentation is owned by the Couchbase project for versions 3+. This instrumentation automatically configures the instrumentation provided by the Couchbase library. source_path: instrumentation/couchbase/couchbase-3.1 scope: name: io.opentelemetry.couchbase-3.1 @@ -2118,7 +2153,7 @@ libraries: - com.couchbase.client:java-client:[3.1,3.1.6) - name: couchbase-3.1.6 description: | - Couchbase instrumentation is owned by the Couchbase project. This instrumentation automatically configures the instrumentation provided by the Couchbase library. + Couchbase instrumentation is owned by the Couchbase project for versions 3+. This instrumentation automatically configures the instrumentation provided by the Couchbase library. source_path: instrumentation/couchbase/couchbase-3.1.6 scope: name: io.opentelemetry.couchbase-3.1.6 @@ -2127,7 +2162,7 @@ libraries: - com.couchbase.client:java-client:[3.1.6,3.2.0) - name: couchbase-3.2 description: | - Couchbase instrumentation is owned by the Couchbase project. This instrumentation automatically configures the instrumentation provided by the Couchbase library. + Couchbase instrumentation is owned by the Couchbase project for versions 3+. This instrumentation automatically configures the instrumentation provided by the Couchbase library. source_path: instrumentation/couchbase/couchbase-3.2 scope: name: io.opentelemetry.couchbase-3.2 @@ -4031,7 +4066,7 @@ libraries: javaagent: - com.openai:openai-java:[1.1.0,3) library: - - com.openai:openai-java:[1.1.0,2.+) + - com.openai:openai-java:1.1.0 configurations: - name: otel.instrumentation.genai.capture-message-content description: | diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseAsyncClientTest.java b/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseAsyncClientTest.java index a28658223a61..3f7dd749bbe3 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseAsyncClientTest.java +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseAsyncClientTest.java @@ -8,6 +8,8 @@ import com.couchbase.client.java.cluster.BucketSettings; import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; import io.opentelemetry.instrumentation.couchbase.AbstractCouchbaseAsyncClientTest; +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; +import java.util.List; class CouchbaseAsyncClientTest extends AbstractCouchbaseAsyncClientTest { @@ -16,4 +18,24 @@ protected DefaultCouchbaseEnvironment.Builder envBuilder( BucketSettings bucketSettings, int carrierDirectPort, int httpDirectPort) { return CouchbaseUtil.envBuilder(bucketSettings, carrierDirectPort, httpDirectPort); } + + @Override + protected List couchbaseAttributes() { + return CouchbaseUtil.couchbaseAttributes(); + } + + @Override + protected List couchbaseQueryAttributes() { + return CouchbaseUtil.couchbaseQueryAttributes(); + } + + @Override + protected List couchbaseClusterManagerAttributes() { + return CouchbaseUtil.couchbaseClusterManagerAttributes(); + } + + @Override + protected List couchbaseN1qlAttributes() { + return CouchbaseUtil.couchbaseN1qlAttributes(); + } } diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseClientTest.java b/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseClientTest.java index a1c2a41bb1fa..3f8958bceac9 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseClientTest.java +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseClientTest.java @@ -15,6 +15,8 @@ import com.couchbase.client.java.cluster.ClusterManager; import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; import io.opentelemetry.instrumentation.couchbase.AbstractCouchbaseClientTest; +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; +import java.util.List; import org.junit.jupiter.api.Test; class CouchbaseClientTest extends AbstractCouchbaseClientTest { @@ -25,6 +27,26 @@ protected DefaultCouchbaseEnvironment.Builder envBuilder( return CouchbaseUtil.envBuilder(bucketSettings, carrierDirectPort, httpDirectPort); } + @Override + protected List couchbaseAttributes() { + return CouchbaseUtil.couchbaseAttributes(); + } + + @Override + protected List couchbaseQueryAttributes() { + return CouchbaseUtil.couchbaseQueryAttributes(); + } + + @Override + protected List couchbaseClusterManagerAttributes() { + return CouchbaseUtil.couchbaseClusterManagerAttributes(); + } + + @Override + protected List couchbaseN1qlAttributes() { + return CouchbaseUtil.couchbaseN1qlAttributes(); + } + @Test void hasDurationMetric() { CouchbaseCluster cluster = prepareCluster(bucketCouchbase); diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseUtil.java b/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseUtil.java index 97a746fe0fbb..311d5c96eb89 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseUtil.java +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseUtil.java @@ -9,10 +9,39 @@ import com.couchbase.client.core.metrics.DefaultMetricsCollectorConfig; import com.couchbase.client.java.cluster.BucketSettings; import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.TimeUnit; public class CouchbaseUtil { + // Couchbase 2.0 instrumentation does not support experimental attributes + + public static List couchbaseAttributes() { + return couchbaseKvAttributes(); + } + + public static List couchbaseKvAttributes() { + // Couchbase 2.0 instrumentation does not support experimental attributes or network attributes + return new ArrayList<>(); + } + + public static List couchbaseQueryAttributes() { + // Couchbase 2.0 instrumentation does not support experimental attributes or network attributes + return new ArrayList<>(); + } + + public static List couchbaseClusterManagerAttributes() { + // Couchbase 2.0 instrumentation does not support experimental attributes or network attributes + return new ArrayList<>(); + } + + public static List couchbaseN1qlAttributes() { + // Couchbase 2.0 instrumentation does not support experimental attributes or network attributes + return new ArrayList<>(); + } + public static DefaultCouchbaseEnvironment.Builder envBuilder( BucketSettings bucketSettings, int carrierDirectPort, int httpDirectPort) { // Couchbase seems to be really slow to start sometimes diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/springdata/CouchbaseSpringRepositoryTest.java b/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/springdata/CouchbaseSpringRepositoryTest.java index db5ba3d31379..4443d0c5e34a 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/springdata/CouchbaseSpringRepositoryTest.java +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/springdata/CouchbaseSpringRepositoryTest.java @@ -11,6 +11,8 @@ import io.opentelemetry.instrumentation.couchbase.springdata.TestDocument; import io.opentelemetry.instrumentation.couchbase.springdata.TestRepository; import io.opentelemetry.javaagent.instrumentation.couchbase.v2_0.CouchbaseUtil; +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; +import java.util.List; class CouchbaseSpringRepositoryTest extends AbstractCouchbaseSpringRepositoryTest { @@ -20,6 +22,26 @@ protected DefaultCouchbaseEnvironment.Builder envBuilder( return CouchbaseUtil.envBuilder(bucketSettings, carrierDirectPort, httpDirectPort); } + @Override + protected List couchbaseAttributes() { + return CouchbaseUtil.couchbaseAttributes(); + } + + @Override + protected List couchbaseQueryAttributes() { + return CouchbaseUtil.couchbaseQueryAttributes(); + } + + @Override + protected List couchbaseClusterManagerAttributes() { + return CouchbaseUtil.couchbaseClusterManagerAttributes(); + } + + @Override + protected List couchbaseN1qlAttributes() { + return CouchbaseUtil.couchbaseN1qlAttributes(); + } + @Override protected TestDocument findById(TestRepository repository, String id) { return repository.findOne(id); diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/springdata/CouchbaseSpringTemplateTest.java b/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/springdata/CouchbaseSpringTemplateTest.java index 3f4c193bd782..829bed4907c5 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/springdata/CouchbaseSpringTemplateTest.java +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/springdata/CouchbaseSpringTemplateTest.java @@ -9,6 +9,8 @@ import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; import io.opentelemetry.instrumentation.couchbase.springdata.AbstractCouchbaseSpringTemplateTest; import io.opentelemetry.javaagent.instrumentation.couchbase.v2_0.CouchbaseUtil; +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; +import java.util.List; class CouchbaseSpringTemplateTest extends AbstractCouchbaseSpringTemplateTest { @@ -17,4 +19,24 @@ protected DefaultCouchbaseEnvironment.Builder envBuilder( BucketSettings bucketSettings, int carrierDirectPort, int httpDirectPort) { return CouchbaseUtil.envBuilder(bucketSettings, carrierDirectPort, httpDirectPort); } + + @Override + protected List couchbaseAttributes() { + return CouchbaseUtil.couchbaseAttributes(); + } + + @Override + protected List couchbaseQueryAttributes() { + return CouchbaseUtil.couchbaseQueryAttributes(); + } + + @Override + protected List couchbaseClusterManagerAttributes() { + return CouchbaseUtil.couchbaseClusterManagerAttributes(); + } + + @Override + protected List couchbaseN1qlAttributes() { + return CouchbaseUtil.couchbaseN1qlAttributes(); + } } diff --git a/instrumentation/couchbase/couchbase-2.0/metadata.yaml b/instrumentation/couchbase/couchbase-2.0/metadata.yaml index 512f25c90b24..bf9a5810a8ab 100644 --- a/instrumentation/couchbase/couchbase-2.0/metadata.yaml +++ b/instrumentation/couchbase/couchbase-2.0/metadata.yaml @@ -1 +1,5 @@ -descriptions: This instrumentation enables database CLIENT spans and metrics for Couchbase operations. +description: > + This instrumentation enables database CLIENT spans and metrics for Couchbase 2.0 operations. + It automatically traces key-value operations (get, upsert, replace, remove), view queries, + N1QL queries, and cluster management operations. Supports Spring Data integration for + repositories and templates. \ No newline at end of file diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts b/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts index 186799bf0fd1..3e41596e7b8a 100644 --- a/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/build.gradle.kts @@ -38,10 +38,13 @@ tasks { // required on jdk17 jvmArgs("--add-opens=java.base/java.lang=ALL-UNNAMED") jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") + + systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") } val testStableSemconv by registering(Test::class) { jvmArgs("-Dotel.semconv-stability.opt-in=database") + systemProperty("metadataConfig", "otel.semconv-stability.opt-in=database") } val testExperimental by registering(Test::class) { diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/Couchbase26Util.java b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/Couchbase26Util.java index e8e14e67861c..4898f4b35fc0 100644 --- a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/Couchbase26Util.java +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/Couchbase26Util.java @@ -8,20 +8,25 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +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; import com.couchbase.client.core.metrics.DefaultLatencyMetricsCollectorConfig; import com.couchbase.client.core.metrics.DefaultMetricsCollectorConfig; import com.couchbase.client.java.cluster.BucketSettings; import com.couchbase.client.java.env.DefaultCouchbaseEnvironment; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.semconv.NetworkAttributes; -import java.util.Arrays; +import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; import org.assertj.core.api.AbstractAssert; public class Couchbase26Util { + private static final String EXPERIMENTAL_FLAG = + "otel.instrumentation.couchbase.experimental-span-attributes"; + public static DefaultCouchbaseEnvironment.Builder envBuilder( BucketSettings bucketSettings, int carrierDirectPort, int httpDirectPort) { // Couchbase seems to be really slow to start sometimes @@ -47,12 +52,57 @@ public static DefaultCouchbaseEnvironment.Builder envBuilder( } public static List couchbaseAttributes() { - return Arrays.asList( - equalTo(NetworkAttributes.NETWORK_TYPE, "ipv4"), - equalTo(NetworkAttributes.NETWORK_PEER_ADDRESS, "127.0.0.1"), - satisfies(NetworkAttributes.NETWORK_PEER_PORT, AbstractAssert::isNotNull), - satisfies(stringKey("couchbase.local.address"), AbstractAssert::isNotNull), - satisfies(stringKey("couchbase.operation_id"), AbstractAssert::isNotNull)); + return couchbaseKvAttributes(); + } + + public static List couchbaseKvAttributes() { + return baseNetworkAttributes().withLocalAddress().withOperationId().build(); + } + + public static List couchbaseQueryAttributes() { + return baseNetworkAttributes().withLocalAddress().build(); + } + + public static List couchbaseN1qlAttributes() { + return baseNetworkAttributes().withOperationId().build(); + } + + public static List couchbaseClusterManagerAttributes() { + return baseNetworkAttributes().build(); + } + + private static AttributeAssertionBuilder baseNetworkAttributes() { + return new AttributeAssertionBuilder() + .add(equalTo(NETWORK_TYPE, "ipv4")) + .add(equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1")) + .add(satisfies(NETWORK_PEER_PORT, AbstractAssert::isNotNull)); + } + + private static class AttributeAssertionBuilder { + private final List assertions = new ArrayList<>(); + + AttributeAssertionBuilder add(AttributeAssertion assertion) { + assertions.add(assertion); + return this; + } + + AttributeAssertionBuilder withLocalAddress() { + if (Boolean.getBoolean(EXPERIMENTAL_FLAG)) { + assertions.add(satisfies(stringKey("couchbase.local.address"), AbstractAssert::isNotNull)); + } + return this; + } + + AttributeAssertionBuilder withOperationId() { + if (Boolean.getBoolean(EXPERIMENTAL_FLAG)) { + assertions.add(satisfies(stringKey("couchbase.operation_id"), AbstractAssert::isNotNull)); + } + return this; + } + + List build() { + return new ArrayList<>(assertions); + } } private Couchbase26Util() {} diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseAsyncClient26Test.java b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseAsyncClient26Test.java index 8257d7014ec4..66fc60dc4eb4 100644 --- a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseAsyncClient26Test.java +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseAsyncClient26Test.java @@ -23,4 +23,19 @@ protected DefaultCouchbaseEnvironment.Builder envBuilder( protected List couchbaseAttributes() { return Couchbase26Util.couchbaseAttributes(); } + + @Override + protected List couchbaseQueryAttributes() { + return Couchbase26Util.couchbaseQueryAttributes(); + } + + @Override + protected List couchbaseClusterManagerAttributes() { + return Couchbase26Util.couchbaseClusterManagerAttributes(); + } + + @Override + protected List couchbaseN1qlAttributes() { + return Couchbase26Util.couchbaseN1qlAttributes(); + } } diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseClient26Test.java b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseClient26Test.java index 9d5817d6d9b5..8b4cb586a52f 100644 --- a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseClient26Test.java +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/CouchbaseClient26Test.java @@ -5,6 +5,11 @@ package io.opentelemetry.javaagent.instrumentation.couchbase.v2_6; +import static io.opentelemetry.instrumentation.testing.junit.db.DbClientMetricsTestUtil.assertDurationMetric; +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 org.assertj.core.api.Assertions.assertThat; import com.couchbase.client.java.CouchbaseCluster; @@ -29,6 +34,21 @@ protected List couchbaseAttributes() { return Couchbase26Util.couchbaseAttributes(); } + @Override + protected List couchbaseQueryAttributes() { + return Couchbase26Util.couchbaseQueryAttributes(); + } + + @Override + protected List couchbaseClusterManagerAttributes() { + return Couchbase26Util.couchbaseClusterManagerAttributes(); + } + + @Override + protected List couchbaseN1qlAttributes() { + return Couchbase26Util.couchbaseN1qlAttributes(); + } + @Test void hasDurationMetric() { CouchbaseCluster cluster = prepareCluster(bucketCouchbase); @@ -39,5 +59,14 @@ void hasDurationMetric() { boolean hasBucket = manager.hasBucket(bucketCouchbase.name()); assertThat(hasBucket).isTrue(); + + assertDurationMetric( + testing, + // The metric is generated by couchbase-2.0 instrumentation + "io.opentelemetry.couchbase-2.0", + DB_SYSTEM_NAME, + DB_OPERATION_NAME, + NETWORK_PEER_ADDRESS, + NETWORK_PEER_PORT); } } diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/springdata/CouchbaseSpringRepository26Test.java b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/springdata/CouchbaseSpringRepository26Test.java index 8f1765ad6852..1054324d6b57 100644 --- a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/springdata/CouchbaseSpringRepository26Test.java +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/springdata/CouchbaseSpringRepository26Test.java @@ -27,6 +27,21 @@ protected List couchbaseAttributes() { return Couchbase26Util.couchbaseAttributes(); } + @Override + protected List couchbaseQueryAttributes() { + return Couchbase26Util.couchbaseQueryAttributes(); + } + + @Override + protected List couchbaseClusterManagerAttributes() { + return Couchbase26Util.couchbaseClusterManagerAttributes(); + } + + @Override + protected List couchbaseN1qlAttributes() { + return Couchbase26Util.couchbaseN1qlAttributes(); + } + @Override protected TestDocument findById(TestRepository repository, String id) { return repository.findById(id).get(); diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/springdata/CouchbaseSpringTemplate26Test.java b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/springdata/CouchbaseSpringTemplate26Test.java index cb7e4a1d978b..19db585da8dd 100644 --- a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/springdata/CouchbaseSpringTemplate26Test.java +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/springdata/CouchbaseSpringTemplate26Test.java @@ -24,4 +24,19 @@ protected DefaultCouchbaseEnvironment.Builder envBuilder( protected List couchbaseAttributes() { return Couchbase26Util.couchbaseAttributes(); } + + @Override + protected List couchbaseQueryAttributes() { + return Couchbase26Util.couchbaseQueryAttributes(); + } + + @Override + protected List couchbaseClusterManagerAttributes() { + return Couchbase26Util.couchbaseClusterManagerAttributes(); + } + + @Override + protected List couchbaseN1qlAttributes() { + return Couchbase26Util.couchbaseN1qlAttributes(); + } } diff --git a/instrumentation/couchbase/couchbase-2.6/metadata.yaml b/instrumentation/couchbase/couchbase-2.6/metadata.yaml index a91bbaa98dab..fae8e7d19b9d 100644 --- a/instrumentation/couchbase/couchbase-2.6/metadata.yaml +++ b/instrumentation/couchbase/couchbase-2.6/metadata.yaml @@ -1,5 +1,14 @@ +description: > + This instrumentation enables database CLIENT spans and metrics for Couchbase 2.6 operations. + It automatically traces key-value operations (get, upsert, replace, remove), view queries, + N1QL queries, and cluster management operations. Supports Spring Data integration for + repositories and templates. configurations: - name: otel.instrumentation.couchbase.experimental-span-attributes - description: Enables experimental span attributes couchbase.operation_id and couchbase.local.address + description: > + Enables experimental span attributes `couchbase.operation_id` and `couchbase.local.address`. + Different operation types receive different experimental attributes: key-value operations + get both attributes, view queries get only local.address, N1QL queries get only operation_id, + and cluster management operations get none. type: boolean - default: false + default: false \ No newline at end of file diff --git a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java index 25da415eb61d..79b8c7113a6e 100644 --- a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java +++ b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java @@ -135,7 +135,23 @@ protected SpanDataAssert assertCouchbaseSpan( if (statement != null) { assertions.add(satisfies(maybeStable(DB_STATEMENT), s -> s.startsWith(statement))); } - assertions.addAll(couchbaseAttributes()); + // Use different attributes based on the type of operation + if (statement != null) { + // Query operations - N1QL vs ViewQuery have different experimental attributes + if (statement.startsWith("SELECT")) { + // N1QL queries get operation_id but NOT local.address experimental attribute + assertions.addAll(couchbaseN1qlAttributes()); + } else { + // ViewQuery operations get local.address but NOT operation_id experimental attribute + assertions.addAll(couchbaseQueryAttributes()); + } + } else if (operation != null && operation.startsWith("ClusterManager.")) { + // ClusterManager operations get different attributes (no experimental ones) + assertions.addAll(couchbaseClusterManagerAttributes()); + } else { + // KV operations (get, upsert, etc.) get both experimental attributes + assertions.addAll(couchbaseAttributes()); + } span.hasAttributesSatisfyingExactly(assertions); @@ -145,4 +161,16 @@ protected SpanDataAssert assertCouchbaseSpan( protected List couchbaseAttributes() { return Collections.emptyList(); } + + protected List couchbaseQueryAttributes() { + return Collections.emptyList(); + } + + protected List couchbaseClusterManagerAttributes() { + return Collections.emptyList(); + } + + protected List couchbaseN1qlAttributes() { + return Collections.emptyList(); + } } From 6ac6a6051edded2bbe86ae097ff6c398cf7262b1 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Tue, 19 Aug 2025 10:14:26 -0400 Subject: [PATCH 3/5] add attribute extractor back to singletons --- .../instrumentation/couchbase/v2_0/CouchbaseSingletons.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseSingletons.java b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseSingletons.java index 86f9331de669..cc8ade755ea5 100644 --- a/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseSingletons.java +++ b/instrumentation/couchbase/couchbase-2.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_0/CouchbaseSingletons.java @@ -14,6 +14,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.SpanKindExtractor; import io.opentelemetry.instrumentation.api.instrumenter.SpanNameExtractor; import io.opentelemetry.instrumentation.api.semconv.network.NetworkAttributesExtractor; +import io.opentelemetry.javaagent.bootstrap.internal.AgentInstrumentationConfig; public final class CouchbaseSingletons { @@ -37,6 +38,11 @@ public final class CouchbaseSingletons { CouchbaseRequestInfo.init(context, couchbaseRequest)) .addOperationMetrics(DbClientMetrics.get()); + if (AgentInstrumentationConfig.get() + .getBoolean("otel.instrumentation.couchbase.experimental-span-attributes", false)) { + builder.addAttributesExtractor(new ExperimentalAttributesExtractor()); + } + INSTRUMENTER = builder.buildInstrumenter(SpanKindExtractor.alwaysClient()); } From 6e7e0d80c25de57598e04942b5a1eb94243b843b Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Tue, 19 Aug 2025 13:15:12 -0400 Subject: [PATCH 4/5] remove shorthand --- .../instrumentation/couchbase/v2_6/Couchbase26Util.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/Couchbase26Util.java b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/Couchbase26Util.java index 4898f4b35fc0..a6bed714ca2c 100644 --- a/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/Couchbase26Util.java +++ b/instrumentation/couchbase/couchbase-2.6/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/couchbase/v2_6/Couchbase26Util.java @@ -20,7 +20,6 @@ import java.util.ArrayList; import java.util.List; import java.util.concurrent.TimeUnit; -import org.assertj.core.api.AbstractAssert; public class Couchbase26Util { @@ -75,7 +74,7 @@ private static AttributeAssertionBuilder baseNetworkAttributes() { return new AttributeAssertionBuilder() .add(equalTo(NETWORK_TYPE, "ipv4")) .add(equalTo(NETWORK_PEER_ADDRESS, "127.0.0.1")) - .add(satisfies(NETWORK_PEER_PORT, AbstractAssert::isNotNull)); + .add(satisfies(NETWORK_PEER_PORT, val -> val.isNotNull())); } private static class AttributeAssertionBuilder { @@ -88,14 +87,14 @@ AttributeAssertionBuilder add(AttributeAssertion assertion) { AttributeAssertionBuilder withLocalAddress() { if (Boolean.getBoolean(EXPERIMENTAL_FLAG)) { - assertions.add(satisfies(stringKey("couchbase.local.address"), AbstractAssert::isNotNull)); + assertions.add(satisfies(stringKey("couchbase.local.address"), val -> val.isNotNull())); } return this; } AttributeAssertionBuilder withOperationId() { if (Boolean.getBoolean(EXPERIMENTAL_FLAG)) { - assertions.add(satisfies(stringKey("couchbase.operation_id"), AbstractAssert::isNotNull)); + assertions.add(satisfies(stringKey("couchbase.operation_id"), val -> val.isNotNull())); } return this; } From c9fec0e0e956c733393b21b870b3f939730d5b8a Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Tue, 19 Aug 2025 13:20:30 -0400 Subject: [PATCH 5/5] static import --- .../couchbase/AbstractCouchbaseTest.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java index 449375480de5..de3aea98cf87 100644 --- a/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java +++ b/instrumentation/couchbase/couchbase-common/testing/src/main/java/io/opentelemetry/instrumentation/couchbase/AbstractCouchbaseTest.java @@ -13,6 +13,7 @@ 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.DbSystemNameIncubatingValues.COUCHBASE; +import static java.util.Collections.emptyList; import com.couchbase.client.java.bucket.BucketType; import com.couchbase.client.java.cluster.BucketSettings; @@ -29,7 +30,6 @@ import io.opentelemetry.sdk.testing.assertj.SpanDataAssert; import java.lang.reflect.Field; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; @@ -158,18 +158,18 @@ protected SpanDataAssert assertCouchbaseSpan( } protected List couchbaseAttributes() { - return Collections.emptyList(); + return emptyList(); } protected List couchbaseQueryAttributes() { - return Collections.emptyList(); + return emptyList(); } protected List couchbaseClusterManagerAttributes() { - return Collections.emptyList(); + return emptyList(); } protected List couchbaseN1qlAttributes() { - return Collections.emptyList(); + return emptyList(); } }