From ff752c20dae069e51fca19ce75b637fc58506270 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Mon, 11 Aug 2025 18:28:50 -0400 Subject: [PATCH 1/7] start splitting tests: --- .../camel-2.20/javaagent/build.gradle.kts | 9 ++++-- .../apachecamel/DirectCamelTest.java | 5 ++-- .../apachecamel/ExperimentalTest.java | 30 +++++++++++++++++++ .../apachecamel/MulticastDirectCamelTest.java | 7 +++-- .../apachecamel/RestCamelTest.java | 10 ++++--- 5 files changed, 50 insertions(+), 11 deletions(-) create mode 100644 instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/ExperimentalTest.java diff --git a/instrumentation/camel-2.20/javaagent/build.gradle.kts b/instrumentation/camel-2.20/javaagent/build.gradle.kts index f989bd74af05..3392b82f7faa 100644 --- a/instrumentation/camel-2.20/javaagent/build.gradle.kts +++ b/instrumentation/camel-2.20/javaagent/build.gradle.kts @@ -70,7 +70,8 @@ dependencies { tasks { withType().configureEach { // TODO run tests both with and without experimental span attributes - jvmArgs("-Dotel.instrumentation.camel.experimental-span-attributes=true") +// jvmArgs("-Dotel.instrumentation.camel.experimental-span-attributes=true") + jvmArgs("-Dotel.instrumentation.aws-sdk.experimental-span-attributes=true") // TODO: fix camel instrumentation so that it uses semantic attributes extractors @@ -83,12 +84,16 @@ tasks { jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") } + val testExperimental by registering(Test::class) { + jvmArgs("-Dotel.instrumentation.camel.experimental-span-attributes=true") + } + val testStableSemconv by registering(Test::class) { jvmArgs("-Dotel.semconv-stability.opt-in=database") } check { - dependsOn(testStableSemconv) + dependsOn(testStableSemconv, testExperimental) } } diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/DirectCamelTest.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/DirectCamelTest.java index 6dd9ba6cc697..dd1f41d7e494 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/DirectCamelTest.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/DirectCamelTest.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.apachecamel; import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.javaagent.instrumentation.apachecamel.ExperimentalTest.experimental; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import io.opentelemetry.api.trace.SpanKind; @@ -70,12 +71,12 @@ void simpleDirectToSingleService() { .hasKind(SpanKind.INTERNAL) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(stringKey("camel.uri"), "direct://input")), + equalTo(stringKey("camel.uri"), experimental("direct://input"))), span -> span.hasName("receiver") .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(stringKey("camel.uri"), "direct://receiver")))); + equalTo(stringKey("camel.uri"), experimental("direct://receiver"))))); } } diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/ExperimentalTest.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/ExperimentalTest.java new file mode 100644 index 000000000000..effd873aa627 --- /dev/null +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/ExperimentalTest.java @@ -0,0 +1,30 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.apachecamel; + +import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions; + +class ExperimentalTest { + private static final String EXPERIMENTAL_FLAG = + "otel.instrumentation.camel.experimental-span-attributes"; + + static String experimental(String value) { + if (!Boolean.getBoolean(EXPERIMENTAL_FLAG)) { + return null; + } + return value; + } + + static OpenTelemetryAssertions.StringAssertConsumer experimental( + OpenTelemetryAssertions.StringAssertConsumer value) { + if (!Boolean.getBoolean(EXPERIMENTAL_FLAG)) { + return null; + } + return value; + } + + private ExperimentalTest() {} +} diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/MulticastDirectCamelTest.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/MulticastDirectCamelTest.java index 2b13af62e5f1..d2b657dc1661 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/MulticastDirectCamelTest.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/MulticastDirectCamelTest.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.apachecamel; import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.javaagent.instrumentation.apachecamel.ExperimentalTest.experimental; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import io.opentelemetry.api.trace.SpanKind; @@ -70,18 +71,18 @@ void parallelMulticastToTwoChildServices() { .hasKind(SpanKind.INTERNAL) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(stringKey("camel.uri"), "direct://input")), + equalTo(stringKey("camel.uri"), experimental("direct://input"))), span -> span.hasName("first") .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(stringKey("camel.uri"), "direct://first")), + equalTo(stringKey("camel.uri"), experimental("direct://first"))), span -> span.hasName("second") .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)) .hasAttributesSatisfyingExactly( - equalTo(stringKey("camel.uri"), "direct://second")))); + equalTo(stringKey("camel.uri"), experimental("direct://second"))))); } } diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/RestCamelTest.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/RestCamelTest.java index b509ba572216..c4432d24095d 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/RestCamelTest.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/RestCamelTest.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.apachecamel; import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.javaagent.instrumentation.apachecamel.ExperimentalTest.experimental; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import static io.opentelemetry.semconv.ClientAttributes.CLIENT_ADDRESS; @@ -92,7 +93,7 @@ void restComponentServerAndClientCallWithJettyBackend() { span.hasName("start") .hasKind(SpanKind.INTERNAL) .hasAttributesSatisfyingExactly( - equalTo(stringKey("camel.uri"), "direct://start")), + equalTo(stringKey("camel.uri"), experimental("direct://start"))), span -> span.hasName("GET") .hasKind(SpanKind.CLIENT) @@ -100,7 +101,7 @@ void restComponentServerAndClientCallWithJettyBackend() { .hasAttributesSatisfyingExactly( equalTo( stringKey("camel.uri"), - "rest://get:api/%7Bmodule%7D/unit/%7BunitId%7D"), + experimental("rest://get:api/%7Bmodule%7D/unit/%7BunitId%7D")), equalTo(HTTP_REQUEST_METHOD, "GET"), equalTo(HTTP_RESPONSE_STATUS_CODE, 200L)), span -> @@ -130,12 +131,13 @@ void restComponentServerAndClientCallWithJettyBackend() { URL_FULL, "http://localhost:" + port + "/api/firstModule/unit/unitOne"), satisfies( - stringKey("camel.uri"), val -> val.isInstanceOf(String.class))), + stringKey("camel.uri"), + experimental(val -> val.isInstanceOf(String.class)))), span -> span.hasName("moduleUnit") .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(3)) .hasAttributesSatisfyingExactly( - equalTo(stringKey("camel.uri"), "direct://moduleUnit")))); + equalTo(stringKey("camel.uri"), experimental("direct://moduleUnit"))))); } } From 392e6f7b3556f40e104ad6f2209f8e58106b48de Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Thu, 14 Aug 2025 15:00:45 -0400 Subject: [PATCH 2/7] experimental helpers --- docs/instrumentation-list.yaml | 338 +++++++++++++++++- instrumentation-docs/collect.sh | 24 +- instrumentation-docs/instrumentations.sh | 219 ++++++------ .../camel-2.20/javaagent/build.gradle.kts | 3 + .../apachecamel/ExperimentalTest.java | 17 +- .../apachecamel/RestCamelTest.java | 6 +- .../apachecamel/SingleServiceCamelTest.java | 6 +- .../TwoServicesWithDirectClientCamelTest.java | 14 +- .../apachecamel/aws/CamelSpanAssertions.java | 16 +- .../apachecamel/decorators/CassandraTest.java | 5 +- 10 files changed, 503 insertions(+), 145 deletions(-) diff --git a/docs/instrumentation-list.yaml b/docs/instrumentation-list.yaml index 93f3892ce60c..113897244825 100644 --- a/docs/instrumentation-list.yaml +++ b/docs/instrumentation-list.yaml @@ -901,6 +901,13 @@ libraries: description: Flush timeout in milliseconds. type: int default: 10000 + telemetry: + - when: default + spans: + - span_kind: SERVER + attributes: + - name: faas.invocation_id + type: STRING - name: aws-lambda-events-2.2 description: | Provides full instrumentation of the Lambda library, including standard and custom event types, from `aws-lambda-java-events` 2.2+. @@ -918,6 +925,29 @@ libraries: description: Flush timeout in milliseconds. type: int default: 10000 + telemetry: + - when: default + spans: + - span_kind: CONSUMER + attributes: + - name: messaging.operation + type: STRING + - name: messaging.system + type: STRING + - span_kind: SERVER + attributes: + - name: faas.invocation_id + type: STRING + - name: faas.trigger + type: STRING + - name: http.request.method + type: STRING + - name: http.response.status_code + type: LONG + - name: url.full + type: STRING + - name: user_agent.original + type: STRING - name: aws-sdk-1.11 source_path: instrumentation/aws-sdk/aws-sdk-1.11 scope: @@ -1586,6 +1616,115 @@ libraries: description: Enable the capture of experimental span attributes. type: boolean default: false + telemetry: + - when: default + spans: + - span_kind: CLIENT + attributes: + - name: db.name + type: STRING + - name: db.statement + type: STRING + - name: db.system + type: STRING + - name: http.request.method + type: STRING + - name: http.response.status_code + type: LONG + - name: url.full + type: STRING + - span_kind: INTERNAL + attributes: + - name: http.request.method + type: STRING + - name: messaging.destination.name + type: STRING + - name: messaging.message.id + type: STRING + - name: url.full + type: STRING + - span_kind: SERVER + attributes: + - name: http.request.method + type: STRING + - name: http.response.status_code + type: LONG + - name: url.full + type: STRING + - when: otel.instrumentation.camel.experimental-span-attributes=true + spans: + - span_kind: CLIENT + attributes: + - name: camel.uri + type: STRING + - name: db.name + type: STRING + - name: db.statement + type: STRING + - name: db.system + type: STRING + - name: http.request.method + type: STRING + - name: http.response.status_code + type: LONG + - name: url.full + type: STRING + - span_kind: INTERNAL + attributes: + - name: camel.uri + type: STRING + - name: http.request.method + type: STRING + - name: messaging.destination.name + type: STRING + - name: messaging.message.id + type: STRING + - name: url.full + type: STRING + - span_kind: SERVER + attributes: + - name: camel.uri + type: STRING + - name: http.request.method + type: STRING + - name: http.response.status_code + type: LONG + - name: url.full + type: STRING + - when: otel.semconv-stability.opt-in=database + spans: + - span_kind: CLIENT + attributes: + - name: db.namespace + type: STRING + - name: db.query.text + type: STRING + - name: db.system.name + type: STRING + - name: http.request.method + type: STRING + - name: http.response.status_code + type: LONG + - name: url.full + type: STRING + - span_kind: INTERNAL + attributes: + - name: http.request.method + type: STRING + - name: messaging.destination.name + type: STRING + - name: messaging.message.id + type: STRING + - name: url.full + type: STRING + - span_kind: SERVER + attributes: + - name: http.request.method + type: STRING + - name: http.response.status_code + type: LONG + - name: url.full + type: STRING cassandra: - name: cassandra-3.0 description: | @@ -1601,6 +1740,55 @@ libraries: description: Enables statement sanitization for database queries. type: boolean default: true + telemetry: + - when: default + spans: + - span_kind: CLIENT + attributes: + - name: db.cassandra.table + type: STRING + - name: db.name + type: STRING + - name: db.operation + type: STRING + - name: db.statement + type: STRING + - name: db.system + type: STRING + - name: network.peer.address + type: STRING + - name: network.peer.port + type: LONG + - name: network.type + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG + - when: otel.semconv-stability.opt-in=database + spans: + - span_kind: CLIENT + attributes: + - name: db.collection.name + type: STRING + - name: db.namespace + type: STRING + - name: db.operation.name + type: STRING + - name: db.query.text + type: STRING + - name: db.system.name + type: STRING + - name: network.peer.address + type: STRING + - name: network.peer.port + type: LONG + - name: network.type + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG - name: cassandra-4.0 description: | Instruments the Cassandra database client, providing database client spans and metrics for Cassandra queries. @@ -1615,6 +1803,79 @@ libraries: description: Enables statement sanitization for database queries. type: boolean default: true + telemetry: + - when: default + spans: + - span_kind: CLIENT + attributes: + - name: db.cassandra.consistency_level + type: STRING + - name: db.cassandra.coordinator.dc + type: STRING + - name: db.cassandra.coordinator.id + type: STRING + - name: db.cassandra.idempotence + type: BOOLEAN + - name: db.cassandra.page_size + type: LONG + - name: db.cassandra.speculative_execution_count + type: LONG + - name: db.cassandra.table + type: STRING + - name: db.name + type: STRING + - name: db.operation + type: STRING + - name: db.statement + type: STRING + - name: db.system + type: STRING + - name: network.peer.address + type: STRING + - name: network.peer.port + type: LONG + - name: network.type + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG + - when: otel.semconv-stability.opt-in=database + spans: + - span_kind: CLIENT + attributes: + - name: cassandra.consistency.level + type: STRING + - name: cassandra.coordinator.dc + type: STRING + - name: cassandra.coordinator.id + type: STRING + - name: cassandra.page.size + type: LONG + - name: cassandra.query.idempotent + type: BOOLEAN + - name: cassandra.speculative_execution.count + type: LONG + - name: db.collection.name + type: STRING + - name: db.namespace + type: STRING + - name: db.operation.name + type: STRING + - name: db.query.text + type: STRING + - name: db.system.name + type: STRING + - name: network.peer.address + type: STRING + - name: network.peer.port + type: LONG + - name: network.type + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG - name: cassandra-4.4 description: | Instruments the Cassandra database client, providing database client spans and metrics for Cassandra queries. @@ -1631,6 +1892,79 @@ libraries: description: Enables statement sanitization for database queries. type: boolean default: true + telemetry: + - when: default + spans: + - span_kind: CLIENT + attributes: + - name: db.cassandra.consistency_level + type: STRING + - name: db.cassandra.coordinator.dc + type: STRING + - name: db.cassandra.coordinator.id + type: STRING + - name: db.cassandra.idempotence + type: BOOLEAN + - name: db.cassandra.page_size + type: LONG + - name: db.cassandra.speculative_execution_count + type: LONG + - name: db.cassandra.table + type: STRING + - name: db.name + type: STRING + - name: db.operation + type: STRING + - name: db.statement + type: STRING + - name: db.system + type: STRING + - name: network.peer.address + type: STRING + - name: network.peer.port + type: LONG + - name: network.type + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG + - when: otel.semconv-stability.opt-in=database + spans: + - span_kind: CLIENT + attributes: + - name: cassandra.consistency.level + type: STRING + - name: cassandra.coordinator.dc + type: STRING + - name: cassandra.coordinator.id + type: STRING + - name: cassandra.page.size + type: LONG + - name: cassandra.query.idempotent + type: BOOLEAN + - name: cassandra.speculative_execution.count + type: LONG + - name: db.collection.name + type: STRING + - name: db.namespace + type: STRING + - name: db.operation.name + type: STRING + - name: db.query.text + type: STRING + - name: db.system.name + type: STRING + - name: network.peer.address + type: STRING + - name: network.peer.port + type: LONG + - name: network.type + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG clickhouse: - name: clickhouse-client-0.5 description: Instruments the V1 ClickHouseClient, providing database client spans @@ -3648,9 +3982,9 @@ libraries: name: io.opentelemetry.openai-java-1.1 target_versions: javaagent: - - com.openai:openai-java:[1.1.0,) + - com.openai:openai-java:[1.1.0,3) library: - - com.openai:openai-java:1.1.0 + - com.openai:openai-java:[1.1.0,2.+) configurations: - name: otel.instrumentation.genai.capture-message-content description: | 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 d80975f347d1..578f15ef4adf 100755 --- a/instrumentation-docs/instrumentations.sh +++ b/instrumentation-docs/instrumentations.sh @@ -7,113 +7,118 @@ 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" +# "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" + + "camel-2.20:javaagent:test" + "camel-2.20:javaagent:testExperimental" + "camel-2.20:javaagent:testStableSemconv" + ) # Some instrumentation test suites don't run ARM, so we use colima to run them in an x86_64 diff --git a/instrumentation/camel-2.20/javaagent/build.gradle.kts b/instrumentation/camel-2.20/javaagent/build.gradle.kts index 3392b82f7faa..a715eb7f2444 100644 --- a/instrumentation/camel-2.20/javaagent/build.gradle.kts +++ b/instrumentation/camel-2.20/javaagent/build.gradle.kts @@ -69,6 +69,7 @@ dependencies { tasks { withType().configureEach { + systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") // TODO run tests both with and without experimental span attributes // jvmArgs("-Dotel.instrumentation.camel.experimental-span-attributes=true") @@ -86,10 +87,12 @@ tasks { val testExperimental by registering(Test::class) { jvmArgs("-Dotel.instrumentation.camel.experimental-span-attributes=true") + systemProperty("metaDataConfig", "otel.instrumentation.camel.experimental-span-attributes=true") } 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/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/ExperimentalTest.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/ExperimentalTest.java index effd873aa627..507d858e6bf9 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/ExperimentalTest.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/ExperimentalTest.java @@ -5,25 +5,28 @@ package io.opentelemetry.javaagent.instrumentation.apachecamel; +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions; -class ExperimentalTest { +public class ExperimentalTest { private static final String EXPERIMENTAL_FLAG = "otel.instrumentation.camel.experimental-span-attributes"; - static String experimental(String value) { + public static String experimental(String value) { if (!Boolean.getBoolean(EXPERIMENTAL_FLAG)) { return null; } return value; } - static OpenTelemetryAssertions.StringAssertConsumer experimental( - OpenTelemetryAssertions.StringAssertConsumer value) { - if (!Boolean.getBoolean(EXPERIMENTAL_FLAG)) { - return null; + static AttributeAssertion experimentalSatisfies( + AttributeKey key, OpenTelemetryAssertions.StringAssertConsumer assertion) { + if (Boolean.getBoolean(EXPERIMENTAL_FLAG)) { + return OpenTelemetryAssertions.satisfies(key, assertion); + } else { + return OpenTelemetryAssertions.equalTo(key, null); } - return value; } private ExperimentalTest() {} diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/RestCamelTest.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/RestCamelTest.java index c4432d24095d..a4aa4afa44e4 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/RestCamelTest.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/RestCamelTest.java @@ -7,6 +7,7 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.javaagent.instrumentation.apachecamel.ExperimentalTest.experimental; +import static io.opentelemetry.javaagent.instrumentation.apachecamel.ExperimentalTest.experimentalSatisfies; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import static io.opentelemetry.semconv.ClientAttributes.CLIENT_ADDRESS; @@ -130,9 +131,8 @@ void restComponentServerAndClientCallWithJettyBackend() { equalTo( URL_FULL, "http://localhost:" + port + "/api/firstModule/unit/unitOne"), - satisfies( - stringKey("camel.uri"), - experimental(val -> val.isInstanceOf(String.class)))), + experimentalSatisfies( + stringKey("camel.uri"), val -> val.isInstanceOf(String.class))), span -> span.hasName("moduleUnit") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/SingleServiceCamelTest.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/SingleServiceCamelTest.java index cfa154243afd..d2e3fab86b66 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/SingleServiceCamelTest.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/SingleServiceCamelTest.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.apachecamel; import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.javaagent.instrumentation.apachecamel.ExperimentalTest.experimental; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.semconv.HttpAttributes.HTTP_REQUEST_METHOD; import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; @@ -56,7 +57,7 @@ protected void cleanUp() { } @Test - public void singleCamelServiceSpan() { + void singleCamelServiceSpan() { URI requestUrl = address.resolve("/camelService"); client.post(requestUrl.toString(), "testContent").aggregate().join(); @@ -72,6 +73,7 @@ public void singleCamelServiceSpan() { equalTo(URL_FULL, requestUrl.toString()), equalTo( stringKey("camel.uri"), - requestUrl.toString().replace("localhost", "0.0.0.0"))))); + experimental( + requestUrl.toString().replace("localhost", "0.0.0.0")))))); } } diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/TwoServicesWithDirectClientCamelTest.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/TwoServicesWithDirectClientCamelTest.java index 7ae96fedab37..4dd89ff28720 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/TwoServicesWithDirectClientCamelTest.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/TwoServicesWithDirectClientCamelTest.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.apachecamel; import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.javaagent.instrumentation.apachecamel.ExperimentalTest.experimental; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import static io.opentelemetry.semconv.ClientAttributes.CLIENT_ADDRESS; @@ -111,7 +112,7 @@ void twoCamelServiceSpans() throws Exception { .hasKind(SpanKind.INTERNAL) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(stringKey("camel.uri"), "direct://input")), + equalTo(stringKey("camel.uri"), experimental("direct://input"))), span -> span.hasName("POST") .hasKind(SpanKind.CLIENT) @@ -122,7 +123,7 @@ void twoCamelServiceSpans() throws Exception { equalTo(HTTP_RESPONSE_STATUS_CODE, 200L), equalTo( stringKey("camel.uri"), - "http://localhost:" + portOne + "/serviceOne")), + experimental("http://localhost:" + portOne + "/serviceOne"))), span -> span.hasName("POST /serviceOne") .hasKind(SpanKind.SERVER) @@ -133,7 +134,7 @@ void twoCamelServiceSpans() throws Exception { equalTo(HTTP_RESPONSE_STATUS_CODE, 200L), equalTo( stringKey("camel.uri"), - "http://0.0.0.0:" + portOne + "/serviceOne")), + experimental("http://0.0.0.0:" + portOne + "/serviceOne"))), span -> span.hasName("POST") .hasKind(SpanKind.CLIENT) @@ -144,7 +145,7 @@ void twoCamelServiceSpans() throws Exception { equalTo(HTTP_RESPONSE_STATUS_CODE, 200L), equalTo( stringKey("camel.uri"), - "http://127.0.0.1:" + portTwo + "/serviceTwo")), + experimental("http://127.0.0.1:" + portTwo + "/serviceTwo"))), span -> span.hasName("POST /serviceTwo") .hasKind(SpanKind.SERVER) @@ -171,6 +172,9 @@ void twoCamelServiceSpans() throws Exception { equalTo(URL_FULL, "http://127.0.0.1:" + portTwo + "/serviceTwo"), equalTo( stringKey("camel.uri"), - "jetty:http://0.0.0.0:" + portTwo + "/serviceTwo?arg=value")))); + experimental( + "jetty:http://0.0.0.0:" + + portTwo + + "/serviceTwo?arg=value"))))); } } diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/aws/CamelSpanAssertions.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/aws/CamelSpanAssertions.java index 6c05dde80218..804592b07c31 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/aws/CamelSpanAssertions.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/aws/CamelSpanAssertions.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.apachecamel.aws; import static io.opentelemetry.api.common.AttributeKey.stringKey; +import static io.opentelemetry.javaagent.instrumentation.apachecamel.ExperimentalTest.experimental; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; @@ -22,7 +23,8 @@ static void direct(SpanDataAssert span, String spanName) { span.hasName(spanName) .hasKind(SpanKind.INTERNAL) .hasNoParent() - .hasAttributesSatisfyingExactly(equalTo(stringKey("camel.uri"), "direct://" + spanName)); + .hasAttributesSatisfyingExactly( + equalTo(stringKey("camel.uri"), experimental("direct://" + spanName))); } static SpanDataAssert sqsProduce(SpanDataAssert span, String queueName) { @@ -31,7 +33,8 @@ static SpanDataAssert sqsProduce(SpanDataAssert span, String queueName) { .hasAttributesSatisfyingExactly( equalTo( stringKey("camel.uri"), - "aws-sqs://" + queueName + "?amazonSQSClient=%23sqsClient&delay=1000"), + experimental( + "aws-sqs://" + queueName + "?amazonSQSClient=%23sqsClient&delay=1000")), equalTo(MESSAGING_DESTINATION_NAME, queueName)); } @@ -45,7 +48,8 @@ static SpanDataAssert sqsConsume(SpanDataAssert span, String queueName, int dela .hasAttributesSatisfyingExactly( equalTo( stringKey("camel.uri"), - "aws-sqs://" + queueName + "?amazonSQSClient=%23sqsClient&delay=" + delay), + experimental( + "aws-sqs://" + queueName + "?amazonSQSClient=%23sqsClient&delay=" + delay)), equalTo(MESSAGING_DESTINATION_NAME, queueName), satisfies( MESSAGING_MESSAGE_ID, stringAssert -> stringAssert.isInstanceOf(String.class))); @@ -56,7 +60,8 @@ static SpanDataAssert snsPublish(SpanDataAssert span, String topicName) { .hasKind(SpanKind.INTERNAL) .hasAttributesSatisfyingExactly( equalTo( - stringKey("camel.uri"), "aws-sns://" + topicName + "?amazonSNSClient=%23snsClient"), + stringKey("camel.uri"), + experimental("aws-sns://" + topicName + "?amazonSNSClient=%23snsClient")), equalTo(MESSAGING_DESTINATION_NAME, topicName)); } @@ -65,6 +70,7 @@ static SpanDataAssert s3(SpanDataAssert span, String bucketName) { .hasKind(SpanKind.INTERNAL) .hasAttributesSatisfyingExactly( equalTo( - stringKey("camel.uri"), "aws-s3://" + bucketName + "?amazonS3Client=%23s3Client")); + stringKey("camel.uri"), + experimental("aws-s3://" + bucketName + "?amazonS3Client=%23s3Client"))); } } diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/CassandraTest.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/CassandraTest.java index 69245ff669e5..912f87d14672 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/CassandraTest.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/CassandraTest.java @@ -7,6 +7,7 @@ import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; +import static io.opentelemetry.javaagent.instrumentation.apachecamel.ExperimentalTest.experimental; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; @@ -112,13 +113,13 @@ void testCassandra() { span.hasKind(SpanKind.INTERNAL) .hasNoParent() .hasAttributesSatisfyingExactly( - equalTo(stringKey("camel.uri"), "direct://input")), + equalTo(stringKey("camel.uri"), experimental("direct://input"))), span -> span.hasKind(SpanKind.CLIENT) .hasAttributesSatisfyingExactly( equalTo( stringKey("camel.uri"), - "cql://" + host + ":" + cassandraPort + "/test"), + experimental("cql://" + host + ":" + cassandraPort + "/test")), equalTo(maybeStable(DB_NAME), "test"), equalTo( maybeStable(DB_STATEMENT), From 287171a1f17dbd5b3137e5fc5cac28d690d35097 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Thu, 14 Aug 2025 16:28:05 -0400 Subject: [PATCH 3/7] static import --- .../instrumentation/apachecamel/ExperimentalTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/ExperimentalTest.java b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/ExperimentalTest.java index 344507f0eb41..f63ea2320a69 100644 --- a/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/ExperimentalTest.java +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/ExperimentalTest.java @@ -10,7 +10,7 @@ import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; -import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions; +import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.StringAssertConsumer; public class ExperimentalTest { private static final String EXPERIMENTAL_FLAG = @@ -24,7 +24,7 @@ public static String experimental(String value) { } static AttributeAssertion experimentalSatisfies( - AttributeKey key, OpenTelemetryAssertions.StringAssertConsumer assertion) { + AttributeKey key, StringAssertConsumer assertion) { if (Boolean.getBoolean(EXPERIMENTAL_FLAG)) { return satisfies(key, assertion); } else { From 1626f1e478938c6f42cc97a799199a64f41f9ede Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Thu, 14 Aug 2025 16:56:58 -0400 Subject: [PATCH 4/7] fix checkstyle rule --- buildscripts/checkstyle.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildscripts/checkstyle.xml b/buildscripts/checkstyle.xml index 623a803a9604..6f93ce98d46d 100644 --- a/buildscripts/checkstyle.xml +++ b/buildscripts/checkstyle.xml @@ -52,7 +52,7 @@ + value="(?<!import (?:static )?io.opentelemetry.sdk.testing.assertj.)OpenTelemetryAssertions\.(?![A-Z]\w*[;\s]*)"/> From 1008c050647b6efd9f45e7b6499fee64ab05faab Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Fri, 15 Aug 2025 11:02:12 -0400 Subject: [PATCH 5/7] simplify regex rule --- buildscripts/checkstyle.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildscripts/checkstyle.xml b/buildscripts/checkstyle.xml index 6f93ce98d46d..f0a88880f6da 100644 --- a/buildscripts/checkstyle.xml +++ b/buildscripts/checkstyle.xml @@ -50,9 +50,10 @@ --> + + value="^(?!.*import).*OpenTelemetryAssertions\.[a-z]"/> From 32fe58c8eba756621381c3185a343cd302f6a1d8 Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Fri, 15 Aug 2025 12:07:22 -0400 Subject: [PATCH 6/7] update comment --- buildscripts/checkstyle.xml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/buildscripts/checkstyle.xml b/buildscripts/checkstyle.xml index f0a88880f6da..a5b57490257d 100644 --- a/buildscripts/checkstyle.xml +++ b/buildscripts/checkstyle.xml @@ -50,7 +50,8 @@ --> - + From 741a3c6ec38e6ed6f3db0429fe77224d62954c5c Mon Sep 17 00:00:00 2001 From: Jay DeLuca Date: Fri, 15 Aug 2025 12:08:29 -0400 Subject: [PATCH 7/7] update comment --- buildscripts/checkstyle.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/buildscripts/checkstyle.xml b/buildscripts/checkstyle.xml index a5b57490257d..3a3ed073ceba 100644 --- a/buildscripts/checkstyle.xml +++ b/buildscripts/checkstyle.xml @@ -51,7 +51,7 @@ + classes (uppercase). The negative lookahead is needed so we don't match import lines. -->