diff --git a/docs/instrumentation-list.yaml b/docs/instrumentation-list.yaml index 5d389140daf9..ecd96a0b124f 100644 --- a/docs/instrumentation-list.yaml +++ b/docs/instrumentation-list.yaml @@ -5820,7 +5820,58 @@ libraries: - name: gen_ai.usage.output_tokens type: LONG opensearch: + - name: opensearch-java-3.0 + description: | + This instrumentation enables database client spans and database client metrics for the OpenSearch Java client. + semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS + library_link: https://docs.opensearch.org/latest/clients/java/ + source_path: instrumentation/opensearch/opensearch-java-3.0 + minimum_java_version: 11 + scope: + name: io.opentelemetry.opensearch-java-3.0 + target_versions: + javaagent: + - org.opensearch.client:opensearch-java:[3.0,) + telemetry: + - when: default + spans: + - span_kind: CLIENT + attributes: + - name: db.operation + type: STRING + - name: db.statement + type: STRING + - name: db.system + type: STRING + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.operation.duration + description: Duration of database client operations. + type: HISTOGRAM + unit: s + attributes: + - name: db.operation.name + type: STRING + - name: db.system.name + type: STRING + spans: + - span_kind: CLIENT + attributes: + - name: db.operation.name + type: STRING + - name: db.query.text + type: STRING + - name: db.system.name + type: STRING - name: opensearch-rest-1.0 + description: | + This instrumentation enables database client spans and database client metrics for OpenSearch REST clients. + semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS + library_link: https://docs.opensearch.org/latest/clients/ source_path: instrumentation/opensearch/opensearch-rest-1.0 minimum_java_version: 11 scope: @@ -5828,7 +5879,44 @@ libraries: target_versions: javaagent: - org.opensearch.client:opensearch-rest-client:[1.0,3.0) + telemetry: + - when: default + spans: + - span_kind: CLIENT + attributes: + - name: db.operation + type: STRING + - name: db.statement + type: STRING + - name: db.system + type: STRING + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.operation.duration + description: Duration of database client operations. + type: HISTOGRAM + unit: s + attributes: + - name: db.operation.name + type: STRING + - name: db.system.name + type: STRING + spans: + - span_kind: CLIENT + attributes: + - name: db.operation.name + type: STRING + - name: db.query.text + type: STRING + - name: db.system.name + type: STRING - name: opensearch-rest-3.0 + description: | + This instrumentation enables database client spans and database client metrics for OpenSearch REST clients. + semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS + library_link: https://docs.opensearch.org/latest/clients/ source_path: instrumentation/opensearch/opensearch-rest-3.0 minimum_java_version: 11 scope: @@ -5836,6 +5924,37 @@ libraries: target_versions: javaagent: - org.opensearch.client:opensearch-rest-client:[3.0,) + telemetry: + - when: default + spans: + - span_kind: CLIENT + attributes: + - name: db.operation + type: STRING + - name: db.statement + type: STRING + - name: db.system + type: STRING + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.operation.duration + description: Duration of database client operations. + type: HISTOGRAM + unit: s + attributes: + - name: db.operation.name + type: STRING + - name: db.system.name + type: STRING + spans: + - span_kind: CLIENT + attributes: + - name: db.operation.name + type: STRING + - name: db.query.text + type: STRING + - name: db.system.name + type: STRING oracle: - name: oracle-ucp-11.2 description: The Oracle Universal Connection Pool (UCP) instrumentation generates diff --git a/instrumentation-docs/instrumentations.sh b/instrumentation-docs/instrumentations.sh index 5345d4164e00..6e22cc1c756e 100755 --- a/instrumentation-docs/instrumentations.sh +++ b/instrumentation-docs/instrumentations.sh @@ -129,6 +129,12 @@ readonly INSTRUMENTATIONS=( "okhttp:okhttp-2.2:javaagent:test" "okhttp:okhttp-3.0:javaagent:test" "openai:openai-java-1.1:javaagent:test" + "opensearch:opensearch-java-3.0:javaagent:test" + "opensearch:opensearch-java-3.0:javaagent:testStableSemconv" + "opensearch:opensearch-rest-1.0:javaagent:test" + "opensearch:opensearch-rest-1.0:javaagent:testStableSemconv" + "opensearch:opensearch-rest-3.0:javaagent:test" + "opensearch:opensearch-rest-3.0:javaagent:testStableSemconv" "oshi:javaagent:test" "oshi:javaagent:testExperimental" "pekko:pekko-http-1.0:javaagent:test" diff --git a/instrumentation/opensearch/opensearch-java-3.0/javaagent/build.gradle.kts b/instrumentation/opensearch/opensearch-java-3.0/javaagent/build.gradle.kts index c95e8c459aa7..da36e2438828 100644 --- a/instrumentation/opensearch/opensearch-java-3.0/javaagent/build.gradle.kts +++ b/instrumentation/opensearch/opensearch-java-3.0/javaagent/build.gradle.kts @@ -34,14 +34,16 @@ dependencies { } tasks { - test { + withType().configureEach { 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/opensearch/opensearch-java-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opensearch/v3_0/AbstractOpenSearchTest.java b/instrumentation/opensearch/opensearch-java-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opensearch/v3_0/AbstractOpenSearchTest.java index a59e27399801..3a98f1646458 100644 --- a/instrumentation/opensearch/opensearch-java-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opensearch/v3_0/AbstractOpenSearchTest.java +++ b/instrumentation/opensearch/opensearch-java-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opensearch/v3_0/AbstractOpenSearchTest.java @@ -5,8 +5,11 @@ package io.opentelemetry.javaagent.instrumentation.opensearch.v3_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.HttpAttributes.HTTP_REQUEST_METHOD; import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; @@ -151,4 +154,15 @@ void shouldGetStatusAsyncWithTraces() throws Exception { .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(1)))); } + + @Test + void shouldRecordMetrics() throws IOException { + HealthResponse healthResponse = openSearchClient.cluster().health(); + assertThat(healthResponse).isNotNull(); + + getTesting().waitForTraces(1); + + assertDurationMetric( + getTesting(), "io.opentelemetry.opensearch-java-3.0", DB_OPERATION_NAME, DB_SYSTEM_NAME); + } } diff --git a/instrumentation/opensearch/opensearch-java-3.0/metadata.yaml b/instrumentation/opensearch/opensearch-java-3.0/metadata.yaml new file mode 100644 index 000000000000..20e826f3431d --- /dev/null +++ b/instrumentation/opensearch/opensearch-java-3.0/metadata.yaml @@ -0,0 +1,7 @@ +description: > + This instrumentation enables database client spans and database client metrics for the OpenSearch + Java client. +library_link: https://docs.opensearch.org/latest/clients/java/ +semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS \ No newline at end of file diff --git a/instrumentation/opensearch/opensearch-rest-1.0/javaagent/build.gradle.kts b/instrumentation/opensearch/opensearch-rest-1.0/javaagent/build.gradle.kts index ca8079bdcf89..8b5cab7b6930 100644 --- a/instrumentation/opensearch/opensearch-rest-1.0/javaagent/build.gradle.kts +++ b/instrumentation/opensearch/opensearch-rest-1.0/javaagent/build.gradle.kts @@ -40,14 +40,16 @@ dependencies { } tasks { - test { + withType().configureEach { 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/opensearch/opensearch-rest-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/v1_0/OpenSearchRestTest.java b/instrumentation/opensearch/opensearch-rest-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/v1_0/OpenSearchRestTest.java index 863bbd4e3897..0e0272f3c71c 100644 --- a/instrumentation/opensearch/opensearch-rest-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/v1_0/OpenSearchRestTest.java +++ b/instrumentation/opensearch/opensearch-rest-1.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/v1_0/OpenSearchRestTest.java @@ -57,4 +57,9 @@ protected RestClient buildRestClient() throws Exception { protected int getResponseStatus(Response response) { return response.getStatusLine().getStatusCode(); } + + @Override + protected String getInstrumentationName() { + return "io.opentelemetry.opensearch-rest-1.0"; + } } diff --git a/instrumentation/opensearch/opensearch-rest-1.0/metadata.yaml b/instrumentation/opensearch/opensearch-rest-1.0/metadata.yaml new file mode 100644 index 000000000000..88f657caa64f --- /dev/null +++ b/instrumentation/opensearch/opensearch-rest-1.0/metadata.yaml @@ -0,0 +1,7 @@ +description: > + This instrumentation enables database client spans and database client metrics for OpenSearch + REST clients. +library_link: https://docs.opensearch.org/latest/clients/ +semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS \ No newline at end of file diff --git a/instrumentation/opensearch/opensearch-rest-3.0/javaagent/build.gradle.kts b/instrumentation/opensearch/opensearch-rest-3.0/javaagent/build.gradle.kts index 887daaf25f6c..8eb1efa9b2ee 100644 --- a/instrumentation/opensearch/opensearch-rest-3.0/javaagent/build.gradle.kts +++ b/instrumentation/opensearch/opensearch-rest-3.0/javaagent/build.gradle.kts @@ -33,14 +33,16 @@ dependencies { } tasks { - test { + withType().configureEach { 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/opensearch/opensearch-rest-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/v3_0/OpenSearchRest3Test.java b/instrumentation/opensearch/opensearch-rest-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/v3_0/OpenSearchRest3Test.java index 5f5266987263..ed694351efe6 100644 --- a/instrumentation/opensearch/opensearch-rest-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/v3_0/OpenSearchRest3Test.java +++ b/instrumentation/opensearch/opensearch-rest-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/v3_0/OpenSearchRest3Test.java @@ -68,4 +68,9 @@ protected RestClient buildRestClient() throws Exception { protected int getResponseStatus(Response response) { return response.getStatusLine().getStatusCode(); } + + @Override + protected String getInstrumentationName() { + return "io.opentelemetry.opensearch-rest-3.0"; + } } diff --git a/instrumentation/opensearch/opensearch-rest-3.0/metadata.yaml b/instrumentation/opensearch/opensearch-rest-3.0/metadata.yaml new file mode 100644 index 000000000000..b7b4b2c99dab --- /dev/null +++ b/instrumentation/opensearch/opensearch-rest-3.0/metadata.yaml @@ -0,0 +1,7 @@ +description: > + This instrumentation enables database client spans and database client metrics for OpenSearch + REST clients. +library_link: https://docs.opensearch.org/latest/clients/ +semantic_conventions: + - DATABASE_CLIENT_SPANS + - DATABASE_CLIENT_METRICS diff --git a/instrumentation/opensearch/opensearch-rest-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/AbstractOpenSearchRestTest.java b/instrumentation/opensearch/opensearch-rest-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/AbstractOpenSearchRestTest.java index 1c9595e37e59..4c51f14290a3 100644 --- a/instrumentation/opensearch/opensearch-rest-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/AbstractOpenSearchRestTest.java +++ b/instrumentation/opensearch/opensearch-rest-common/testing/src/main/java/io/opentelemetry/javaagent/instrumentation/opensearch/rest/AbstractOpenSearchRestTest.java @@ -5,8 +5,11 @@ package io.opentelemetry.javaagent.instrumentation.opensearch.rest; +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.HttpAttributes.HTTP_REQUEST_METHOD; import static io.opentelemetry.semconv.HttpAttributes.HTTP_RESPONSE_STATUS_CODE; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PROTOCOL_VERSION; @@ -49,6 +52,8 @@ public abstract class AbstractOpenSearchRestTest { protected abstract int getResponseStatus(Response response); + protected abstract String getInstrumentationName(); + @BeforeAll void setUp() throws Exception { opensearch = @@ -169,4 +174,14 @@ public void onFailure(Exception e) { .hasKind(SpanKind.INTERNAL) .hasParent(trace.getSpan(0)))); } + + @Test + void shouldRecordMetrics() throws IOException { + Response response = client.performRequest(new Request("GET", "_cluster/health")); + assertThat(getResponseStatus(response)).isEqualTo(200); + + getTesting().waitForTraces(1); + + assertDurationMetric(getTesting(), getInstrumentationName(), DB_OPERATION_NAME, DB_SYSTEM_NAME); + } }