diff --git a/docs/instrumentation-list.yaml b/docs/instrumentation-list.yaml index 0d15fd288632..8af5fd88109e 100644 --- a/docs/instrumentation-list.yaml +++ b/docs/instrumentation-list.yaml @@ -7801,20 +7801,193 @@ libraries: type: STRING lettuce: - name: lettuce-4.0 + description: | + This instrumentation enables database client spans and database client metrics for the Lettuce Redis client. + semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS + library_link: https://github.com/redis/lettuce source_path: instrumentation/lettuce/lettuce-4.0 scope: name: io.opentelemetry.lettuce-4.0 target_versions: javaagent: - biz.paluch.redis:lettuce:[4.0.Final,) + configurations: + - name: otel.instrumentation.lettuce.connection-telemetry.enabled + description: Enables connection telemetry spans for Redis connections. + type: boolean + default: false + - name: otel.instrumentation.lettuce.experimental-span-attributes + description: Enables experimental span attribute `lettuce.command.cancelled`. + type: boolean + default: false + - name: otel.instrumentation.common.peer-service-mapping + description: Used to specify a mapping from host names or IP addresses to peer + services. + type: map + default: '' + telemetry: + - when: default + spans: + - span_kind: CLIENT + attributes: + - name: db.operation + type: STRING + - name: db.system + type: STRING + - name: peer.service + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG + - when: otel.instrumentation.lettuce.experimental-span-attributes=true + spans: + - span_kind: CLIENT + attributes: + - name: db.operation + type: STRING + - name: db.system + type: STRING + - name: lettuce.command.cancelled + type: BOOLEAN + - name: peer.service + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.operation.duration + description: Duration of database client operations. + type: HISTOGRAM + unit: s + attributes: + - name: db.operation.name + type: STRING + - name: db.system.name + type: STRING + spans: + - span_kind: CLIENT + attributes: + - name: db.operation.name + type: STRING + - name: db.system.name + type: STRING + - name: error.type + type: STRING + - name: peer.service + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG - name: lettuce-5.0 + description: | + This instrumentation enables database client spans and database client metrics for the Lettuce Redis client. + semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS + library_link: https://github.com/redis/lettuce source_path: instrumentation/lettuce/lettuce-5.0 scope: name: io.opentelemetry.lettuce-5.0 target_versions: javaagent: - io.lettuce:lettuce-core:[5.0.0.RELEASE,5.1.0.RELEASE) + configurations: + - name: otel.instrumentation.lettuce.connection-telemetry.enabled + description: Enables connection telemetry spans for Redis connections. + type: boolean + default: false + - name: otel.instrumentation.lettuce.experimental-span-attributes + description: | + Enables experimental span attributes `lettuce.command.cancelled` and `lettuce.command.results.count`. + type: boolean + default: false + - name: otel.instrumentation.common.db-statement-sanitizer.enabled + description: Enables statement sanitization for database queries. + type: boolean + default: true + - name: otel.instrumentation.common.peer-service-mapping + description: Used to specify a mapping from host names or IP addresses to peer + services. + type: map + default: '' + telemetry: + - when: default + spans: + - span_kind: CLIENT + attributes: + - name: db.operation + type: STRING + - name: db.statement + type: STRING + - name: db.system + type: STRING + - name: peer.service + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG + - when: otel.instrumentation.lettuce.experimental-span-attributes=true + spans: + - span_kind: CLIENT + attributes: + - name: db.operation + type: STRING + - name: db.statement + type: STRING + - name: db.system + type: STRING + - name: lettuce.command.cancelled + type: BOOLEAN + - name: lettuce.command.results.count + type: LONG + - name: peer.service + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.operation.duration + description: Duration of database client operations. + type: HISTOGRAM + unit: s + attributes: + - name: db.operation.name + type: STRING + - name: db.system.name + type: STRING + spans: + - span_kind: CLIENT + attributes: + - name: db.operation.name + type: STRING + - name: db.query.text + type: STRING + - name: db.system.name + type: STRING + - name: error.type + type: STRING + - name: peer.service + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG - name: lettuce-5.1 + description: | + This instrumentation enables database client spans and database client metrics for the Lettuce Redis client. + semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS + library_link: https://github.com/redis/lettuce source_path: instrumentation/lettuce/lettuce-5.1 scope: name: io.opentelemetry.lettuce-5.1 @@ -7823,6 +7996,73 @@ libraries: - io.lettuce:lettuce-core:[5.1.0.RELEASE,) library: - io.lettuce:lettuce-core:5.1.0.RELEASE + configurations: + - name: otel.instrumentation.lettuce.experimental.command-encoding-events.enabled + description: Enables capturing `redis.encode.start` and `redis.encode.end` span + events. + type: boolean + default: false + - name: otel.instrumentation.common.db-statement-sanitizer.enabled + description: Enables statement sanitization for database queries. + type: boolean + default: true + telemetry: + - when: default + spans: + - span_kind: CLIENT + attributes: + - name: db.statement + type: STRING + - name: db.system + type: STRING + - name: error + 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 + metrics: + - name: db.client.operation.duration + description: Duration of database client operations. + type: HISTOGRAM + unit: s + attributes: + - name: db.system.name + type: STRING + - name: network.peer.address + type: STRING + - name: network.peer.port + type: LONG + - name: server.address + type: STRING + - name: server.port + type: LONG + spans: + - span_kind: CLIENT + attributes: + - name: db.query.text + type: STRING + - name: db.system.name + type: STRING + - name: error + 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 liberty: - name: liberty-20.0 source_path: instrumentation/liberty/liberty-20.0 diff --git a/instrumentation-docs/instrumentations.sh b/instrumentation-docs/instrumentations.sh index 65a852123fec..e61f55eb6e06 100755 --- a/instrumentation-docs/instrumentations.sh +++ b/instrumentation-docs/instrumentations.sh @@ -158,6 +158,14 @@ readonly INSTRUMENTATIONS=( "ktor:ktor-3.0:library:test" "kubernetes-client-7.0:javaagent:test" "kubernetes-client-7.0:javaagent:testExperimental" + "lettuce:lettuce-4.0:javaagent:test" + "lettuce:lettuce-4.0:javaagent:testExperimental" + "lettuce:lettuce-4.0:javaagent:testStableSemconv" + "lettuce:lettuce-5.0:javaagent:test" + "lettuce:lettuce-5.0:javaagent:testExperimental" + "lettuce:lettuce-5.0:javaagent:testStableSemconv" + "lettuce:lettuce-5.1:javaagent:test" + "lettuce:lettuce-5.1:javaagent:testStableSemconv" "nats:nats-2.17:javaagent:test" "nats:nats-2.17:javaagent:testExperimental" "netty:netty-3.8:javaagent:test" diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/build.gradle.kts b/instrumentation/lettuce/lettuce-4.0/javaagent/build.gradle.kts index 24bbb55edeab..86e9c7c7f770 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/build.gradle.kts +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/build.gradle.kts @@ -22,20 +22,27 @@ dependencies { tasks { withType().configureEach { - // TODO run tests both with and without experimental span attributes and span events - jvmArgs("-Dotel.instrumentation.lettuce.experimental-span-attributes=true") jvmArgs("-Dotel.instrumentation.lettuce.connection-telemetry.enabled=true") - jvmArgs("-Dotel.instrumentation.lettuce.experimental.command-encoding-events.enabled=true") usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") + } + + val testExperimental by registering(Test::class) { + testClassesDirs = sourceSets.test.get().output.classesDirs + classpath = sourceSets.test.get().runtimeClasspath + + jvmArgs("-Dotel.instrumentation.lettuce.experimental-span-attributes=true") + systemProperty("metadataConfig", "otel.instrumentation.lettuce.experimental-span-attributes=true") } val testStableSemconv by registering(Test::class) { testClassesDirs = sourceSets.test.get().output.classesDirs classpath = sourceSets.test.get().runtimeClasspath 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/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/ExperimentalHelper.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/ExperimentalHelper.java new file mode 100644 index 000000000000..2f889ac7e055 --- /dev/null +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/ExperimentalHelper.java @@ -0,0 +1,21 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.lettuce.v4_0; + +import javax.annotation.Nullable; + +class ExperimentalHelper { + + private static final boolean EXPERIMENTAL_ATTRIBUTES_ENABLED = + Boolean.getBoolean("otel.instrumentation.lettuce.experimental-span-attributes"); + + @Nullable + static T experimental(T value) { + return EXPERIMENTAL_ATTRIBUTES_ENABLED ? value : null; + } + + private ExperimentalHelper() {} +} diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java index 77e8523cbe6c..d07a245c70b3 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceAsyncClientTest.java @@ -7,6 +7,7 @@ import static io.opentelemetry.api.common.AttributeKey.booleanKey; import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v4_0.ExperimentalHelper.experimental; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; @@ -476,7 +477,7 @@ void testCommandBeforeItFinished() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_OPERATION), "SADD"), - equalTo(booleanKey("lettuce.command.cancelled"), true)), + equalTo(booleanKey("lettuce.command.cancelled"), experimental(true))), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java index 1e12e8fa6a1c..377ede9f48a2 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceSyncClientTest.java @@ -5,8 +5,11 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v4_0; +import static io.opentelemetry.instrumentation.testing.junit.db.DbClientMetricsTestUtil.assertDurationMetric; import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; @@ -43,7 +46,7 @@ class LettuceSyncClientTest { private static final Logger logger = LoggerFactory.getLogger(LettuceSyncClientTest.class); @RegisterExtension - protected static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); @RegisterExtension static final AutoCleanupExtension cleanup = AutoCleanupExtension.create(); @@ -169,6 +172,9 @@ void testSetCommand() { .hasAttributesSatisfyingExactly( equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_OPERATION), "SET")))); + + assertDurationMetric( + testing, "io.opentelemetry.lettuce-4.0", DB_SYSTEM_NAME, DB_OPERATION_NAME); } @Test diff --git a/instrumentation/lettuce/lettuce-4.0/metadata.yaml b/instrumentation/lettuce/lettuce-4.0/metadata.yaml new file mode 100644 index 000000000000..32f1d3683e1b --- /dev/null +++ b/instrumentation/lettuce/lettuce-4.0/metadata.yaml @@ -0,0 +1,20 @@ +description: > + This instrumentation enables database client spans and database client metrics for the Lettuce + Redis client. +semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS +library_link: https://github.com/redis/lettuce +configurations: + - name: otel.instrumentation.lettuce.connection-telemetry.enabled + description: Enables connection telemetry spans for Redis connections. + type: boolean + default: false + - name: otel.instrumentation.lettuce.experimental-span-attributes + description: Enables experimental span attribute `lettuce.command.cancelled`. + type: boolean + default: false + - name: otel.instrumentation.common.peer-service-mapping + description: Used to specify a mapping from host names or IP addresses to peer services. + type: map + default: "" diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/build.gradle.kts b/instrumentation/lettuce/lettuce-5.0/javaagent/build.gradle.kts index 84c8e0469e92..9b0690a1ee1d 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/build.gradle.kts +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/build.gradle.kts @@ -28,20 +28,29 @@ dependencies { tasks { withType().configureEach { - // TODO run tests both with and without experimental span attributes and span events - jvmArgs("-Dotel.instrumentation.lettuce.experimental-span-attributes=true") jvmArgs("-Dotel.instrumentation.lettuce.connection-telemetry.enabled=true") jvmArgs("-Dotel.instrumentation.lettuce.experimental.command-encoding-events.enabled=true") usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + + systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") + } + + val testExperimental by registering(Test::class) { + testClassesDirs = sourceSets.test.get().output.classesDirs + classpath = sourceSets.test.get().runtimeClasspath + + jvmArgs("-Dotel.instrumentation.lettuce.experimental-span-attributes=true") + systemProperty("metadataConfig", "otel.instrumentation.lettuce.experimental-span-attributes=true") } val testStableSemconv by registering(Test::class) { testClassesDirs = sourceSets.test.get().output.classesDirs classpath = sourceSets.test.get().runtimeClasspath 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/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/ExperimentalHelper.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/ExperimentalHelper.java new file mode 100644 index 000000000000..2b41cc122f36 --- /dev/null +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/ExperimentalHelper.java @@ -0,0 +1,21 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; + +import javax.annotation.Nullable; + +class ExperimentalHelper { + + static final boolean EXPERIMENTAL_ATTRIBUTES_ENABLED = + Boolean.getBoolean("otel.instrumentation.lettuce.experimental-span-attributes"); + + @Nullable + static T experimental(T value) { + return EXPERIMENTAL_ATTRIBUTES_ENABLED ? value : null; + } + + private ExperimentalHelper() {} +} diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java index 4f05a89a430d..925e374a067c 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceAsyncClientTest.java @@ -7,6 +7,7 @@ import static io.opentelemetry.api.common.AttributeKey.booleanKey; import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.ExperimentalHelper.experimental; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; @@ -479,7 +480,7 @@ void testCancelCommandBeforeItFinishes() { equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "SADD SKEY ? ?"), equalTo(maybeStable(DB_OPERATION), "SADD"), - equalTo(booleanKey("lettuce.command.cancelled"), true)), + equalTo(booleanKey("lettuce.command.cancelled"), experimental(true))), span -> span.hasName("callback") .hasKind(SpanKind.INTERNAL) diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java index 9cf7b958e519..d5e3a8d2945d 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceReactiveClientTest.java @@ -5,7 +5,11 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; +import static io.opentelemetry.api.common.AttributeKey.booleanKey; +import static io.opentelemetry.api.common.AttributeKey.longKey; import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.ExperimentalHelper.EXPERIMENTAL_ATTRIBUTES_ENABLED; +import static io.opentelemetry.javaagent.instrumentation.lettuce.v5_0.ExperimentalHelper.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.DbIncubatingAttributes.DB_OPERATION; @@ -17,7 +21,6 @@ import io.lettuce.core.api.StatefulRedisConnection; import io.lettuce.core.api.reactive.RedisReactiveCommands; import io.lettuce.core.api.sync.RedisCommands; -import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.Attributes; import io.opentelemetry.api.trace.SpanKind; import java.net.InetAddress; @@ -27,7 +30,6 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import java.util.function.Consumer; -import org.assertj.core.api.AbstractBooleanAssert; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -215,8 +217,12 @@ void testCommandFluxPublisher() { equalTo(maybeStable(DB_STATEMENT), "COMMAND"), equalTo(maybeStable(DB_OPERATION), "COMMAND"), satisfies( - AttributeKey.longKey("lettuce.command.results.count"), - val -> val.isGreaterThan(100))))); + longKey("lettuce.command.results.count"), + val -> { + if (EXPERIMENTAL_ATTRIBUTES_ENABLED) { + val.isGreaterThan(100); + } + })))); } @Test @@ -233,12 +239,14 @@ void testCommandCancelAfter2OnFluxPublisher() { equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "COMMAND"), equalTo(maybeStable(DB_OPERATION), "COMMAND"), + equalTo(booleanKey("lettuce.command.cancelled"), experimental(true)), satisfies( - AttributeKey.booleanKey("lettuce.command.cancelled"), - AbstractBooleanAssert::isTrue), - satisfies( - AttributeKey.longKey("lettuce.command.results.count"), - val -> val.isEqualTo(2))))); + longKey("lettuce.command.results.count"), + val -> { + if (EXPERIMENTAL_ATTRIBUTES_ENABLED) { + val.isEqualTo(2); + } + })))); } @Test diff --git a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java index 5304407c8ef3..414b68b60b2e 100644 --- a/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/lettuce/v5_0/LettuceSyncClientTest.java @@ -5,9 +5,12 @@ package io.opentelemetry.javaagent.instrumentation.lettuce.v5_0; +import static io.opentelemetry.instrumentation.testing.junit.db.DbClientMetricsTestUtil.assertDurationMetric; import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.satisfies; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; @@ -158,6 +161,9 @@ void testSetCommand() { equalTo(maybeStable(DB_SYSTEM), "redis"), equalTo(maybeStable(DB_STATEMENT), "SET TESTSETKEY ?"), equalTo(maybeStable(DB_OPERATION), "SET")))); + + assertDurationMetric( + testing, "io.opentelemetry.lettuce-5.0", DB_SYSTEM_NAME, DB_OPERATION_NAME); } @Test diff --git a/instrumentation/lettuce/lettuce-5.0/metadata.yaml b/instrumentation/lettuce/lettuce-5.0/metadata.yaml new file mode 100644 index 000000000000..18496c75817c --- /dev/null +++ b/instrumentation/lettuce/lettuce-5.0/metadata.yaml @@ -0,0 +1,26 @@ +description: > + This instrumentation enables database client spans and database client metrics for the Lettuce + Redis client. +semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS +library_link: https://github.com/redis/lettuce +configurations: + - name: otel.instrumentation.lettuce.connection-telemetry.enabled + description: Enables connection telemetry spans for Redis connections. + type: boolean + default: false + - name: otel.instrumentation.lettuce.experimental-span-attributes + description: > + Enables experimental span attributes `lettuce.command.cancelled` and + `lettuce.command.results.count`. + type: boolean + default: false + - name: otel.instrumentation.common.db-statement-sanitizer.enabled + description: Enables statement sanitization for database queries. + type: boolean + default: true + - name: otel.instrumentation.common.peer-service-mapping + description: Used to specify a mapping from host names or IP addresses to peer services. + type: map + default: "" diff --git a/instrumentation/lettuce/lettuce-5.1/javaagent/build.gradle.kts b/instrumentation/lettuce/lettuce-5.1/javaagent/build.gradle.kts index 13d7f021df59..8e11f1430ea2 100644 --- a/instrumentation/lettuce/lettuce-5.1/javaagent/build.gradle.kts +++ b/instrumentation/lettuce/lettuce-5.1/javaagent/build.gradle.kts @@ -29,12 +29,14 @@ tasks { withType().configureEach { systemProperty("testLatestDeps", findProperty("testLatestDeps") as Boolean) usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") } val testStableSemconv by registering(Test::class) { testClassesDirs = sourceSets.test.get().output.classesDirs classpath = sourceSets.test.get().runtimeClasspath jvmArgs("-Dotel.semconv-stability.opt-in=database") + systemProperty("metadataConfig", "otel.semconv-stability.opt-in=database") } check { diff --git a/instrumentation/lettuce/lettuce-5.1/metadata.yaml b/instrumentation/lettuce/lettuce-5.1/metadata.yaml new file mode 100644 index 000000000000..4d800f595e75 --- /dev/null +++ b/instrumentation/lettuce/lettuce-5.1/metadata.yaml @@ -0,0 +1,16 @@ +description: > + This instrumentation enables database client spans and database client metrics for the Lettuce + Redis client. +semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS +library_link: https://github.com/redis/lettuce +configurations: + - name: otel.instrumentation.lettuce.experimental.command-encoding-events.enabled + description: Enables capturing `redis.encode.start` and `redis.encode.end` span events. + type: boolean + default: false + - name: otel.instrumentation.common.db-statement-sanitizer.enabled + description: Enables statement sanitization for database queries. + type: boolean + default: true