diff --git a/buildscripts/checkstyle.xml b/buildscripts/checkstyle.xml index 623a803a96..3a3ed073ce 100644 --- a/buildscripts/checkstyle.xml +++ b/buildscripts/checkstyle.xml @@ -50,9 +50,11 @@ --> + + value="^(?!.*import).*OpenTelemetryAssertions\.[a-z]"/> diff --git a/docs/instrumentation-list.yaml b/docs/instrumentation-list.yaml index fefe3d0a5d..c3726961b3 100644 --- a/docs/instrumentation-list.yaml +++ b/docs/instrumentation-list.yaml @@ -1663,6 +1663,115 @@ libraries: Enable the capture of experimental `camel.uri`, `camel.kafka.partitionKey`, `camel.kafka.key` and `camel.kafka.offset` 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: | diff --git a/instrumentation-docs/instrumentations.sh b/instrumentation-docs/instrumentations.sh index 2fa549c73b..87fd91e0f8 100755 --- a/instrumentation-docs/instrumentations.sh +++ b/instrumentation-docs/instrumentations.sh @@ -122,6 +122,9 @@ readonly INSTRUMENTATIONS=( "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" ) # 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 f989bd74af..d401d4f03f 100644 --- a/instrumentation/camel-2.20/javaagent/build.gradle.kts +++ b/instrumentation/camel-2.20/javaagent/build.gradle.kts @@ -69,8 +69,6 @@ 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.aws-sdk.experimental-span-attributes=true") // TODO: fix camel instrumentation so that it uses semantic attributes extractors @@ -81,14 +79,22 @@ tasks { jvmArgs("-XX:+IgnoreUnrecognizedVMOptions") jvmArgs("-Dotel.instrumentation.common.experimental.controller-telemetry.enabled=true") + + systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") + } + + 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 { - 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 6dd9ba6cc6..dd1f41d7e4 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 @@ class DirectCamelTest extends AbstractHttpServerUsingTest 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 0000000000..f63ea2320a --- /dev/null +++ b/instrumentation/camel-2.20/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/apachecamel/ExperimentalTest.java @@ -0,0 +1,36 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.apachecamel; + +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; + +import io.opentelemetry.api.common.AttributeKey; +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; +import io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.StringAssertConsumer; + +public class ExperimentalTest { + private static final String EXPERIMENTAL_FLAG = + "otel.instrumentation.camel.experimental-span-attributes"; + + public static String experimental(String value) { + if (!Boolean.getBoolean(EXPERIMENTAL_FLAG)) { + return null; + } + return value; + } + + static AttributeAssertion experimentalSatisfies( + AttributeKey key, StringAssertConsumer assertion) { + if (Boolean.getBoolean(EXPERIMENTAL_FLAG)) { + return satisfies(key, assertion); + } else { + return equalTo(key, null); + } + } + + 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 2b13af62e5..d2b657dc16 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 @@ class MulticastDirectCamelTest extends AbstractHttpServerUsingTest 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 b509ba5722..a4aa4afa44 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,8 @@ 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.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; @@ -92,7 +94,7 @@ class RestCamelTest extends AbstractHttpServerUsingTest span.hasName("GET") .hasKind(SpanKind.CLIENT) @@ -100,7 +102,7 @@ class RestCamelTest extends AbstractHttpServerUsingTest @@ -129,13 +131,13 @@ class RestCamelTest extends AbstractHttpServerUsingTest 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"))))); } } 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 cfa154243a..d2e3fab86b 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 @@ class SingleServiceCamelTest extends AbstractHttpServerUsingTest span.hasName("POST") .hasKind(SpanKind.CLIENT) @@ -122,7 +123,7 @@ class TwoServicesWithDirectClientCamelTest 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 @@ class TwoServicesWithDirectClientCamelTest 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 @@ class TwoServicesWithDirectClientCamelTest 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 @@ class TwoServicesWithDirectClientCamelTest 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 6c05dde802..804592b07c 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 @@ class CamelSpanAssertions { 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 @@ class CamelSpanAssertions { .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 @@ class CamelSpanAssertions { .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 @@ class CamelSpanAssertions { .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 @@ class CamelSpanAssertions { .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 69245ff669..912f87d146 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 @@ package io.opentelemetry.javaagent.instrumentation.apachecamel.decorators; 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 @@ class CassandraTest extends AbstractHttpServerUsingTest 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),