diff --git a/conventions/build.gradle.kts b/conventions/build.gradle.kts index ac00353beb07..ba60a6691918 100644 --- a/conventions/build.gradle.kts +++ b/conventions/build.gradle.kts @@ -64,7 +64,7 @@ dependencies { implementation("ru.vyarus:gradle-animalsniffer-plugin:2.0.1") implementation("org.spdx:spdx-gradle-plugin:0.9.0") // When updating, also update dependencyManagement/build.gradle.kts - implementation("net.bytebuddy:byte-buddy-gradle-plugin:1.17.5") + implementation("net.bytebuddy:byte-buddy-gradle-plugin:1.17.6") implementation("gradle.plugin.io.morethan.jmhreport:gradle-jmh-report:0.9.6") implementation("me.champeau.jmh:jmh-gradle-plugin:0.7.3") implementation("net.ltgt.gradle:gradle-errorprone-plugin:4.2.0") diff --git a/dependencyManagement/build.gradle.kts b/dependencyManagement/build.gradle.kts index aa167df071c4..8fe52719e09f 100644 --- a/dependencyManagement/build.gradle.kts +++ b/dependencyManagement/build.gradle.kts @@ -27,8 +27,8 @@ val DEPENDENCY_BOMS = listOf( // for some reason boms show up as runtime dependencies in license and vulnerability scans // even if they are only used by test dependencies, so not using junit bom since it is LGPL - "com.fasterxml.jackson:jackson-bom:2.19.0", - "com.squareup.okio:okio-bom:3.12.0", // see https://github.com/open-telemetry/opentelemetry-java/issues/5637 + "com.fasterxml.jackson:jackson-bom:2.19.1", + "com.squareup.okio:okio-bom:3.13.0", // see https://github.com/open-telemetry/opentelemetry-java/issues/5637 "com.google.guava:guava-bom:33.4.8-jre", "org.apache.groovy:groovy-bom:${groovyVersion}", "io.opentelemetry:opentelemetry-bom:${otelSdkVersion}", @@ -39,12 +39,12 @@ val DEPENDENCY_BOMS = listOf( val autoServiceVersion = "1.1.1" val autoValueVersion = "1.11.0" val errorProneVersion = "2.38.0" -val byteBuddyVersion = "1.17.5" +val byteBuddyVersion = "1.17.6" val asmVersion = "9.8" val jmhVersion = "1.37" val mockitoVersion = "4.11.0" val slf4jVersion = "2.0.17" -val semConvVersion = "1.32.0" +val semConvVersion = "1.34.0" val semConvAlphaVersion = semConvVersion.replaceFirst("(-rc.*)?$".toRegex(), "-alpha$1") val CORE_DEPENDENCIES = listOf( diff --git a/docs/contributing/writing-instrumentation-module.md b/docs/contributing/writing-instrumentation-module.md index 550fd6d69de6..3157d1a26de2 100644 --- a/docs/contributing/writing-instrumentation-module.md +++ b/docs/contributing/writing-instrumentation-module.md @@ -394,7 +394,7 @@ Due to the changes needed on most of the instrumentation modules the migration c we thus have to implement it in two steps: - `InstrumentationModule#isIndyModule` implementation return `true` (and changes needed to make it indy compatible) -- set `inlined = false` on advice methods annotated with `@Advice.OnMethodEnter` or `@Advice.OnMethodExit` +- set `inline = false` on advice methods annotated with `@Advice.OnMethodEnter` or `@Advice.OnMethodExit` The `otel.javaagent.experimental.indy` (default `false`) configuration option allows to opt-in for using "indy". When set to `true`, the `io.opentelemetry.javaagent.tooling.instrumentation.indy.AdviceTransformer` @@ -403,7 +403,7 @@ be removed once all the instrumentations are "indy native". This configuration is automatically enabled in CI with `testIndy*` checks or when the `-PtestIndy=true` parameter is added to gradle. -In order to preserve compatibility with both instrumentation strategies, we have to omit the `inlined = false` +In order to preserve compatibility with both instrumentation strategies, we have to omit the `inline = false` from the advice method annotations. We have three sets of instrumentation modules: @@ -445,12 +445,12 @@ return a value from the enter advice and get the value in the exit advice with a with `@Advice.Enter`, for example: ```java -@Advice.OnMethodEnter(suppress = Throwable.class, inlined = false) +@Advice.OnMethodEnter(suppress = Throwable.class, inline = false) public static Object onEnter(@Advice.Argument(1) Object request) { return "enterValue"; } -@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class, inlined = false) +@Advice.OnMethodExit(suppress = Throwable.class, onThrowable = Throwable.class, inline = false) public static void onExit(@Advice.Argument(1) Object request, @Advice.Enter Object enterValue) { // do something with enterValue @@ -467,7 +467,7 @@ annotated parameters, however modifying the values is done through the advice me and `@Advice.AssignReturned.ToArguments` annotation: ```java -@Advice.OnMethodEnter(suppress = Throwable.class, inlined = false) +@Advice.OnMethodEnter(suppress = Throwable.class, inline = false) @Advice.AssignReturned.ToArguments(@ToArgument(1)) public static Object onEnter(@Advice.Argument(1) Object request) { return "hello"; @@ -487,7 +487,7 @@ annotated parameter, however modifying the value is done through the advice meth and `@Advice.AssignReturned.ToReturned`. ```java -@Advice.OnMethodExit(suppress = Throwable.class, inlined = false) +@Advice.OnMethodExit(suppress = Throwable.class, inline = false) @Advice.AssignReturned.ToReturned public static Object onExit(@Advice.Return Object returnValue) { return "hello"; @@ -504,7 +504,7 @@ annotated parameter, however modifying the value is done through the advice meth and `@Advice.AssignReturned.ToFields` annotation. ```java -@Advice.OnMethodEnter(suppress = Throwable.class, inlined = false) +@Advice.OnMethodEnter(suppress = Throwable.class, inline = false) @Advice.AssignReturned.ToFields(@ToField("fieldName")) public static Object onEnter(@Advice.FieldValue("fieldName") Object originalFieldValue) { return "newFieldValue"; diff --git a/docs/instrumentation-list.yaml b/docs/instrumentation-list.yaml index 21da6cbb6646..f711f11a6f5a 100644 --- a/docs/instrumentation-list.yaml +++ b/docs/instrumentation-list.yaml @@ -54,46 +54,88 @@ libraries: - com.alibaba:druid:(,) library: - com.alibaba:druid:1.0.0 - metrics: - - name: db.client.connections.usage - description: The number of connections that are currently in state described - by the state attribute. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING - - name: state - type: STRING - - name: db.client.connections.pending_requests - description: The number of pending requests for an open connection, cumulative - for the entire pool. - type: LONG_SUM - unit: requests - attributes: - - name: pool.name - type: STRING - - name: db.client.connections.max - description: The maximum number of open connections allowed. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING - - name: db.client.connections.idle.min - description: The minimum number of idle open connections allowed. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING - - name: db.client.connections.idle.max - description: The maximum number of idle open connections allowed. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING + telemetry: + - when: default + metrics: + - name: db.client.connections.idle.max + description: The maximum number of idle open connections allowed. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.idle.min + description: The minimum number of idle open connections allowed. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.max + description: The maximum number of open connections allowed. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.pending_requests + description: The number of pending requests for an open connection, cumulative + for the entire pool. + type: LONG_SUM + unit: requests + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.usage + description: The number of connections that are currently in state described + by the state attribute. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: state + type: STRING + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.connection.count + description: The number of connections that are currently in state described + by the state attribute. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.state + type: STRING + - name: db.client.connection.idle.max + description: The maximum number of idle open connections allowed. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.idle.min + description: The minimum number of idle open connections allowed. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.max + description: The maximum number of open connections allowed. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.pending_requests + description: The number of current pending requests for an open connection. + type: LONG_SUM + unit: request + attributes: + - name: db.client.connection.pool.name + type: STRING apache: - name: apache-shenyu-2.4 source_path: instrumentation/apache-shenyu-2.4 @@ -167,22 +209,24 @@ libraries: target_versions: javaagent: - org.apache.httpcomponents.client5:httpclient5:[5.0,) - metrics: - - name: http.client.request.duration - description: Duration of HTTP client requests. - type: HISTOGRAM - unit: s - attributes: - - name: http.request.method - type: STRING - - name: http.response.status_code - type: LONG - - name: network.protocol.version - type: STRING - - name: server.address - type: STRING - - name: server.port - type: LONG + telemetry: + - when: default + metrics: + - name: http.client.request.duration + description: Duration of HTTP client requests. + type: HISTOGRAM + unit: s + attributes: + - name: http.request.method + type: STRING + - name: http.response.status_code + type: LONG + - name: network.protocol.version + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG - name: apache-dbcp-2.0 source_path: instrumentation/apache-dbcp-2.0 scope: @@ -192,38 +236,73 @@ libraries: - org.apache.commons:commons-dbcp2:[2,) library: - org.apache.commons:commons-dbcp2:2.0 - metrics: - - name: db.client.connections.usage - description: The number of connections that are currently in state described - by the state attribute. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING - - name: state - type: STRING - - name: db.client.connections.max - description: The maximum number of open connections allowed. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING - - name: db.client.connections.idle.min - description: The minimum number of idle open connections allowed. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING - - name: db.client.connections.idle.max - description: The maximum number of idle open connections allowed. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING + telemetry: + - when: default + metrics: + - name: db.client.connections.idle.max + description: The maximum number of idle open connections allowed. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.idle.min + description: The minimum number of idle open connections allowed. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.max + description: The maximum number of open connections allowed. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.usage + description: The number of connections that are currently in state described + by the state attribute. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: state + type: STRING + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.connection.count + description: The number of connections that are currently in state described + by the state attribute. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.state + type: STRING + - name: db.client.connection.idle.max + description: The maximum number of idle open connections allowed. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.idle.min + description: The minimum number of idle open connections allowed. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.max + description: The maximum number of open connections allowed. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING armeria: - name: armeria-1.3 source_path: instrumentation/armeria/armeria-1.3 @@ -405,25 +484,46 @@ libraries: - com.mchange:c3p0:(,) library: - com.mchange:c3p0:0.9.2 - metrics: - - name: db.client.connections.usage - description: The number of connections that are currently in state described - by the state attribute. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING - - name: state - type: STRING - - name: db.client.connections.pending_requests - description: The number of pending requests for an open connection, cumulative - for the entire pool. - type: LONG_SUM - unit: requests - attributes: - - name: pool.name - type: STRING + telemetry: + - when: default + metrics: + - name: db.client.connections.pending_requests + description: The number of pending requests for an open connection, cumulative + for the entire pool. + type: LONG_SUM + unit: requests + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.usage + description: The number of connections that are currently in state described + by the state attribute. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: state + type: STRING + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.connection.count + description: The number of connections that are currently in state described + by the state attribute. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.state + type: STRING + - name: db.client.connection.pending_requests + description: The number of current pending requests for an open connection. + type: LONG_SUM + unit: request + attributes: + - name: db.client.connection.pool.name + type: STRING camel: - name: camel-2.20 description: | @@ -499,6 +599,24 @@ libraries: description: Enables statement sanitization for database queries. type: boolean default: true + telemetry: + - 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.namespace + type: STRING + - name: db.operation.name + type: STRING + - name: db.system.name + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG couchbase: - name: couchbase-3.1.6 description: | @@ -808,69 +926,134 @@ libraries: - com.zaxxer:HikariCP:[3.0.0,) library: - com.zaxxer:HikariCP:3.0.0 - metrics: - - name: db.client.connections.wait_time - description: The time it took to obtain an open connection from the pool. - type: HISTOGRAM - unit: ms - attributes: - - name: pool.name - type: STRING - - name: db.client.connections.usage - description: The number of connections that are currently in state described - by the state attribute. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING - - name: state - type: STRING - - name: db.client.connections.pending_requests - description: The number of pending requests for an open connection, cumulative - for the entire pool. - type: LONG_SUM - unit: requests - attributes: - - name: pool.name - type: STRING - - name: db.client.connections.timeouts - description: The number of connection timeouts that have occurred trying to - obtain a connection from the pool. - type: LONG_SUM - unit: timeouts - attributes: - - name: pool.name - type: STRING - - name: db.client.connections.max - description: The maximum number of open connections allowed. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING - - name: db.client.connections.create_time - description: The time it took to create a new connection. - type: HISTOGRAM - unit: ms - attributes: - - name: pool.name - type: STRING - - name: db.client.connections.idle.min - description: The minimum number of idle open connections allowed. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING - - name: db.client.connections.use_time - description: The time between borrowing a connection and returning it to the - pool. - type: HISTOGRAM - unit: ms - attributes: - - name: pool.name - type: STRING + telemetry: + - when: default + metrics: + - name: db.client.connections.create_time + description: The time it took to create a new connection. + type: HISTOGRAM + unit: ms + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.idle.min + description: The minimum number of idle open connections allowed. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.max + description: The maximum number of open connections allowed. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.pending_requests + description: The number of pending requests for an open connection, cumulative + for the entire pool. + type: LONG_SUM + unit: requests + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.timeouts + description: The number of connection timeouts that have occurred trying to + obtain a connection from the pool. + type: LONG_SUM + unit: timeouts + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.usage + description: The number of connections that are currently in state described + by the state attribute. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: state + type: STRING + - name: db.client.connections.use_time + description: The time between borrowing a connection and returning it to the + pool. + type: HISTOGRAM + unit: ms + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.wait_time + description: The time it took to obtain an open connection from the pool. + type: HISTOGRAM + unit: ms + attributes: + - name: pool.name + type: STRING + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.connection.count + description: The number of connections that are currently in state described + by the state attribute. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.state + type: STRING + - name: db.client.connection.create_time + description: The time it took to create a new connection. + type: HISTOGRAM + unit: s + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.idle.min + description: The minimum number of idle open connections allowed. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.max + description: The maximum number of open connections allowed. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.pending_requests + description: The number of current pending requests for an open connection. + type: LONG_SUM + unit: request + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.timeouts + description: The number of connection timeouts that have occurred trying to + obtain a connection from the pool. + type: LONG_SUM + unit: timeout + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.use_time + description: The time between borrowing a connection and returning it to the + pool. + type: HISTOGRAM + unit: s + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.wait_time + description: The time it took to obtain an open connection from the pool. + type: HISTOGRAM + unit: s + attributes: + - name: db.client.connection.pool.name + type: STRING http: - name: http-url-connection source_path: instrumentation/http-url-connection @@ -1530,32 +1713,60 @@ libraries: library: - com.oracle.database.jdbc:ucp:11.2.0.4 - com.oracle.database.jdbc:ojdbc8:12.2.0.1 - metrics: - - name: db.client.connections.usage - description: The number of connections that are currently in state described - by the state attribute. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING - - name: state - type: STRING - - name: db.client.connections.pending_requests - description: The number of pending requests for an open connection, cumulative - for the entire pool. - type: LONG_SUM - unit: requests - attributes: - - name: pool.name - type: STRING - - name: db.client.connections.max - description: The maximum number of open connections allowed. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING + telemetry: + - when: default + metrics: + - name: db.client.connections.max + description: The maximum number of open connections allowed. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.pending_requests + description: The number of pending requests for an open connection, cumulative + for the entire pool. + type: LONG_SUM + unit: requests + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.usage + description: The number of connections that are currently in state described + by the state attribute. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: state + type: STRING + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.connection.count + description: The number of connections that are currently in state described + by the state attribute. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.state + type: STRING + - name: db.client.connection.max + description: The maximum number of open connections allowed. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.pending_requests + description: The number of current pending requests for an open connection. + type: LONG_SUM + unit: request + attributes: + - name: db.client.connection.pool.name + type: STRING oshi: - name: oshi description: When the OSHI library is detected on the classpath, this instrumentation @@ -1571,83 +1782,146 @@ libraries: - com.github.oshi:oshi-core:5.3.1 configurations: - name: otel.instrumentation.oshi.experimental-metrics.enabled - description: Enable the OSHI process metrics. + description: Enable the OSHI process runtime metrics. type: boolean default: false - metrics: - - name: system.memory.utilization - description: System memory utilization - type: DOUBLE_GAUGE - unit: '1' - attributes: - - name: state - type: STRING - - name: system.network.packets - description: System network packets - type: LONG_SUM - unit: packets - attributes: - - name: device - type: STRING - - name: direction - type: STRING - - name: system.disk.operations - description: System disk operations - type: LONG_SUM - unit: operations - attributes: - - name: device - type: STRING - - name: direction - type: STRING - - name: runtime.java.cpu_time - description: Runtime Java CPU time - type: LONG_GAUGE - unit: ms - attributes: - - name: type - type: STRING - - name: runtime.java.memory - description: Runtime Java memory - type: LONG_SUM - unit: By - attributes: - - name: type - type: STRING - - name: system.disk.io - description: System disk IO - type: LONG_SUM - unit: By - attributes: - - name: device - type: STRING - - name: direction - type: STRING - - name: system.network.io - description: System network IO - type: LONG_SUM - unit: By - attributes: - - name: device - type: STRING - - name: direction - type: STRING - - name: system.memory.usage - description: System memory usage - type: LONG_SUM - unit: By - attributes: - - name: state - type: STRING - - name: system.network.errors - description: System network errors - type: LONG_SUM - unit: errors - attributes: - - name: device - type: STRING - - name: direction - type: STRING + telemetry: + - when: default + metrics: + - name: system.disk.io + description: System disk IO + type: LONG_SUM + unit: By + attributes: + - name: device + type: STRING + - name: direction + type: STRING + - name: system.disk.operations + description: System disk operations + type: LONG_SUM + unit: operations + attributes: + - name: device + type: STRING + - name: direction + type: STRING + - name: system.memory.usage + description: System memory usage + type: LONG_SUM + unit: By + attributes: + - name: state + type: STRING + - name: system.memory.utilization + description: System memory utilization + type: DOUBLE_GAUGE + unit: '1' + attributes: + - name: state + type: STRING + - name: system.network.errors + description: System network errors + type: LONG_SUM + unit: errors + attributes: + - name: device + type: STRING + - name: direction + type: STRING + - name: system.network.io + description: System network IO + type: LONG_SUM + unit: By + attributes: + - name: device + type: STRING + - name: direction + type: STRING + - name: system.network.packets + description: System network packets + type: LONG_SUM + unit: packets + attributes: + - name: device + type: STRING + - name: direction + type: STRING + - when: otel.instrumentation.oshi.experimental-metrics.enabled=true + metrics: + - name: runtime.java.cpu_time + description: Runtime Java CPU time + type: LONG_GAUGE + unit: ms + attributes: + - name: type + type: STRING + - name: runtime.java.memory + description: Runtime Java memory + type: LONG_SUM + unit: By + attributes: + - name: type + type: STRING + - name: system.disk.io + description: System disk IO + type: LONG_SUM + unit: By + attributes: + - name: device + type: STRING + - name: direction + type: STRING + - name: system.disk.operations + description: System disk operations + type: LONG_SUM + unit: operations + attributes: + - name: device + type: STRING + - name: direction + type: STRING + - name: system.memory.usage + description: System memory usage + type: LONG_SUM + unit: By + attributes: + - name: state + type: STRING + - name: system.memory.utilization + description: System memory utilization + type: DOUBLE_GAUGE + unit: '1' + attributes: + - name: state + type: STRING + - name: system.network.errors + description: System network errors + type: LONG_SUM + unit: errors + attributes: + - name: device + type: STRING + - name: direction + type: STRING + - name: system.network.io + description: System network IO + type: LONG_SUM + unit: By + attributes: + - name: device + type: STRING + - name: direction + type: STRING + - name: system.network.packets + description: System network packets + type: LONG_SUM + unit: packets + attributes: + - name: device + type: STRING + - name: direction + type: STRING payara: - name: payara source_path: instrumentation/payara @@ -2223,46 +2497,88 @@ libraries: target_versions: javaagent: - org.apache.tomcat:tomcat-jdbc:[8.5.0,) - metrics: - - name: db.client.connections.usage - description: The number of connections that are currently in state described - by the state attribute. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING - - name: state - type: STRING - - name: db.client.connections.pending_requests - description: The number of pending requests for an open connection, cumulative - for the entire pool. - type: LONG_SUM - unit: requests - attributes: - - name: pool.name - type: STRING - - name: db.client.connections.max - description: The maximum number of open connections allowed. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING - - name: db.client.connections.idle.min - description: The minimum number of idle open connections allowed. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING - - name: db.client.connections.idle.max - description: The maximum number of idle open connections allowed. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING + telemetry: + - when: default + metrics: + - name: db.client.connections.idle.max + description: The maximum number of idle open connections allowed. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.idle.min + description: The minimum number of idle open connections allowed. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.max + description: The maximum number of open connections allowed. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.pending_requests + description: The number of pending requests for an open connection, cumulative + for the entire pool. + type: LONG_SUM + unit: requests + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.usage + description: The number of connections that are currently in state described + by the state attribute. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: state + type: STRING + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.connection.count + description: The number of connections that are currently in state described + by the state attribute. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.state + type: STRING + - name: db.client.connection.idle.max + description: The maximum number of idle open connections allowed. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.idle.min + description: The minimum number of idle open connections allowed. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.max + description: The maximum number of open connections allowed. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.pending_requests + description: The number of current pending requests for an open connection. + type: LONG_SUM + unit: request + attributes: + - name: db.client.connection.pool.name + type: STRING twilio: - name: twilio-6.6 source_path: instrumentation/twilio-6.6 @@ -2366,24 +2682,45 @@ libraries: - org.vibur:vibur-dbcp:[11.0,) library: - org.vibur:vibur-dbcp:11.0 - metrics: - - name: db.client.connections.usage - description: The number of connections that are currently in state described - by the state attribute. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING - - name: state - type: STRING - - name: db.client.connections.max - description: The maximum number of open connections allowed. - type: LONG_SUM - unit: connections - attributes: - - name: pool.name - type: STRING + telemetry: + - when: default + metrics: + - name: db.client.connections.max + description: The maximum number of open connections allowed. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: db.client.connections.usage + description: The number of connections that are currently in state described + by the state attribute. + type: LONG_SUM + unit: connections + attributes: + - name: pool.name + type: STRING + - name: state + type: STRING + - when: otel.semconv-stability.opt-in=database + metrics: + - name: db.client.connection.count + description: The number of connections that are currently in state described + by the state attribute. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING + - name: db.client.connection.state + type: STRING + - name: db.client.connection.max + description: The maximum number of open connections allowed. + type: LONG_SUM + unit: connection + attributes: + - name: db.client.connection.pool.name + type: STRING wicket: - name: wicket-8.0 source_path: instrumentation/wicket-8.0 diff --git a/examples/distro/smoke-tests/build.gradle b/examples/distro/smoke-tests/build.gradle index 61362b0334ac..eeef028acd50 100644 --- a/examples/distro/smoke-tests/build.gradle +++ b/examples/distro/smoke-tests/build.gradle @@ -4,7 +4,7 @@ plugins { dependencies { testImplementation("org.testcontainers:testcontainers:1.21.1") - testImplementation("com.fasterxml.jackson.core:jackson-databind:2.19.0") + testImplementation("com.fasterxml.jackson.core:jackson-databind:2.19.1") testImplementation("com.google.protobuf:protobuf-java-util:4.31.1") testImplementation("com.squareup.okhttp3:okhttp:4.12.0") testImplementation("io.opentelemetry.proto:opentelemetry-proto:1.7.0-alpha") diff --git a/examples/extension/build.gradle b/examples/extension/build.gradle index cd42b7f10f50..75042e022e8e 100644 --- a/examples/extension/build.gradle +++ b/examples/extension/build.gradle @@ -98,7 +98,7 @@ dependencies { //All dependencies below are only for tests testImplementation("org.testcontainers:testcontainers:1.21.1") - testImplementation("com.fasterxml.jackson.core:jackson-databind:2.19.0") + testImplementation("com.fasterxml.jackson.core:jackson-databind:2.19.1") testImplementation("com.google.protobuf:protobuf-java-util:4.31.1") testImplementation("com.squareup.okhttp3:okhttp:4.12.0") testImplementation("io.opentelemetry:opentelemetry-api") diff --git a/gradle-plugins/build.gradle.kts b/gradle-plugins/build.gradle.kts index 8d99d38492d1..fae6546d535c 100644 --- a/gradle-plugins/build.gradle.kts +++ b/gradle-plugins/build.gradle.kts @@ -25,7 +25,7 @@ configurations.named("compileOnly") { extendsFrom(bbGradlePlugin) } -val byteBuddyVersion = "1.17.5" +val byteBuddyVersion = "1.17.6" val aetherVersion = "1.1.0" dependencies { diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java index f7f2231ff1ec..5dd0b0e756f8 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractor.java @@ -6,6 +6,8 @@ package io.opentelemetry.instrumentation.api.incubator.semconv.db; import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_QUERY_TEXT; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributesBuilder; @@ -27,11 +29,7 @@ public final class DbClientAttributesExtractor // copied from DbIncubatingAttributes private static final AttributeKey DB_STATEMENT = AttributeKey.stringKey("db.statement"); - private static final AttributeKey DB_QUERY_TEXT = AttributeKey.stringKey("db.query.text"); static final AttributeKey DB_OPERATION = AttributeKey.stringKey("db.operation"); - static final AttributeKey DB_OPERATION_NAME = AttributeKey.stringKey("db.operation.name"); - static final AttributeKey DB_RESPONSE_STATUS_CODE = - AttributeKey.stringKey("db.response.status_code"); /** Creates the database client attributes extractor with default configuration. */ public static AttributesExtractor create( diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesExtractor.java index fd01cde296db..ac7e6eb01317 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientCommonAttributesExtractor.java @@ -6,6 +6,9 @@ package io.opentelemetry.instrumentation.api.incubator.semconv.db; import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet; +import static io.opentelemetry.semconv.DbAttributes.DB_NAMESPACE; +import static io.opentelemetry.semconv.DbAttributes.DB_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; import io.opentelemetry.api.common.AttributeKey; @@ -23,15 +26,10 @@ abstract class DbClientCommonAttributesExtractor< // copied from DbIncubatingAttributes private static final AttributeKey DB_NAME = AttributeKey.stringKey("db.name"); - static final AttributeKey DB_NAMESPACE = AttributeKey.stringKey("db.namespace"); static final AttributeKey DB_SYSTEM = AttributeKey.stringKey("db.system"); - public static final AttributeKey DB_SYSTEM_NAME = - AttributeKey.stringKey("db.system.name"); private static final AttributeKey DB_USER = AttributeKey.stringKey("db.user"); private static final AttributeKey DB_CONNECTION_STRING = AttributeKey.stringKey("db.connection_string"); - private static final AttributeKey DB_RESPONSE_STATUS_CODE = - AttributeKey.stringKey("db.response.status_code"); final GETTER getter; diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientMetricsAdvice.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientMetricsAdvice.java index 72f9b0a221f8..5d2b97b75574 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientMetricsAdvice.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientMetricsAdvice.java @@ -10,6 +10,7 @@ import io.opentelemetry.api.incubator.metrics.ExtendedDoubleHistogramBuilder; import io.opentelemetry.api.metrics.DoubleHistogramBuilder; +import io.opentelemetry.semconv.DbAttributes; import io.opentelemetry.semconv.ErrorAttributes; import io.opentelemetry.semconv.NetworkAttributes; import io.opentelemetry.semconv.ServerAttributes; @@ -28,11 +29,11 @@ static void applyClientDurationAdvice(DoubleHistogramBuilder builder) { ((ExtendedDoubleHistogramBuilder) builder) .setAttributesAdvice( asList( - DbClientCommonAttributesExtractor.DB_SYSTEM_NAME, - SqlClientAttributesExtractor.DB_COLLECTION_NAME, - DbClientCommonAttributesExtractor.DB_NAMESPACE, - DbClientAttributesExtractor.DB_OPERATION_NAME, - DbClientAttributesExtractor.DB_RESPONSE_STATUS_CODE, + DbAttributes.DB_SYSTEM_NAME, + DbAttributes.DB_COLLECTION_NAME, + DbAttributes.DB_NAMESPACE, + DbAttributes.DB_OPERATION_NAME, + DbAttributes.DB_RESPONSE_STATUS_CODE, ErrorAttributes.ERROR_TYPE, NetworkAttributes.NETWORK_PEER_ADDRESS, NetworkAttributes.NETWORK_PEER_PORT, diff --git a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java index ca60e051f4eb..4cb1ae7fc8cc 100644 --- a/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java +++ b/instrumentation-api-incubator/src/main/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractor.java @@ -6,6 +6,10 @@ package io.opentelemetry.instrumentation.api.incubator.semconv.db; import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet; +import static io.opentelemetry.semconv.DbAttributes.DB_COLLECTION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_BATCH_SIZE; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_QUERY_TEXT; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributesBuilder; @@ -32,14 +36,7 @@ public final class SqlClientAttributesExtractor // copied from DbIncubatingAttributes private static final AttributeKey DB_OPERATION = AttributeKey.stringKey("db.operation"); - private static final AttributeKey DB_OPERATION_NAME = - AttributeKey.stringKey("db.operation.name"); private static final AttributeKey DB_STATEMENT = AttributeKey.stringKey("db.statement"); - private static final AttributeKey DB_QUERY_TEXT = AttributeKey.stringKey("db.query.text"); - static final AttributeKey DB_COLLECTION_NAME = - AttributeKey.stringKey("db.collection.name"); - private static final AttributeKey DB_OPERATION_BATCH_SIZE = - AttributeKey.longKey("db.operation.batch.size"); private static final AttributeKeyTemplate DB_QUERY_PARAMETER = AttributeKeyTemplate.stringKeyTemplate("db.query.parameter"); diff --git a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractorTest.java b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractorTest.java index ec8e7fc373c7..eb69b77c81be 100644 --- a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractorTest.java +++ b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientAttributesExtractorTest.java @@ -13,6 +13,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.internal.SemconvStability; +import io.opentelemetry.semconv.DbAttributes; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Collections; import java.util.HashMap; @@ -85,15 +86,15 @@ void shouldExtractAllAvailableAttributes() { assertThat(startAttributes.build()) .containsOnly( entry(DbIncubatingAttributes.DB_SYSTEM, "myDb"), - entry(DbIncubatingAttributes.DB_SYSTEM_NAME, "myDb"), + entry(DbAttributes.DB_SYSTEM_NAME, "myDb"), entry(DbIncubatingAttributes.DB_USER, "username"), entry(DbIncubatingAttributes.DB_NAME, "potatoes"), entry(DbIncubatingAttributes.DB_CONNECTION_STRING, "mydb:///potatoes"), entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT * FROM potato"), entry(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - entry(DbIncubatingAttributes.DB_NAMESPACE, "potatoes"), - entry(DbIncubatingAttributes.DB_QUERY_TEXT, "SELECT * FROM potato"), - entry(DbIncubatingAttributes.DB_OPERATION_NAME, "SELECT")); + entry(DbAttributes.DB_NAMESPACE, "potatoes"), + entry(DbAttributes.DB_QUERY_TEXT, "SELECT * FROM potato"), + entry(DbAttributes.DB_OPERATION_NAME, "SELECT")); } else if (SemconvStability.emitOldDatabaseSemconv()) { assertThat(startAttributes.build()) .containsOnly( @@ -106,10 +107,10 @@ void shouldExtractAllAvailableAttributes() { } else if (SemconvStability.emitStableDatabaseSemconv()) { assertThat(startAttributes.build()) .containsOnly( - entry(DbIncubatingAttributes.DB_SYSTEM_NAME, "myDb"), - entry(DbIncubatingAttributes.DB_NAMESPACE, "potatoes"), - entry(DbIncubatingAttributes.DB_QUERY_TEXT, "SELECT * FROM potato"), - entry(DbIncubatingAttributes.DB_OPERATION_NAME, "SELECT")); + entry(DbAttributes.DB_SYSTEM_NAME, "myDb"), + entry(DbAttributes.DB_NAMESPACE, "potatoes"), + entry(DbAttributes.DB_QUERY_TEXT, "SELECT * FROM potato"), + entry(DbAttributes.DB_OPERATION_NAME, "SELECT")); } assertThat(endAttributes.build().isEmpty()).isTrue(); diff --git a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientMetricsTest.java b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientMetricsTest.java index a3769d68e07d..4c7e40e65cca 100644 --- a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientMetricsTest.java +++ b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/DbClientMetricsTest.java @@ -19,6 +19,7 @@ import io.opentelemetry.instrumentation.api.instrumenter.OperationListener; import io.opentelemetry.sdk.metrics.SdkMeterProvider; import io.opentelemetry.sdk.testing.exporter.InMemoryMetricReader; +import io.opentelemetry.semconv.DbAttributes; import io.opentelemetry.semconv.ErrorAttributes; import io.opentelemetry.semconv.NetworkAttributes; import io.opentelemetry.semconv.ServerAttributes; @@ -42,17 +43,17 @@ void collectsMetrics() { Attributes operationAttributes = Attributes.builder() - .put(DbClientCommonAttributesExtractor.DB_SYSTEM_NAME, "myDb") - .put(SqlClientAttributesExtractor.DB_COLLECTION_NAME, "table") - .put(DbClientCommonAttributesExtractor.DB_NAMESPACE, "potatoes") - .put(DbClientAttributesExtractor.DB_OPERATION_NAME, "SELECT") + .put(DbAttributes.DB_SYSTEM_NAME, "myDb") + .put(DbAttributes.DB_COLLECTION_NAME, "table") + .put(DbAttributes.DB_NAMESPACE, "potatoes") + .put(DbAttributes.DB_OPERATION_NAME, "SELECT") .put(ServerAttributes.SERVER_ADDRESS, "localhost") .put(ServerAttributes.SERVER_PORT, 1234) .build(); Attributes responseAttributes = Attributes.builder() - .put(DbClientAttributesExtractor.DB_RESPONSE_STATUS_CODE, "200") + .put(DbAttributes.DB_RESPONSE_STATUS_CODE, "200") .put(ErrorAttributes.ERROR_TYPE, "400") .put(NetworkAttributes.NETWORK_PEER_ADDRESS, "1.2.3.4") .put(NetworkAttributes.NETWORK_PEER_PORT, 8080) @@ -88,23 +89,13 @@ void collectsMetrics() { point .hasSum(0.15 /* seconds */) .hasAttributesSatisfying( - equalTo( - DbClientCommonAttributesExtractor.DB_SYSTEM_NAME, - "myDb"), - equalTo( - DbClientCommonAttributesExtractor.DB_NAMESPACE, - "potatoes"), - equalTo( - DbClientAttributesExtractor.DB_OPERATION_NAME, - "SELECT"), - equalTo( - SqlClientAttributesExtractor.DB_COLLECTION_NAME, - "table"), + equalTo(DbAttributes.DB_SYSTEM_NAME, "myDb"), + equalTo(DbAttributes.DB_NAMESPACE, "potatoes"), + equalTo(DbAttributes.DB_OPERATION_NAME, "SELECT"), + equalTo(DbAttributes.DB_COLLECTION_NAME, "table"), equalTo(ServerAttributes.SERVER_ADDRESS, "localhost"), equalTo(ServerAttributes.SERVER_PORT, 1234), - equalTo( - DbClientAttributesExtractor.DB_RESPONSE_STATUS_CODE, - "200"), + equalTo(DbAttributes.DB_RESPONSE_STATUS_CODE, "200"), equalTo(ErrorAttributes.ERROR_TYPE, "400"), equalTo( NetworkAttributes.NETWORK_PEER_ADDRESS, "1.2.3.4"), diff --git a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractorTest.java b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractorTest.java index a8ae1c806240..e5dc0307cb95 100644 --- a/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractorTest.java +++ b/instrumentation-api-incubator/src/test/java/io/opentelemetry/instrumentation/api/incubator/semconv/db/SqlClientAttributesExtractorTest.java @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.api.incubator.semconv.db; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_BATCH_SIZE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_QUERY_PARAMETER; import static java.util.Collections.emptySet; import static java.util.Collections.singleton; @@ -16,6 +17,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.internal.SemconvStability; +import io.opentelemetry.semconv.DbAttributes; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.util.Arrays; import java.util.Collection; @@ -60,7 +62,7 @@ public String getConnectionString(Map map) { @Override public Long getBatchSize(Map map) { - return read(map, "db.operation.batch.size", Long.class); + return read(map, DB_OPERATION_BATCH_SIZE.getKey(), Long.class); } @SuppressWarnings("unchecked") @@ -118,17 +120,17 @@ void shouldExtractAllAttributes() { assertThat(startAttributes.build()) .containsOnly( entry(DbIncubatingAttributes.DB_SYSTEM, "myDb"), - entry(DbIncubatingAttributes.DB_SYSTEM_NAME, "myDb"), + entry(DbAttributes.DB_SYSTEM_NAME, "myDb"), entry(DbIncubatingAttributes.DB_USER, "username"), entry(DbIncubatingAttributes.DB_NAME, "potatoes"), entry(DbIncubatingAttributes.DB_CONNECTION_STRING, "mydb:///potatoes"), entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT * FROM potato WHERE id=?"), entry(DbIncubatingAttributes.DB_OPERATION, "SELECT"), entry(DbIncubatingAttributes.DB_SQL_TABLE, "potato"), - entry(DbIncubatingAttributes.DB_NAMESPACE, "potatoes"), - entry(DbIncubatingAttributes.DB_QUERY_TEXT, "SELECT * FROM potato WHERE id=?"), - entry(DbIncubatingAttributes.DB_OPERATION_NAME, "SELECT"), - entry(DbIncubatingAttributes.DB_COLLECTION_NAME, "potato")); + entry(DbAttributes.DB_NAMESPACE, "potatoes"), + entry(DbAttributes.DB_QUERY_TEXT, "SELECT * FROM potato WHERE id=?"), + entry(DbAttributes.DB_OPERATION_NAME, "SELECT"), + entry(DbAttributes.DB_COLLECTION_NAME, "potato")); } else if (SemconvStability.emitOldDatabaseSemconv()) { assertThat(startAttributes.build()) .containsOnly( @@ -142,11 +144,11 @@ void shouldExtractAllAttributes() { } else if (SemconvStability.emitStableDatabaseSemconv()) { assertThat(startAttributes.build()) .containsOnly( - entry(DbIncubatingAttributes.DB_SYSTEM_NAME, "myDb"), - entry(DbIncubatingAttributes.DB_NAMESPACE, "potatoes"), - entry(DbIncubatingAttributes.DB_QUERY_TEXT, "SELECT * FROM potato WHERE id=?"), - entry(DbIncubatingAttributes.DB_OPERATION_NAME, "SELECT"), - entry(DbIncubatingAttributes.DB_COLLECTION_NAME, "potato")); + entry(DbAttributes.DB_SYSTEM_NAME, "myDb"), + entry(DbAttributes.DB_NAMESPACE, "potatoes"), + entry(DbAttributes.DB_QUERY_TEXT, "SELECT * FROM potato WHERE id=?"), + entry(DbAttributes.DB_OPERATION_NAME, "SELECT"), + entry(DbAttributes.DB_COLLECTION_NAME, "potato")); } assertThat(endAttributes.build().isEmpty()).isTrue(); @@ -173,8 +175,8 @@ void shouldNotExtractTableIfAttributeIsNotSet() { .containsOnly( entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT *"), entry(DbIncubatingAttributes.DB_OPERATION, "SELECT"), - entry(DbIncubatingAttributes.DB_QUERY_TEXT, "SELECT *"), - entry(DbIncubatingAttributes.DB_OPERATION_NAME, "SELECT")); + entry(DbAttributes.DB_QUERY_TEXT, "SELECT *"), + entry(DbAttributes.DB_OPERATION_NAME, "SELECT")); } else if (SemconvStability.emitOldDatabaseSemconv()) { assertThat(attributes.build()) .containsOnly( @@ -183,8 +185,8 @@ void shouldNotExtractTableIfAttributeIsNotSet() { } else if (SemconvStability.emitStableDatabaseSemconv()) { assertThat(attributes.build()) .containsOnly( - entry(DbIncubatingAttributes.DB_QUERY_TEXT, "SELECT *"), - entry(DbIncubatingAttributes.DB_OPERATION_NAME, "SELECT")); + entry(DbAttributes.DB_QUERY_TEXT, "SELECT *"), + entry(DbAttributes.DB_OPERATION_NAME, "SELECT")); } } @@ -213,9 +215,9 @@ void shouldExtractTableToSpecifiedKey() { entry(DbIncubatingAttributes.DB_STATEMENT, "SELECT * FROM table"), entry(DbIncubatingAttributes.DB_OPERATION, "SELECT"), entry(DbIncubatingAttributes.DB_CASSANDRA_TABLE, "table"), - entry(DbIncubatingAttributes.DB_QUERY_TEXT, "SELECT * FROM table"), - entry(DbIncubatingAttributes.DB_OPERATION_NAME, "SELECT"), - entry(DbIncubatingAttributes.DB_COLLECTION_NAME, "table")); + entry(DbAttributes.DB_QUERY_TEXT, "SELECT * FROM table"), + entry(DbAttributes.DB_OPERATION_NAME, "SELECT"), + entry(DbAttributes.DB_COLLECTION_NAME, "table")); } else if (SemconvStability.emitOldDatabaseSemconv()) { assertThat(attributes.build()) .containsOnly( @@ -225,9 +227,9 @@ void shouldExtractTableToSpecifiedKey() { } else if (SemconvStability.emitStableDatabaseSemconv()) { assertThat(attributes.build()) .containsOnly( - entry(DbIncubatingAttributes.DB_QUERY_TEXT, "SELECT * FROM table"), - entry(DbIncubatingAttributes.DB_OPERATION_NAME, "SELECT"), - entry(DbIncubatingAttributes.DB_COLLECTION_NAME, "table")); + entry(DbAttributes.DB_QUERY_TEXT, "SELECT * FROM table"), + entry(DbAttributes.DB_OPERATION_NAME, "SELECT"), + entry(DbAttributes.DB_COLLECTION_NAME, "table")); } } @@ -251,7 +253,7 @@ void shouldExtractSingleQueryBatchAttributes() { Map request = new HashMap<>(); request.put("db.name", "potatoes"); request.put("db.statements", singleton("INSERT INTO potato VALUES(?)")); - request.put("db.operation.batch.size", 2L); + request.put(DB_OPERATION_BATCH_SIZE.getKey(), 2L); Context context = Context.root(); @@ -273,11 +275,11 @@ void shouldExtractSingleQueryBatchAttributes() { entry(DbIncubatingAttributes.DB_STATEMENT, "INSERT INTO potato VALUES(?)"), entry(DbIncubatingAttributes.DB_OPERATION, "INSERT"), entry(DbIncubatingAttributes.DB_SQL_TABLE, "potato"), - entry(DbIncubatingAttributes.DB_NAMESPACE, "potatoes"), - entry(DbIncubatingAttributes.DB_QUERY_TEXT, "INSERT INTO potato VALUES(?)"), - entry(DbIncubatingAttributes.DB_OPERATION_NAME, "BATCH INSERT"), - entry(DbIncubatingAttributes.DB_COLLECTION_NAME, "potato"), - entry(DbIncubatingAttributes.DB_OPERATION_BATCH_SIZE, 2L)); + entry(DbAttributes.DB_NAMESPACE, "potatoes"), + entry(DbAttributes.DB_QUERY_TEXT, "INSERT INTO potato VALUES(?)"), + entry(DbAttributes.DB_OPERATION_NAME, "BATCH INSERT"), + entry(DbAttributes.DB_COLLECTION_NAME, "potato"), + entry(DB_OPERATION_BATCH_SIZE, 2L)); } else if (SemconvStability.emitOldDatabaseSemconv()) { assertThat(startAttributes.build()) .containsOnly( @@ -288,11 +290,11 @@ void shouldExtractSingleQueryBatchAttributes() { } else if (SemconvStability.emitStableDatabaseSemconv()) { assertThat(startAttributes.build()) .containsOnly( - entry(DbIncubatingAttributes.DB_NAMESPACE, "potatoes"), - entry(DbIncubatingAttributes.DB_QUERY_TEXT, "INSERT INTO potato VALUES(?)"), - entry(DbIncubatingAttributes.DB_OPERATION_NAME, "BATCH INSERT"), - entry(DbIncubatingAttributes.DB_COLLECTION_NAME, "potato"), - entry(DbIncubatingAttributes.DB_OPERATION_BATCH_SIZE, 2L)); + entry(DbAttributes.DB_NAMESPACE, "potatoes"), + entry(DbAttributes.DB_QUERY_TEXT, "INSERT INTO potato VALUES(?)"), + entry(DbAttributes.DB_OPERATION_NAME, "BATCH INSERT"), + entry(DbAttributes.DB_COLLECTION_NAME, "potato"), + entry(DB_OPERATION_BATCH_SIZE, 2L)); } assertThat(endAttributes.build().isEmpty()).isTrue(); @@ -306,7 +308,7 @@ void shouldExtractMultiQueryBatchAttributes() { request.put( "db.statements", Arrays.asList("INSERT INTO potato VALUES(1)", "INSERT INTO potato VALUES(2)")); - request.put("db.operation.batch.size", 2L); + request.put(DB_OPERATION_BATCH_SIZE.getKey(), 2L); Context context = Context.root(); @@ -325,22 +327,22 @@ void shouldExtractMultiQueryBatchAttributes() { assertThat(startAttributes.build()) .containsOnly( entry(DbIncubatingAttributes.DB_NAME, "potatoes"), - entry(DbIncubatingAttributes.DB_NAMESPACE, "potatoes"), - entry(DbIncubatingAttributes.DB_QUERY_TEXT, "INSERT INTO potato VALUES(?)"), - entry(DbIncubatingAttributes.DB_OPERATION_NAME, "BATCH INSERT"), - entry(DbIncubatingAttributes.DB_COLLECTION_NAME, "potato"), - entry(DbIncubatingAttributes.DB_OPERATION_BATCH_SIZE, 2L)); + entry(DbAttributes.DB_NAMESPACE, "potatoes"), + entry(DbAttributes.DB_QUERY_TEXT, "INSERT INTO potato VALUES(?)"), + entry(DbAttributes.DB_OPERATION_NAME, "BATCH INSERT"), + entry(DbAttributes.DB_COLLECTION_NAME, "potato"), + entry(DB_OPERATION_BATCH_SIZE, 2L)); } else if (SemconvStability.emitOldDatabaseSemconv()) { assertThat(startAttributes.build()) .containsOnly(entry(DbIncubatingAttributes.DB_NAME, "potatoes")); } else if (SemconvStability.emitStableDatabaseSemconv()) { assertThat(startAttributes.build()) .containsOnly( - entry(DbIncubatingAttributes.DB_NAMESPACE, "potatoes"), - entry(DbIncubatingAttributes.DB_QUERY_TEXT, "INSERT INTO potato VALUES(?)"), - entry(DbIncubatingAttributes.DB_OPERATION_NAME, "BATCH INSERT"), - entry(DbIncubatingAttributes.DB_COLLECTION_NAME, "potato"), - entry(DbIncubatingAttributes.DB_OPERATION_BATCH_SIZE, 2L)); + entry(DbAttributes.DB_NAMESPACE, "potatoes"), + entry(DbAttributes.DB_QUERY_TEXT, "INSERT INTO potato VALUES(?)"), + entry(DbAttributes.DB_OPERATION_NAME, "BATCH INSERT"), + entry(DbAttributes.DB_COLLECTION_NAME, "potato"), + entry(DB_OPERATION_BATCH_SIZE, 2L)); } assertThat(endAttributes.build().isEmpty()).isTrue(); @@ -352,7 +354,7 @@ void shouldIgnoreBatchSizeOne() { Map request = new HashMap<>(); request.put("db.name", "potatoes"); request.put("db.statements", singleton("INSERT INTO potato VALUES(?)")); - request.put("db.operation.batch.size", 1L); + request.put(DB_OPERATION_BATCH_SIZE.getKey(), 1L); Context context = Context.root(); @@ -374,10 +376,10 @@ void shouldIgnoreBatchSizeOne() { entry(DbIncubatingAttributes.DB_STATEMENT, "INSERT INTO potato VALUES(?)"), entry(DbIncubatingAttributes.DB_OPERATION, "INSERT"), entry(DbIncubatingAttributes.DB_SQL_TABLE, "potato"), - entry(DbIncubatingAttributes.DB_NAMESPACE, "potatoes"), - entry(DbIncubatingAttributes.DB_QUERY_TEXT, "INSERT INTO potato VALUES(?)"), - entry(DbIncubatingAttributes.DB_OPERATION_NAME, "INSERT"), - entry(DbIncubatingAttributes.DB_COLLECTION_NAME, "potato")); + entry(DbAttributes.DB_NAMESPACE, "potatoes"), + entry(DbAttributes.DB_QUERY_TEXT, "INSERT INTO potato VALUES(?)"), + entry(DbAttributes.DB_OPERATION_NAME, "INSERT"), + entry(DbAttributes.DB_COLLECTION_NAME, "potato")); } else if (SemconvStability.emitOldDatabaseSemconv()) { assertThat(startAttributes.build()) .containsOnly( @@ -388,10 +390,10 @@ void shouldIgnoreBatchSizeOne() { } else if (SemconvStability.emitStableDatabaseSemconv()) { assertThat(startAttributes.build()) .containsOnly( - entry(DbIncubatingAttributes.DB_NAMESPACE, "potatoes"), - entry(DbIncubatingAttributes.DB_QUERY_TEXT, "INSERT INTO potato VALUES(?)"), - entry(DbIncubatingAttributes.DB_OPERATION_NAME, "INSERT"), - entry(DbIncubatingAttributes.DB_COLLECTION_NAME, "potato")); + entry(DbAttributes.DB_NAMESPACE, "potatoes"), + entry(DbAttributes.DB_QUERY_TEXT, "INSERT INTO potato VALUES(?)"), + entry(DbAttributes.DB_OPERATION_NAME, "INSERT"), + entry(DbAttributes.DB_COLLECTION_NAME, "potato")); } assertThat(endAttributes.build().isEmpty()).isTrue(); @@ -445,7 +447,7 @@ void shouldNotExtractQueryParametersForBatch() { Map request = new HashMap<>(); request.put("db.name", "potatoes"); request.put("db.statements", singleton("INSERT INTO potato VALUES(?)")); - request.put("db.operation.batch.size", 2L); + request.put(DB_OPERATION_BATCH_SIZE.getKey(), 2L); request.put("db.query.parameter", Collections.singletonMap("0", "1")); Context context = Context.root(); diff --git a/instrumentation-docs/build.gradle.kts b/instrumentation-docs/build.gradle.kts index 47ae28f4f5e0..7246dae550c3 100644 --- a/instrumentation-docs/build.gradle.kts +++ b/instrumentation-docs/build.gradle.kts @@ -9,7 +9,7 @@ otelJava { dependencies { implementation("org.yaml:snakeyaml:2.4") - implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.19.0") + implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.19.1") implementation("io.opentelemetry:opentelemetry-sdk-common") testImplementation(enforcedPlatform("org.junit:junit-bom:5.13.1")) diff --git a/instrumentation-docs/collect.sh b/instrumentation-docs/collect.sh index 6d51b9fcee15..c967c09636dc 100755 --- a/instrumentation-docs/collect.sh +++ b/instrumentation-docs/collect.sh @@ -14,15 +14,25 @@ fi readonly INSTRUMENTATIONS=( # : : [ gradle-task-suffix ] + "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-5.0:javaagent:test" - "alibaba-druid-1.0:javaagent:test" "c3p0-0.9:javaagent:test" + "c3p0-0.9:javaagent:testStableSemconv" + "clickhouse-client-0.5:javaagent:test" + "clickhouse-client-0.5:javaagent:testStableSemconv" "hikaricp-3.0:javaagent:test" + "hikaricp-3.0:javaagent:testStableSemconv" "tomcat:tomcat-jdbc:javaagent:test" + "tomcat:tomcat-jdbc:javaagent:testStableSemconv" "oracle-ucp-11.2:javaagent:test" + "oracle-ucp-11.2:javaagent:testStableSemconv" "oshi:javaagent:test" + "oshi:javaagent:testExperimental" "vibur-dbcp-11.0:javaagent:test" + "vibur-dbcp-11.0:javaagent:testStableSemconv" ) readonly TELEMETRY_DIR_NAME=".telemetry" diff --git a/instrumentation-docs/readme.md b/instrumentation-docs/readme.md index 36a568ccdb5a..b7810c19492a 100644 --- a/instrumentation-docs/readme.md +++ b/instrumentation-docs/readme.md @@ -22,6 +22,35 @@ tasks { } ``` +Sometimes instrumentation will behave differently based on configuration options, and we can +differentiate between these configurations by using the `metaDataConfig` system property. When the +telemetry is written to a file, the value of this property will be included, or it will default to +a `default` attribution. + +For example, to collect and write metadata for the `otel.semconv-stability.opt-in=database` option +set for an instrumentation: + +```kotlin +val collectMetadata = findProperty("collectMetadata")?.toString() ?: "false" + +tasks { + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + + systemProperty("collectMetadata", collectMetadata) + systemProperty("metaDataConfig", "otel.semconv-stability.opt-in=database") + } + + test { + systemProperty("collectMetadata", collectMetadata) + } + + check { + dependsOn(testStableSemconv) + } +} +``` + Then, prior to running the analyzer, run the following command to generate `.telemetry` files: `./gradlew test -PcollectMetadata=true` @@ -36,8 +65,6 @@ or use the helper script that will run only the currently supported tests (recom ./instrumentation-docs/collect.sh ``` -This script will also clean up all `.telemetry` files after the analysis is done. - ## Instrumentation Hierarchy An "InstrumentationModule" represents a module that that targets specific code in a @@ -101,7 +128,8 @@ public class SpringWebInstrumentationModule extends InstrumentationModule * List of settings that are available for the instrumentation module * Each setting has a name, description, type, and default value * metrics - * List of metrics that the instrumentation module collects, including the metric name, description, type, and attributes + * List of metrics that the instrumentation module collects, including the metric name, description, type, and attributes. + * Separate lists for the metrics emitted by default vs via configuration options. ## Methodology @@ -150,3 +178,6 @@ generate the metrics section of the instrumentation-list.yaml file. The data is written into a `.telemetry` directory in the root of each instrumentation module. This data will be excluded from git and just generated on demand. + +Each file has a `when` value along with the list of metrics that indicates whether the telemetry is emitted by default or via a +configuration option. diff --git a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/InstrumentationAnalyzer.java b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/InstrumentationAnalyzer.java index 771b905d2330..074d14b1a61c 100644 --- a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/InstrumentationAnalyzer.java +++ b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/InstrumentationAnalyzer.java @@ -92,10 +92,14 @@ List analyze() throws IOException { } } - EmittedMetrics metrics = + Map metrics = MetricParser.getMetricsFromFiles(fileManager.rootDir(), module.getSrcPath()); - if (!metrics.getMetrics().isEmpty()) { - module.setMetrics(metrics.getMetrics()); + + for (Map.Entry entry : metrics.entrySet()) { + if (entry.getValue() == null || entry.getValue().getMetrics() == null) { + continue; + } + module.getMetrics().put(entry.getKey(), entry.getValue().getMetrics()); } } return modules; diff --git a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/internal/EmittedMetrics.java b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/internal/EmittedMetrics.java index 997468a245f8..c13c11247410 100644 --- a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/internal/EmittedMetrics.java +++ b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/internal/EmittedMetrics.java @@ -9,20 +9,33 @@ import java.util.List; /** - * This class is internal and is hence not for public use. Its APIs are unstable and can change at - * any time. + * Representation of metrics emitted by an instrumentation. Includes context about whether emitted + * by default or via a configuration option. This class is internal and is hence not for public use. + * Its APIs are unstable and can change at any time. */ public class EmittedMetrics { + // Condition in which the metrics are emitted (ex: default, or configuration option names). + private String when; private List metrics; public EmittedMetrics() { + this.when = ""; this.metrics = new ArrayList<>(); } - public EmittedMetrics(List metrics) { + public EmittedMetrics(String when, List metrics) { + this.when = ""; this.metrics = metrics; } + public String getWhen() { + return when; + } + + public void setWhen(String when) { + this.when = when; + } + public List getMetrics() { return metrics; } diff --git a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/internal/InstrumentationModule.java b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/internal/InstrumentationModule.java index dba4d64c9b19..437cecc52380 100644 --- a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/internal/InstrumentationModule.java +++ b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/internal/InstrumentationModule.java @@ -9,8 +9,10 @@ import com.google.errorprone.annotations.CanIgnoreReturnValue; import io.opentelemetry.sdk.common.InstrumentationScopeInfo; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import javax.annotation.Nullable; @@ -26,7 +28,7 @@ public class InstrumentationModule { private final String namespace; private final String group; private final InstrumentationScopeInfo scopeInfo; - @Nullable private List metrics; + private Map> metrics; @Nullable private Map> targetVersions; @@ -44,11 +46,11 @@ public InstrumentationModule(Builder builder) { requireNonNull(builder.namespace, "namespace required"); requireNonNull(builder.group, "group required"); + this.metrics = Objects.requireNonNullElseGet(builder.metrics, HashMap::new); this.srcPath = builder.srcPath; this.instrumentationName = builder.instrumentationName; this.namespace = builder.namespace; this.group = builder.group; - this.metrics = builder.metrics; this.metadata = builder.metadata; this.targetVersions = builder.targetVersions; this.minJavaVersion = builder.minJavaVersion; @@ -93,8 +95,7 @@ public Integer getMinJavaVersion() { return minJavaVersion; } - @Nullable - public List getMetrics() { + public Map> getMetrics() { return metrics; } @@ -110,7 +111,7 @@ public void setMinJavaVersion(Integer minJavaVersion) { this.minJavaVersion = minJavaVersion; } - public void setMetrics(List metrics) { + public void setMetrics(Map> metrics) { this.metrics = metrics; } @@ -126,7 +127,7 @@ public static class Builder { @Nullable private Integer minJavaVersion; @Nullable private InstrumentationMetaData metadata; @Nullable private Map> targetVersions; - @Nullable private List metrics; + @Nullable private Map> metrics; @CanIgnoreReturnValue public Builder srcPath(String srcPath) { @@ -171,7 +172,7 @@ public Builder targetVersions(Map> targetVersio } @CanIgnoreReturnValue - public Builder metrics(List metrics) { + public Builder metrics(Map> metrics) { this.metrics = metrics; return this; } diff --git a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/parsers/MetricParser.java b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/parsers/MetricParser.java index 32fc6cf3e09c..50ae9fd5b6c9 100644 --- a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/parsers/MetricParser.java +++ b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/parsers/MetricParser.java @@ -13,7 +13,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -30,9 +29,9 @@ public class MetricParser { * @param instrumentationDirectory the directory to traverse * @return contents of aggregated files */ - public static EmittedMetrics getMetricsFromFiles( + public static Map getMetricsFromFiles( String rootDir, String instrumentationDirectory) { - StringBuilder metricsContent = new StringBuilder("metrics:\n"); + Map metricsByWhen = new HashMap<>(); Path telemetryDir = Paths.get(rootDir + "/" + instrumentationDirectory, ".telemetry"); if (Files.exists(telemetryDir) && Files.isDirectory(telemetryDir)) { @@ -43,11 +42,17 @@ public static EmittedMetrics getMetricsFromFiles( path -> { String content = FileManager.readFileToString(path.toString()); if (content != null) { - // Skip the first line of yaml ("metrics:") so we can aggregate into one list - int firstNewline = content.indexOf('\n'); - if (firstNewline != -1) { - String contentWithoutFirstLine = content.substring(firstNewline + 1); - metricsContent.append(contentWithoutFirstLine); + String when = content.substring(0, content.indexOf('\n')); + String whenKey = when.replace("when: ", ""); + + metricsByWhen.putIfAbsent(whenKey, new StringBuilder("metrics:\n")); + + // Skip the metric label ("metrics:") so we can aggregate into one list + int metricsIndex = content.indexOf("metrics:\n"); + if (metricsIndex != -1) { + String contentAfterMetrics = + content.substring(metricsIndex + "metrics:\n".length()); + metricsByWhen.get(whenKey).append(contentAfterMetrics); } } }); @@ -56,31 +61,38 @@ public static EmittedMetrics getMetricsFromFiles( } } - return parseMetrics(metricsContent.toString()); + return parseMetrics(metricsByWhen); } /** - * Takes in a raw string representation of the aggregated EmittedMetrics yaml, deduplicates the - * metrics by name and then returns a new EmittedMetrics object. + * Takes in a raw string representation of the aggregated EmittedMetrics yaml map, separated by + * the `when`, indicating the conditions under which the metrics are emitted. deduplicates the + * metrics by name and then returns a new map EmittedMetrics objects. * * @param input raw string representation of EmittedMetrics yaml - * @return EmittedMetrics + * @return {@code Map} where the key is the `when` condition */ // visible for testing - public static EmittedMetrics parseMetrics(String input) { - EmittedMetrics metrics = YamlHelper.emittedMetricsParser(input); - if (metrics.getMetrics() == null) { - return new EmittedMetrics(Collections.emptyList()); - } + public static Map parseMetrics(Map input) { + Map metricsMap = new HashMap<>(); + for (Map.Entry entry : input.entrySet()) { + String when = entry.getKey(); + StringBuilder content = entry.getValue(); - // deduplicate metrics by name - Map deduplicatedMetrics = new HashMap<>(); - for (EmittedMetrics.Metric metric : metrics.getMetrics()) { - deduplicatedMetrics.put(metric.getName(), metric); - } + EmittedMetrics metrics = YamlHelper.emittedMetricsParser(content.toString()); + if (metrics.getMetrics() == null) { + continue; + } + + Map deduplicatedMetrics = new HashMap<>(); + for (EmittedMetrics.Metric metric : metrics.getMetrics()) { + deduplicatedMetrics.put(metric.getName(), metric); + } - List uniqueMetrics = new ArrayList<>(deduplicatedMetrics.values()); - return new EmittedMetrics(uniqueMetrics); + List uniqueMetrics = new ArrayList<>(deduplicatedMetrics.values()); + metricsMap.put(when, new EmittedMetrics(when, uniqueMetrics)); + } + return metricsMap; } private MetricParser() {} diff --git a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/utils/YamlHelper.java b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/utils/YamlHelper.java index 7832a40f2440..30743e2e2148 100644 --- a/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/utils/YamlHelper.java +++ b/instrumentation-docs/src/main/java/io/opentelemetry/instrumentation/docs/utils/YamlHelper.java @@ -16,9 +16,12 @@ import io.opentelemetry.instrumentation.docs.internal.InstrumentationModule; import java.io.BufferedWriter; import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.TreeMap; import java.util.logging.Logger; import java.util.stream.Collectors; @@ -128,11 +131,29 @@ private static Map baseProperties(InstrumentationModule module) addTargetVersions(module, moduleMap); addConfigurations(module, moduleMap); - if (module.getMetrics() != null) { - List> metricsList = getMetricsList(module); - moduleMap.put("metrics", metricsList); + // Get telemetry grouping list + Set telemetryGroups = module.getMetrics().keySet(); + + if (!telemetryGroups.isEmpty()) { + List> telemetryList = new ArrayList<>(); + for (String group : telemetryGroups) { + Map telemetryEntry = new LinkedHashMap<>(); + telemetryEntry.put("when", group); + List metrics = + new ArrayList<>(module.getMetrics().getOrDefault(group, Collections.emptyList())); + List> metricsList = new ArrayList<>(); + + // sort metrics by name for some determinism in the order + metrics.sort(Comparator.comparing(EmittedMetrics.Metric::getName)); + + for (EmittedMetrics.Metric metric : metrics) { + metricsList.add(getMetricsMap(metric)); + } + telemetryEntry.put("metrics", metricsList); + telemetryList.add(telemetryEntry); + } + moduleMap.put("telemetry", telemetryList); } - return moduleMap; } @@ -200,30 +221,22 @@ private static Map configurationToMap(ConfigurationOption config return conf; } - private static List> getMetricsList(InstrumentationModule module) { - List> metricsList = new ArrayList<>(); - if (module.getMetrics() == null) { - return metricsList; - } - - for (EmittedMetrics.Metric metric : module.getMetrics()) { - Map metricMap = new LinkedHashMap<>(); - metricMap.put("name", metric.getName()); - metricMap.put("description", metric.getDescription()); - metricMap.put("type", metric.getType()); - metricMap.put("unit", metric.getUnit()); - - List> attributes = new ArrayList<>(); - for (EmittedMetrics.Attribute attribute : metric.getAttributes()) { - Map attributeMap = new LinkedHashMap<>(); - attributeMap.put("name", attribute.getName()); - attributeMap.put("type", attribute.getType()); - attributes.add(attributeMap); - } - metricMap.put("attributes", attributes); - metricsList.add(metricMap); + private static Map getMetricsMap(EmittedMetrics.Metric metric) { + Map innerMetricMap = new LinkedHashMap<>(); + innerMetricMap.put("name", metric.getName()); + innerMetricMap.put("description", metric.getDescription()); + innerMetricMap.put("type", metric.getType()); + innerMetricMap.put("unit", metric.getUnit()); + + List> attributes = new ArrayList<>(); + for (EmittedMetrics.Attribute attribute : metric.getAttributes()) { + Map attributeMap = new LinkedHashMap<>(); + attributeMap.put("name", attribute.getName()); + attributeMap.put("type", attribute.getType()); + attributes.add(attributeMap); } - return metricsList; + innerMetricMap.put("attributes", attributes); + return innerMetricMap; } public static InstrumentationMetaData metaDataParser(String input) diff --git a/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/parsers/MetricParserTest.java b/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/parsers/MetricParserTest.java index 531d40e720fc..da068a8f5ca8 100644 --- a/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/parsers/MetricParserTest.java +++ b/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/parsers/MetricParserTest.java @@ -13,11 +13,14 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.io.TempDir; import org.mockito.MockedStatic; +@SuppressWarnings("NullAway") class MetricParserTest { @Test @@ -33,9 +36,15 @@ void parseMetricsDeduplicatesMetricsByName() { type: gauge """; - EmittedMetrics result = MetricParser.parseMetrics(input); + Map metricMap = new HashMap<>(); + metricMap.put("default", new StringBuilder(input)); + + Map result = MetricParser.parseMetrics(metricMap); List metricNames = - result.getMetrics().stream().map(EmittedMetrics.Metric::getName).sorted().toList(); + result.get("default").getMetrics().stream() + .map(EmittedMetrics.Metric::getName) + .sorted() + .toList(); assertThat(metricNames).hasSize(2); assertThat(metricNames).containsExactly("metric1", "metric2"); @@ -44,16 +53,19 @@ void parseMetricsDeduplicatesMetricsByName() { @Test void parseMetricsHandlesEmptyInput() { String input = "metrics:\n"; - EmittedMetrics result = MetricParser.parseMetrics(input); - assertThat(result.getMetrics()).isEmpty(); + Map metricMap = new HashMap<>(); + metricMap.put("default", new StringBuilder(input)); + + Map result = MetricParser.parseMetrics(metricMap); + assertThat(result).isEmpty(); } @Test void getMetricsFromFilesCombinesFilesCorrectly(@TempDir Path tempDir) throws IOException { Path telemetryDir = Files.createDirectories(tempDir.resolve(".telemetry")); - String file1Content = "metrics:\n - name: metric1\n type: counter\n"; - String file2Content = "metrics:\n - name: metric2\n type: gauge\n"; + String file1Content = "when: default\n metrics:\n - name: metric1\n type: counter\n"; + String file2Content = "when: default\n metrics:\n - name: metric2\n type: gauge\n"; Files.writeString(telemetryDir.resolve("metrics-1.yaml"), file1Content); Files.writeString(telemetryDir.resolve("metrics-2.yaml"), file2Content); @@ -71,18 +83,20 @@ void getMetricsFromFilesCombinesFilesCorrectly(@TempDir Path tempDir) throws IOE () -> FileManager.readFileToString(telemetryDir.resolve("metrics-2.yaml").toString())) .thenReturn(file2Content); - EmittedMetrics result = MetricParser.getMetricsFromFiles(tempDir.toString(), ""); + Map result = MetricParser.getMetricsFromFiles(tempDir.toString(), ""); + + EmittedMetrics metrics = result.get("default"); - assertThat(result.getMetrics()).hasSize(2); + assertThat(metrics.getMetrics()).hasSize(2); List metricNames = - result.getMetrics().stream().map(EmittedMetrics.Metric::getName).sorted().toList(); + metrics.getMetrics().stream().map(EmittedMetrics.Metric::getName).sorted().toList(); assertThat(metricNames).containsExactly("metric1", "metric2"); } } @Test void getMetricsFromFilesHandlesNonexistentDirectory() { - EmittedMetrics result = MetricParser.getMetricsFromFiles("/nonexistent", "path"); - assertThat(result.getMetrics()).isEmpty(); + Map result = MetricParser.getMetricsFromFiles("/nonexistent", "path"); + assertThat(result).isEmpty(); } } diff --git a/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/utils/YamlHelperTest.java b/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/utils/YamlHelperTest.java index 2127a0b0840a..b23467aa891e 100644 --- a/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/utils/YamlHelperTest.java +++ b/instrumentation-docs/src/test/java/io/opentelemetry/instrumentation/docs/utils/YamlHelperTest.java @@ -312,7 +312,7 @@ void testMetricsParsing() throws Exception { .namespace("mylib") .group("mylib") .targetVersions(targetVersions) - .metrics(List.of(metric)) + .metrics(Map.of("default", List.of(metric))) .build()); StringWriter stringWriter = new StringWriter(); @@ -332,22 +332,24 @@ void testMetricsParsing() throws Exception { target_versions: library: - org.apache.mylib:mylib-core:2.3.0 - metrics: - - name: db.client.operation.duration - description: Duration of database client operations. - type: HISTOGRAM - unit: s - attributes: - - name: db.namespace - type: STRING - - name: db.operation.name - type: STRING - - name: db.system.name - type: STRING - - name: server.address - type: STRING - - name: server.port - type: LONG + telemetry: + - when: default + metrics: + - name: db.client.operation.duration + description: Duration of database client operations. + type: HISTOGRAM + unit: s + attributes: + - name: db.namespace + type: STRING + - name: db.operation.name + type: STRING + - name: db.system.name + type: STRING + - name: server.address + type: STRING + - name: server.port + type: LONG """; assertThat(expectedYaml).isEqualTo(stringWriter.toString()); diff --git a/instrumentation/alibaba-druid-1.0/javaagent/build.gradle.kts b/instrumentation/alibaba-druid-1.0/javaagent/build.gradle.kts index f435d672c43e..5f3b242fb791 100644 --- a/instrumentation/alibaba-druid-1.0/javaagent/build.gradle.kts +++ b/instrumentation/alibaba-druid-1.0/javaagent/build.gradle.kts @@ -19,13 +19,18 @@ dependencies { testImplementation(project(":instrumentation:alibaba-druid-1.0:testing")) } +val collectMetadata = findProperty("collectMetadata")?.toString() ?: "false" + tasks { val testStableSemconv by registering(Test::class) { jvmArgs("-Dotel.semconv-stability.opt-in=database") + + systemProperty("collectMetadata", collectMetadata) + systemProperty("metaDataConfig", "otel.semconv-stability.opt-in=database") } test { - systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") + systemProperty("collectMetadata", collectMetadata) } check { diff --git a/instrumentation/apache-dbcp-2.0/javaagent/build.gradle.kts b/instrumentation/apache-dbcp-2.0/javaagent/build.gradle.kts index 54020d8dfded..e7c30b98ced1 100644 --- a/instrumentation/apache-dbcp-2.0/javaagent/build.gradle.kts +++ b/instrumentation/apache-dbcp-2.0/javaagent/build.gradle.kts @@ -19,13 +19,18 @@ dependencies { testImplementation(project(":instrumentation:apache-dbcp-2.0:testing")) } +val collectMetadata = findProperty("collectMetadata")?.toString() ?: "false" + tasks { val testStableSemconv by registering(Test::class) { jvmArgs("-Dotel.semconv-stability.opt-in=database") + + systemProperty("collectMetadata", collectMetadata) + systemProperty("metaDataConfig", "otel.semconv-stability.opt-in=database") } test { - systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") + systemProperty("collectMetadata", collectMetadata) } check { diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/build.gradle.kts index cfce0eafe4df..cdd8ecfe2ae4 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/build.gradle.kts @@ -41,12 +41,13 @@ dependencies { library("com.amazonaws:aws-java-sdk-core:1.11.0") - testLibrary("com.amazonaws:aws-java-sdk-s3:1.11.106") - testLibrary("com.amazonaws:aws-java-sdk-rds:1.11.106") + testLibrary("com.amazonaws:aws-java-sdk-dynamodb:1.11.106") testLibrary("com.amazonaws:aws-java-sdk-ec2:1.11.106") testLibrary("com.amazonaws:aws-java-sdk-kinesis:1.11.106") - testLibrary("com.amazonaws:aws-java-sdk-dynamodb:1.11.106") + testLibrary("com.amazonaws:aws-java-sdk-rds:1.11.106") + testLibrary("com.amazonaws:aws-java-sdk-s3:1.11.106") testLibrary("com.amazonaws:aws-java-sdk-sns:1.11.106") + testLibrary("com.amazonaws:aws-java-sdk-stepfunctions:1.11.106") testImplementation(project(":instrumentation:aws-sdk:aws-sdk-1.11:testing")) diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/StepFunctionsClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/StepFunctionsClientTest.java new file mode 100644 index 000000000000..d319845dd10d --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/awssdk/v1_11/StepFunctionsClientTest.java @@ -0,0 +1,28 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.stepfunctions.AWSStepFunctionsClientBuilder; +import io.opentelemetry.instrumentation.awssdk.v1_11.AbstractStepFunctionsClientTest; +import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class StepFunctionsClientTest extends AbstractStepFunctionsClientTest { + @RegisterExtension + static final InstrumentationExtension testing = AgentInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AWSStepFunctionsClientBuilder configureClient( + AWSStepFunctionsClientBuilder clientBuilder) { + return clientBuilder; + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-1.11/library/build.gradle.kts index 639cbd4d99a2..1c2654b32547 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/build.gradle.kts @@ -11,12 +11,13 @@ dependencies { testImplementation(project(":instrumentation:aws-sdk:aws-sdk-1.11:testing")) - testLibrary("com.amazonaws:aws-java-sdk-s3:1.11.106") - testLibrary("com.amazonaws:aws-java-sdk-rds:1.11.106") + testLibrary("com.amazonaws:aws-java-sdk-dynamodb:1.11.106") testLibrary("com.amazonaws:aws-java-sdk-ec2:1.11.106") testLibrary("com.amazonaws:aws-java-sdk-kinesis:1.11.106") - testLibrary("com.amazonaws:aws-java-sdk-dynamodb:1.11.106") + testLibrary("com.amazonaws:aws-java-sdk-rds:1.11.106") + testLibrary("com.amazonaws:aws-java-sdk-s3:1.11.106") testLibrary("com.amazonaws:aws-java-sdk-sns:1.11.106") + testLibrary("com.amazonaws:aws-java-sdk-stepfunctions:1.11.106") // last version that does not use json protocol latestDepTestLibrary("com.amazonaws:aws-java-sdk-sqs:1.12.583") // documented limitation diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkAttributesExtractor.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkAttributesExtractor.java index cb57c78b4e6d..531cbd4b82dd 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkAttributesExtractor.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AwsSdkAttributesExtractor.java @@ -16,12 +16,19 @@ import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.javaagent.tooling.muzzle.NoMuzzle; +import java.util.function.Function; import javax.annotation.Nullable; class AwsSdkAttributesExtractor implements AttributesExtractor, Response> { private static final boolean CAN_GET_RESPONSE_METADATA = canGetResponseMetadata(); private static final AttributeKey AWS_REQUEST_ID = stringKey("aws.request_id"); + // Copied from AwsIncubatingAttributes + private static final AttributeKey AWS_STEP_FUNCTIONS_ACTIVITY_ARN = + stringKey("aws.step_functions.activity.arn"); + private static final AttributeKey AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN = + stringKey("aws.step_functions.state_machine.arn"); + // AmazonWebServiceResult is only available in v1.11.33 and later private static boolean canGetResponseMetadata() { try { @@ -34,7 +41,19 @@ private static boolean canGetResponseMetadata() { } @Override - public void onStart(AttributesBuilder attributes, Context parentContext, Request request) {} + public void onStart(AttributesBuilder attributes, Context parentContext, Request request) { + Object originalRequest = request.getOriginalRequest(); + setAttribute( + attributes, + AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN, + originalRequest, + RequestAccess::getStateMachineArn); + setAttribute( + attributes, + AWS_STEP_FUNCTIONS_ACTIVITY_ARN, + originalRequest, + RequestAccess::getStepFunctionsActivityArn); + } @Override public void onEnd( @@ -43,8 +62,21 @@ public void onEnd( Request request, @Nullable Response response, @Nullable Throwable error) { - ResponseMetadata responseMetadata = getResponseMetadata(response); + if (response != null) { + Object awsResp = response.getAwsResponse(); + setAttribute( + attributes, + AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN, + awsResp, + RequestAccess::getStateMachineArn); + setAttribute( + attributes, + AWS_STEP_FUNCTIONS_ACTIVITY_ARN, + awsResp, + RequestAccess::getStepFunctionsActivityArn); + } + ResponseMetadata responseMetadata = getResponseMetadata(response); if (responseMetadata != null) { String requestId = responseMetadata.getRequestId(); if (requestId != null) { @@ -63,4 +95,15 @@ private static ResponseMetadata getResponseMetadata(Response response) { } return null; } + + public static void setAttribute( + AttributesBuilder attributes, + AttributeKey key, + Object carrier, + Function getter) { + String value = getter.apply(carrier); + if (value != null) { + attributes.put(key, value); + } + } } diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/DynamoDbAttributesExtractor.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/DynamoDbAttributesExtractor.java index 09098be32d76..e81cb5c83e3b 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/DynamoDbAttributesExtractor.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/DynamoDbAttributesExtractor.java @@ -5,6 +5,9 @@ package io.opentelemetry.instrumentation.awssdk.v1_11; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; + import com.amazonaws.Request; import com.amazonaws.Response; import io.opentelemetry.api.common.AttributeKey; @@ -21,11 +24,7 @@ class DynamoDbAttributesExtractor implements AttributesExtractor, Res // copied from DbIncubatingAttributes private static final AttributeKey DB_OPERATION = AttributeKey.stringKey("db.operation"); - private static final AttributeKey DB_OPERATION_NAME = - AttributeKey.stringKey("db.operation.name"); private static final AttributeKey DB_SYSTEM = AttributeKey.stringKey("db.system"); - private static final AttributeKey DB_SYSTEM_NAME = - AttributeKey.stringKey("db.system.name"); // copied from AwsIncubatingAttributes private static final AttributeKey> AWS_DYNAMODB_TABLE_NAMES = AttributeKey.stringArrayKey("aws.dynamodb.table_names"); diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/RequestAccess.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/RequestAccess.java index c212a696781e..8480b02de6ac 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/RequestAccess.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/RequestAccess.java @@ -11,6 +11,8 @@ import javax.annotation.Nullable; final class RequestAccess { + private static final String STEP_FUNCTIONS_REQUEST_CLASS_PREFIX = + "com.amazonaws.services.stepfunctions.model."; private static final ClassValue REQUEST_ACCESSORS = new ClassValue() { @@ -20,6 +22,24 @@ protected RequestAccess computeValue(Class type) { } }; + @Nullable + static String getStepFunctionsActivityArn(Object request) { + if (request == null) { + return null; + } + RequestAccess access = REQUEST_ACCESSORS.get(request.getClass()); + return invokeOrNull(access.getStepFunctionsActivityArn, request); + } + + @Nullable + static String getStateMachineArn(Object request) { + if (request == null) { + return null; + } + RequestAccess access = REQUEST_ACCESSORS.get(request.getClass()); + return invokeOrNull(access.getStateMachineArn, request); + } + @Nullable static String getBucketName(Object request) { RequestAccess access = REQUEST_ACCESSORS.get(request.getClass()); @@ -81,6 +101,8 @@ private static String invokeOrNull(@Nullable MethodHandle method, Object obj) { @Nullable private final MethodHandle getTableName; @Nullable private final MethodHandle getTopicArn; @Nullable private final MethodHandle getTargetArn; + @Nullable private final MethodHandle getStateMachineArn; + @Nullable private final MethodHandle getStepFunctionsActivityArn; private RequestAccess(Class clz) { getBucketName = findAccessorOrNull(clz, "getBucketName"); @@ -90,6 +112,9 @@ private RequestAccess(Class clz) { getTableName = findAccessorOrNull(clz, "getTableName"); getTopicArn = findAccessorOrNull(clz, "getTopicArn"); getTargetArn = findAccessorOrNull(clz, "getTargetArn"); + boolean isStepFunction = clz.getName().startsWith(STEP_FUNCTIONS_REQUEST_CLASS_PREFIX); + getStateMachineArn = isStepFunction ? findAccessorOrNull(clz, "getStateMachineArn") : null; + getStepFunctionsActivityArn = isStepFunction ? findAccessorOrNull(clz, "getActivityArn") : null; } @Nullable diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/StepFunctionsClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/StepFunctionsClientTest.java new file mode 100644 index 000000000000..e5444cc6ca3d --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/library/src/test/java/io/opentelemetry/instrumentation/awssdk/v1_11/StepFunctionsClientTest.java @@ -0,0 +1,31 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import com.amazonaws.services.stepfunctions.AWSStepFunctionsClientBuilder; +import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; +import io.opentelemetry.instrumentation.testing.junit.LibraryInstrumentationExtension; +import org.junit.jupiter.api.extension.RegisterExtension; + +class StepFunctionsClientTest extends AbstractStepFunctionsClientTest { + @RegisterExtension + private static final InstrumentationExtension testing = LibraryInstrumentationExtension.create(); + + @Override + protected InstrumentationExtension testing() { + return testing; + } + + @Override + public AWSStepFunctionsClientBuilder configureClient( + AWSStepFunctionsClientBuilder clientBuilder) { + return clientBuilder.withRequestHandlers( + AwsSdkTelemetry.builder(testing().getOpenTelemetry()) + .setCaptureExperimentalSpanAttributes(true) + .build() + .newRequestHandler()); + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-1.11/testing/build.gradle.kts index 1ce2bdd7981e..7a88d3ca7c63 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/testing/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/build.gradle.kts @@ -7,13 +7,14 @@ dependencies { api("com.amazonaws:aws-java-sdk-core:1.11.0") - compileOnly("com.amazonaws:aws-java-sdk-s3:1.11.106") - compileOnly("com.amazonaws:aws-java-sdk-rds:1.11.106") + compileOnly("com.amazonaws:aws-java-sdk-dynamodb:1.11.106") compileOnly("com.amazonaws:aws-java-sdk-ec2:1.11.106") compileOnly("com.amazonaws:aws-java-sdk-kinesis:1.11.106") - compileOnly("com.amazonaws:aws-java-sdk-dynamodb:1.11.106") + compileOnly("com.amazonaws:aws-java-sdk-rds:1.11.106") + compileOnly("com.amazonaws:aws-java-sdk-s3:1.11.106") compileOnly("com.amazonaws:aws-java-sdk-sns:1.11.106") compileOnly("com.amazonaws:aws-java-sdk-sqs:1.11.106") + compileOnly("com.amazonaws:aws-java-sdk-stepfunctions:1.11.106") // needed for SQS - using emq directly as localstack references emq v0.15.7 ie WITHOUT AWS trace header propagation implementation("org.elasticmq:elasticmq-rest-sqs_2.13") diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractDynamoDbClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractDynamoDbClientTest.java index 6263ed2ff89d..4296100e2eb9 100644 --- a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractDynamoDbClientTest.java +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractDynamoDbClientTest.java @@ -9,13 +9,13 @@ 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.AwsIncubatingAttributes.AWS_DYNAMODB_TABLE_NAMES; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION_NAME; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM_NAME; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DbSystemNameIncubatingValues.AWS_DYNAMODB; import static java.util.Collections.singletonList; diff --git a/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractStepFunctionsClientTest.java b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractStepFunctionsClientTest.java new file mode 100644 index 000000000000..880eeb65cc9f --- /dev/null +++ b/instrumentation/aws-sdk/aws-sdk-1.11/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v1_11/AbstractStepFunctionsClientTest.java @@ -0,0 +1,78 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.instrumentation.awssdk.v1_11; + +import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_STEP_FUNCTIONS_ACTIVITY_ARN; +import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN; +import static java.util.Collections.singletonList; + +import com.amazonaws.services.stepfunctions.AWSStepFunctions; +import com.amazonaws.services.stepfunctions.AWSStepFunctionsClientBuilder; +import com.amazonaws.services.stepfunctions.model.DescribeActivityRequest; +import com.amazonaws.services.stepfunctions.model.DescribeStateMachineRequest; +import io.opentelemetry.sdk.testing.assertj.AttributeAssertion; +import io.opentelemetry.testing.internal.armeria.common.HttpResponse; +import io.opentelemetry.testing.internal.armeria.common.HttpStatus; +import io.opentelemetry.testing.internal.armeria.common.MediaType; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Stream; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +public abstract class AbstractStepFunctionsClientTest extends AbstractBaseAwsClientTest { + + public abstract AWSStepFunctionsClientBuilder configureClient( + AWSStepFunctionsClientBuilder client); + + @Override + protected boolean hasRequestId() { + return false; + } + + @ParameterizedTest + @MethodSource("provideArguments") + public void testSendRequestWithMockedResponse( + String operation, + List additionalAttributes, + Function call) + throws Exception { + + AWSStepFunctionsClientBuilder clientBuilder = AWSStepFunctionsClientBuilder.standard(); + + AWSStepFunctions client = + configureClient(clientBuilder) + .withEndpointConfiguration(endpoint) + .withCredentials(credentialsProvider) + .build(); + + server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, "")); + + Object response = call.apply(client); + assertRequestWithMockedResponse( + response, client, "AWSStepFunctions", operation, "POST", additionalAttributes); + } + + private static Stream provideArguments() { + return Stream.of( + Arguments.of( + "DescribeStateMachine", + singletonList(equalTo(AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN, "stateMachineArn")), + (Function) + c -> + c.describeStateMachine( + new DescribeStateMachineRequest().withStateMachineArn("stateMachineArn"))), + Arguments.of( + "DescribeActivity", + singletonList(equalTo(AWS_STEP_FUNCTIONS_ACTIVITY_ARN, "activityArn")), + (Function) + c -> + c.describeActivity( + new DescribeActivityRequest().withActivityArn("activityArn")))); + } +} diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts index 9df1916a021a..7d6c76c5c8cb 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-2.2/javaagent/build.gradle.kts @@ -121,9 +121,11 @@ dependencies { testLibrary("software.amazon.awssdk:lambda:2.2.0") testLibrary("software.amazon.awssdk:rds:2.2.0") testLibrary("software.amazon.awssdk:s3:2.2.0") - testLibrary("software.amazon.awssdk:sqs:2.2.0") - testLibrary("software.amazon.awssdk:sns:2.2.0") testLibrary("software.amazon.awssdk:ses:2.2.0") + testLibrary("software.amazon.awssdk:secretsmanager:2.2.0") + testLibrary("software.amazon.awssdk:sfn:2.2.0") + testLibrary("software.amazon.awssdk:sns:2.2.0") + testLibrary("software.amazon.awssdk:sqs:2.2.0") } val latestDepTest = findProperty("testLatestDeps") as Boolean diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/build.gradle.kts index f438d3e49383..3cdb0f82abfb 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library-autoconfigure/build.gradle.kts @@ -18,8 +18,10 @@ dependencies { testLibrary("software.amazon.awssdk:lambda:2.2.0") testLibrary("software.amazon.awssdk:rds:2.2.0") testLibrary("software.amazon.awssdk:s3:2.2.0") - testLibrary("software.amazon.awssdk:sqs:2.2.0") + testLibrary("software.amazon.awssdk:secretsmanager:2.2.0") + testLibrary("software.amazon.awssdk:sfn:2.2.0") testLibrary("software.amazon.awssdk:sns:2.2.0") + testLibrary("software.amazon.awssdk:sqs:2.2.0") } tasks { diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-2.2/library/build.gradle.kts index cc196ed11e75..2fe8f5ded759 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/build.gradle.kts @@ -26,7 +26,9 @@ dependencies { testLibrary("software.amazon.awssdk:kinesis:2.2.0") testLibrary("software.amazon.awssdk:rds:2.2.0") testLibrary("software.amazon.awssdk:s3:2.2.0") + testLibrary("software.amazon.awssdk:secretsmanager:2.2.0") testLibrary("software.amazon.awssdk:ses:2.2.0") + testLibrary("software.amazon.awssdk:sfn:2.2.0") } val testLatestDeps = findProperty("testLatestDeps") as Boolean diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequest.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequest.java index 2d2745a594e7..3f7fd57bb994 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequest.java @@ -9,8 +9,10 @@ import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.DYNAMODB; import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.KINESIS; import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.S3; +import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.SECRETSMANAGER; import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.SNS; import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.SQS; +import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.AwsSdkRequestType.STEPFUNCTIONS; import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.FieldMapping.request; import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.FieldMapping.response; @@ -35,6 +37,8 @@ enum AwsSdkRequest { SnsRequest(SNS, "SnsRequest"), SqsRequest(SQS, "SqsRequest"), KinesisRequest(KINESIS, "KinesisRequest"), + SecretsManagerRequest(SECRETSMANAGER, "SecretsManagerRequest"), + StepFunctionsRequest(STEPFUNCTIONS, "SfnRequest"), // specific requests BatchGetItem( DYNAMODB, diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequestType.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequestType.java index 1e1c2c668ec3..f35b75f1bb82 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequestType.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/AwsSdkRequestType.java @@ -5,7 +5,9 @@ package io.opentelemetry.instrumentation.awssdk.v2_2.internal; +import static io.opentelemetry.api.common.AttributeKey.stringKey; import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.FieldMapping.request; +import static io.opentelemetry.instrumentation.awssdk.v2_2.internal.FieldMapping.response; import io.opentelemetry.api.common.AttributeKey; import java.util.Collections; @@ -18,12 +20,16 @@ enum AwsSdkRequestType { KINESIS(request("aws.stream.name", "StreamName")), DYNAMODB(request("aws.table.name", "TableName")), BEDROCK_RUNTIME(), + SECRETSMANAGER(response(AttributeKeys.AWS_SECRETSMANAGER_SECRET_ARN.getKey(), "ARN")), SNS( /* * Only one of TopicArn and TargetArn are permitted on an SNS request. */ request(AttributeKeys.MESSAGING_DESTINATION_NAME.getKey(), "TargetArn"), - request(AttributeKeys.MESSAGING_DESTINATION_NAME.getKey(), "TopicArn")); + request(AttributeKeys.MESSAGING_DESTINATION_NAME.getKey(), "TopicArn")), + STEPFUNCTIONS( + request(AttributeKeys.AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN.getKey(), "stateMachineArn"), + request(AttributeKeys.AWS_STEP_FUNCTIONS_ACTIVITY_ARN.getKey(), "activityArn")); // Wrapping in unmodifiableMap @SuppressWarnings("ImmutableEnumChecker") @@ -38,6 +44,14 @@ List fields(FieldMapping.Type type) { } private static class AttributeKeys { + // Copied from AwsIncubatingAttributes + static final AttributeKey AWS_SECRETSMANAGER_SECRET_ARN = + stringKey("aws.secretsmanager.secret.arn"); + static final AttributeKey AWS_STEP_FUNCTIONS_ACTIVITY_ARN = + stringKey("aws.step_functions.activity.arn"); + static final AttributeKey AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN = + stringKey("aws.step_functions.state_machine.arn"); + // copied from MessagingIncubatingAttributes static final AttributeKey MESSAGING_DESTINATION_NAME = AttributeKey.stringKey("messaging.destination.name"); diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/DynamoDbAttributesExtractor.java b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/DynamoDbAttributesExtractor.java index e4dee3f40f1f..171aa02f801b 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/DynamoDbAttributesExtractor.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/library/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/internal/DynamoDbAttributesExtractor.java @@ -5,6 +5,9 @@ package io.opentelemetry.instrumentation.awssdk.v2_2.internal; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; + import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributesBuilder; import io.opentelemetry.context.Context; @@ -19,11 +22,7 @@ class DynamoDbAttributesExtractor implements AttributesExtractor DB_OPERATION = AttributeKey.stringKey("db.operation"); - private static final AttributeKey DB_OPERATION_NAME = - AttributeKey.stringKey("db.operation.name"); private static final AttributeKey DB_SYSTEM = AttributeKey.stringKey("db.system"); - private static final AttributeKey DB_SYSTEM_NAME = - AttributeKey.stringKey("db.system.name"); // copied from DbIncubatingAttributes.DbSystemIncubatingValues private static final String DYNAMODB = "dynamodb"; diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/build.gradle.kts b/instrumentation/aws-sdk/aws-sdk-2.2/testing/build.gradle.kts index eb52ab1d1c7e..2978ece1158f 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/build.gradle.kts +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/build.gradle.kts @@ -18,9 +18,11 @@ dependencies { compileOnly("software.amazon.awssdk:lambda:2.2.0") compileOnly("software.amazon.awssdk:rds:2.2.0") compileOnly("software.amazon.awssdk:s3:2.2.0") - compileOnly("software.amazon.awssdk:sqs:2.2.0") - compileOnly("software.amazon.awssdk:sns:2.2.0") + compileOnly("software.amazon.awssdk:secretsmanager:2.2.0") compileOnly("software.amazon.awssdk:ses:2.2.0") + compileOnly("software.amazon.awssdk:sfn:2.2.0") + compileOnly("software.amazon.awssdk:sns:2.2.0") + compileOnly("software.amazon.awssdk:sqs:2.2.0") // needed for SQS - using emq directly as localstack references emq v0.15.7 ie WITHOUT AWS trace header propagation implementation("org.elasticmq:elasticmq-rest-sqs_2.13") diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java index c6cde851deb8..891188438c5b 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientCoreTest.java @@ -10,6 +10,8 @@ import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStable; import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStableDbSystemName; 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.ServerAttributes.SERVER_ADDRESS; @@ -17,9 +19,7 @@ import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_REQUEST_ID; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION_NAME; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM_NAME; import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_METHOD; import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SERVICE; import static io.opentelemetry.semconv.incubating.RpcIncubatingAttributes.RPC_SYSTEM; diff --git a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java index 8f5dfe0e665e..3def65b2b9a2 100644 --- a/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java +++ b/instrumentation/aws-sdk/aws-sdk-2.2/testing/src/main/java/io/opentelemetry/instrumentation/awssdk/v2_2/AbstractAws2ClientTest.java @@ -14,6 +14,9 @@ import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_REQUEST_ID; +import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_SECRETSMANAGER_SECRET_ARN; +import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_STEP_FUNCTIONS_ACTIVITY_ARN; +import static io.opentelemetry.semconv.incubating.AwsIncubatingAttributes.AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_DESTINATION_NAME; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_MESSAGE_ID; import static io.opentelemetry.semconv.incubating.MessagingIncubatingAttributes.MESSAGING_OPERATION; @@ -79,6 +82,18 @@ import software.amazon.awssdk.services.s3.S3ClientBuilder; import software.amazon.awssdk.services.s3.model.CreateBucketRequest; import software.amazon.awssdk.services.s3.model.GetObjectRequest; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerAsyncClient; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerAsyncClientBuilder; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClient; +import software.amazon.awssdk.services.secretsmanager.SecretsManagerClientBuilder; +import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueRequest; +import software.amazon.awssdk.services.secretsmanager.model.GetSecretValueResponse; +import software.amazon.awssdk.services.sfn.SfnAsyncClient; +import software.amazon.awssdk.services.sfn.SfnAsyncClientBuilder; +import software.amazon.awssdk.services.sfn.SfnClient; +import software.amazon.awssdk.services.sfn.SfnClientBuilder; +import software.amazon.awssdk.services.sfn.model.DescribeActivityRequest; +import software.amazon.awssdk.services.sfn.model.DescribeStateMachineRequest; import software.amazon.awssdk.services.sns.SnsAsyncClient; import software.amazon.awssdk.services.sns.SnsAsyncClientBuilder; import software.amazon.awssdk.services.sns.SnsClient; @@ -112,6 +127,18 @@ public abstract class AbstractAws2ClientTest extends AbstractAws2ClientCoreTest + " 0ac9cda2-bbf4-11d3-f92b-31fa5e8dbc99" + ""; + private static final String secretsManagerBodyContent = + "{" + + " \"ARN\": \"arn:aws:secretsmanager:us-east-1:123456789012:secret:MySecretFromCLI-sNkBwD\"," + + " \"Name\": \"MySecretFromCLI\"," + + " \"VersionId\": \"9959b95b-1234-5678-a19b-a4b0315ca5aa\"," + + " \"SecretString\": \"super-secret-value\"," + + " \"VersionStages\": [" + + " \"AWSCURRENT\"" + + " ]," + + " \"CreatedDate\": \"1.523477145713E9\"" + + "}"; + private static void assumeSupportedConfig(String operation) { Assumptions.assumeFalse( operation.equals("SendMessage") && isSqsAttributeInjectionEnabled(), @@ -214,6 +241,21 @@ private void clientAssertions( equalTo(MESSAGING_SYSTEM, AWS_SQS)))); } + if (service.equals("Sfn")) { + if (operation.equals("DescribeStateMachine")) { + attributes.add(equalTo(AWS_STEP_FUNCTIONS_STATE_MACHINE_ARN, "state:machine:arn:foo")); + } else if (operation.equals("DescribeActivity")) { + attributes.add(equalTo(AWS_STEP_FUNCTIONS_ACTIVITY_ARN, "activity:arn:foo")); + } + } + + if (service.equals("SecretsManager")) { + attributes.add( + equalTo( + AWS_SECRETSMANAGER_SECRET_ARN, + "arn:aws:secretsmanager:us-east-1:123456789012:secret:MySecretFromCLI-sNkBwD")); + } + String evaluatedOperation; SpanKind operationKind; if (operation.equals("SendMessage")) { @@ -722,4 +764,124 @@ void testS3ListNullBucket() { assertThat(Context.current()).isEqualTo(Context.root()); } + + private static Stream provideStepFunctionsArguments() { + return Stream.of( + Arguments.of( + (Function) + c -> + c.describeStateMachine( + DescribeStateMachineRequest.builder() + .stateMachineArn("state:machine:arn:foo") + .build()), + "DescribeStateMachine", + "POST", + "UNKNOWN"), + Arguments.of( + (Function) + c -> + c.describeActivity( + DescribeActivityRequest.builder().activityArn("activity:arn:foo").build()), + "DescribeActivity", + "POST", + "UNKNOWN")); + } + + @ParameterizedTest + @MethodSource("provideStepFunctionsArguments") + void testSfnSendOperationRequestWithBuilder( + Function call, String operation, String method, String requestId) { + SfnClientBuilder builder = SfnClient.builder(); + configureSdkClient(builder); + SfnClient client = + builder + .endpointOverride(clientUri) + .region(Region.AP_NORTHEAST_1) + .credentialsProvider(CREDENTIALS_PROVIDER) + .build(); + + server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, "")); + Object response = call.apply(client); + assertThat(response.getClass().getSimpleName()) + .satisfiesAnyOf( + v -> + assertThat(response) + .isInstanceOf( + software.amazon.awssdk.services.sfn.model.DescribeActivityResponse.class), + v -> + assertThat(response) + .isInstanceOf( + software.amazon.awssdk.services.sfn.model.DescribeStateMachineResponse + .class)); + clientAssertions("Sfn", operation, method, response, requestId); + } + + @ParameterizedTest + @MethodSource("provideStepFunctionsArguments") + void testSfnAsyncSendOperationRequestWithBuilder( + Function call, String operation, String method, String requestId) { + SfnAsyncClientBuilder builder = SfnAsyncClient.builder(); + configureSdkClient(builder); + SfnAsyncClient client = + builder + .endpointOverride(clientUri) + .region(Region.AP_NORTHEAST_1) + .credentialsProvider(CREDENTIALS_PROVIDER) + .build(); + + server.enqueue(HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, "")); + Object response = call.apply(wrapClient(SfnClient.class, SfnAsyncClient.class, client)); + assertThat(response.getClass().getSimpleName()) + .satisfiesAnyOf( + v -> + assertThat(response) + .isInstanceOf( + software.amazon.awssdk.services.sfn.model.DescribeActivityResponse.class), + v -> + assertThat(response) + .isInstanceOf( + software.amazon.awssdk.services.sfn.model.DescribeStateMachineResponse + .class)); + clientAssertions("Sfn", operation, method, response, requestId); + } + + @Test + void testSecretsManagerSendOperationRequestWithBuilder() { + SecretsManagerClientBuilder builder = SecretsManagerClient.builder(); + configureSdkClient(builder); + SecretsManagerClient client = + builder + .endpointOverride(clientUri) + .region(Region.AP_NORTHEAST_1) + .credentialsProvider(CREDENTIALS_PROVIDER) + .build(); + + server.enqueue( + HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, secretsManagerBodyContent)); + Object response = + client.getSecretValue(GetSecretValueRequest.builder().secretId("MySecretFromCLI").build()); + assertThat(response.getClass().getSimpleName()) + .satisfies( + v -> assertThat(v).isEqualTo("GetSecretValueResponse"), + v -> assertThat(response).isInstanceOf(GetSecretValueResponse.class)); + clientAssertions("SecretsManager", "GetSecretValue", "POST", response, "UNKNOWN"); + } + + @Test + void testSecretsManagerAsyncSendOperationRequestWithBuilder() { + SecretsManagerAsyncClientBuilder builder = SecretsManagerAsyncClient.builder(); + configureSdkClient(builder); + SecretsManagerAsyncClient client = + builder + .endpointOverride(clientUri) + .region(Region.AP_NORTHEAST_1) + .credentialsProvider(CREDENTIALS_PROVIDER) + .build(); + + server.enqueue( + HttpResponse.of(HttpStatus.OK, MediaType.PLAIN_TEXT_UTF_8, secretsManagerBodyContent)); + Object response = + client.getSecretValue(GetSecretValueRequest.builder().secretId("MySecretFromCLI").build()); + clientAssertions("SecretsManager", "GetSecretValue", "POST", response, "UNKNOWN"); + } } diff --git a/instrumentation/c3p0-0.9/javaagent/build.gradle.kts b/instrumentation/c3p0-0.9/javaagent/build.gradle.kts index 483910939081..c90aaa3e5cb2 100644 --- a/instrumentation/c3p0-0.9/javaagent/build.gradle.kts +++ b/instrumentation/c3p0-0.9/javaagent/build.gradle.kts @@ -21,13 +21,18 @@ dependencies { testImplementation(project(":instrumentation:c3p0-0.9:testing")) } +val collectMetadata = findProperty("collectMetadata")?.toString() ?: "false" + tasks { val testStableSemconv by registering(Test::class) { jvmArgs("-Dotel.semconv-stability.opt-in=database") + + systemProperty("collectMetadata", collectMetadata) + systemProperty("metaDataConfig", "otel.semconv-stability.opt-in=database") } test { - systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") + systemProperty("collectMetadata", collectMetadata) } check { diff --git a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java index 421800519c8f..5146ef2d30a8 100644 --- a/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java +++ b/instrumentation/camel-2.20/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/apachecamel/decorators/DbSpanDecorator.java @@ -28,6 +28,7 @@ import io.opentelemetry.instrumentation.api.internal.SemconvStability; import io.opentelemetry.javaagent.bootstrap.internal.AgentCommonConfig; import io.opentelemetry.javaagent.instrumentation.apachecamel.CamelDirection; +import io.opentelemetry.semconv.DbAttributes; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import java.net.URI; import java.util.Map; @@ -125,7 +126,7 @@ public void pre( super.pre(attributes, exchange, endpoint, camelDirection); if (SemconvStability.emitStableDatabaseSemconv()) { - attributes.put(DbIncubatingAttributes.DB_SYSTEM_NAME, system); + attributes.put(DbAttributes.DB_SYSTEM_NAME, system); } if (SemconvStability.emitOldDatabaseSemconv()) { attributes.put(DbIncubatingAttributes.DB_SYSTEM, system); @@ -133,7 +134,7 @@ public void pre( String statement = getStatement(exchange, endpoint); if (statement != null) { if (SemconvStability.emitStableDatabaseSemconv()) { - attributes.put(DbIncubatingAttributes.DB_QUERY_TEXT, statement); + attributes.put(DbAttributes.DB_QUERY_TEXT, statement); } if (SemconvStability.emitOldDatabaseSemconv()) { attributes.put(DbIncubatingAttributes.DB_STATEMENT, statement); @@ -142,7 +143,7 @@ public void pre( String dbName = getDbName(endpoint); if (dbName != null) { if (SemconvStability.emitStableDatabaseSemconv()) { - attributes.put(DbIncubatingAttributes.DB_NAMESPACE, dbName); + attributes.put(DbAttributes.DB_NAMESPACE, dbName); } if (SemconvStability.emitOldDatabaseSemconv()) { attributes.put(DbIncubatingAttributes.DB_NAME, dbName); diff --git a/instrumentation/clickhouse-client-0.5/javaagent/build.gradle.kts b/instrumentation/clickhouse-client-0.5/javaagent/build.gradle.kts index 7628d2d0a4e7..fc5d940a534e 100644 --- a/instrumentation/clickhouse-client-0.5/javaagent/build.gradle.kts +++ b/instrumentation/clickhouse-client-0.5/javaagent/build.gradle.kts @@ -22,13 +22,18 @@ dependencies { testLibrary("org.apache.httpcomponents.client5:httpclient5:5.2.3") } +val collectMetadata = findProperty("collectMetadata")?.toString() ?: "false" + tasks { test { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + systemProperty("collectMetadata", collectMetadata) } val testStableSemconv by registering(Test::class) { jvmArgs("-Dotel.semconv-stability.opt-in=database") + systemProperty("collectMetadata", collectMetadata) + systemProperty("metaDataConfig", "otel.semconv-stability.opt-in=database") } check { diff --git a/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java b/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java index 6df88cf73d60..b63258b596f4 100644 --- a/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java +++ b/instrumentation/clickhouse-client-0.5/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/clickhouse/ClickHouseClientTest.java @@ -5,14 +5,18 @@ package io.opentelemetry.javaagent.instrumentation.clickhouse; +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_NAMESPACE; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_RESPONSE_STATUS_CODE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; import static java.util.Arrays.asList; @@ -115,6 +119,15 @@ void testConnectionStringWithoutDatabaseSpecifiedStillGeneratesSpans() .hasNoParent() .hasAttributesSatisfyingExactly( attributeAssertions("select * from " + tableName, "SELECT")))); + + assertDurationMetric( + testing, + "io.opentelemetry.clickhouse-client-0.5", + DB_SYSTEM_NAME, + DB_OPERATION_NAME, + DB_NAMESPACE, + SERVER_ADDRESS, + SERVER_PORT); } @Test diff --git a/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent-unit-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchEndpointMapTest.java b/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent-unit-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchEndpointMapTest.java index f17bfa2e59e4..8fd7cabd0dd0 100644 --- a/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent-unit-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchEndpointMapTest.java +++ b/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent-unit-tests/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/ElasticsearchEndpointMapTest.java @@ -5,7 +5,7 @@ package io.opentelemetry.javaagent.instrumentation.elasticsearch.rest; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.instrumentation.elasticsearch.rest.common.v5_0.internal.ElasticsearchEndpointDefinition; import io.opentelemetry.javaagent.instrumentation.elasticsearch.apiclient.ElasticsearchEndpointMap; @@ -20,7 +20,7 @@ import java.util.stream.Collectors; import org.junit.jupiter.api.Test; -public class ElasticsearchEndpointMapTest { +class ElasticsearchEndpointMapTest { private static final Set SEARCH_ENDPOINTS = new HashSet<>( @@ -57,16 +57,17 @@ private static List getPathParts(String route) { } @Test - public void testIsSearchEndpoint() { + void testIsSearchEndpoint() { for (ElasticsearchEndpointDefinition esEndpointDefinition : ElasticsearchEndpointMap.getAllEndpoints()) { String endpointId = esEndpointDefinition.getEndpointName(); - assertEquals(SEARCH_ENDPOINTS.contains(endpointId), esEndpointDefinition.isSearchEndpoint()); + assertThat(SEARCH_ENDPOINTS.contains(endpointId)) + .isEqualTo(esEndpointDefinition.isSearchEndpoint()); } } @Test - public void testProcessPathParts() { + void testProcessPathParts() { for (ElasticsearchEndpointDefinition esEndpointDefinition : ElasticsearchEndpointMap.getAllEndpoints()) { for (String route : @@ -81,44 +82,45 @@ public void testProcessPathParts() { Map expectedMap = new HashMap<>(); pathParts.forEach(part -> expectedMap.put(part, part)); - assertEquals(expectedMap, observedParams); + assertThat(expectedMap).isEqualTo(observedParams); } } } @Test - public void testSearchEndpoint() { + void testSearchEndpoint() { ElasticsearchEndpointDefinition esEndpoint = ElasticsearchEndpointMap.get("search"); Map observedParams = new HashMap<>(); esEndpoint.processPathParts( "/test-index-1,test-index-2/_search", (k, v) -> observedParams.put(k, v)); - assertEquals("test-index-1,test-index-2", observedParams.get("index")); + assertThat(observedParams.get("index")).isEqualTo("test-index-1,test-index-2"); } @Test - public void testBuildRegexPattern() { + void testBuildRegexPattern() { Pattern pattern = ElasticsearchEndpointDefinition.EndpointPattern.buildRegexPattern( "/_nodes/{node_id}/shutdown"); - assertEquals("^/_nodes/(?[^/]+)/shutdown$", pattern.pattern()); + assertThat(pattern.pattern()).isEqualTo("^/_nodes/(?[^/]+)/shutdown$"); pattern = ElasticsearchEndpointDefinition.EndpointPattern.buildRegexPattern( "/_snapshot/{repository}/{snapshot}/_mount"); - assertEquals("^/_snapshot/(?[^/]+)/(?[^/]+)/_mount$", pattern.pattern()); + assertThat(pattern.pattern()) + .isEqualTo("^/_snapshot/(?[^/]+)/(?[^/]+)/_mount$"); pattern = ElasticsearchEndpointDefinition.EndpointPattern.buildRegexPattern( "/_security/profile/_suggest"); - assertEquals("^/_security/profile/_suggest$", pattern.pattern()); + assertThat(pattern.pattern()).isEqualTo("^/_security/profile/_suggest$"); pattern = ElasticsearchEndpointDefinition.EndpointPattern.buildRegexPattern( "/_application/search_application/{name}"); - assertEquals("^/_application/search_application/(?[^/]+)$", pattern.pattern()); + assertThat(pattern.pattern()).isEqualTo("^/_application/search_application/(?[^/]+)$"); pattern = ElasticsearchEndpointDefinition.EndpointPattern.buildRegexPattern("/"); - assertEquals("^/$", pattern.pattern()); + assertThat(pattern.pattern()).isEqualTo("^/$"); } } diff --git a/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/apiclient/ElasticsearchClientTest.java b/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/apiclient/ElasticsearchClientTest.java index 5fa146a023e1..538c3a039305 100644 --- a/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/apiclient/ElasticsearchClientTest.java +++ b/instrumentation/elasticsearch/elasticsearch-api-client-7.16/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/apiclient/ElasticsearchClientTest.java @@ -17,6 +17,7 @@ import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_ELASTICSEARCH_PATH_PARTS; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static org.assertj.core.api.Assertions.assertThat; import co.elastic.clients.elasticsearch.ElasticsearchAsyncClient; import co.elastic.clients.elasticsearch.ElasticsearchClient; @@ -33,7 +34,6 @@ import org.apache.http.HttpHost; import org.elasticsearch.client.RestClient; import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -82,9 +82,9 @@ static void cleanUp() { } @Test - public void elasticsearchStatus() throws IOException { + void elasticsearchStatus() throws IOException { InfoResponse response = client.info(); - Assertions.assertEquals(response.version().number(), "7.17.2"); + assertThat(response.version().number()).isEqualTo("7.17.2"); testing.waitAndAssertTraces( trace -> @@ -114,7 +114,7 @@ public void elasticsearchStatus() throws IOException { } @Test - public void elasticsearchIndex() throws IOException { + void elasticsearchIndex() throws IOException { client.index( r -> r.id("test-id") @@ -157,7 +157,7 @@ public void elasticsearchIndex() throws IOException { } @Test - public void elasticsearchStatusAsync() throws Exception { + void elasticsearchStatusAsync() throws Exception { CountDownLatch countDownLatch = new CountDownLatch(1); AsyncRequest request = new AsyncRequest(); @@ -177,7 +177,7 @@ public void elasticsearchStatusAsync() throws Exception { //noinspection ResultOfMethodCallIgnored countDownLatch.await(10, TimeUnit.SECONDS); - Assertions.assertEquals(request.getResponse().version().number(), "7.17.2"); + assertThat(request.getResponse().version().number()).isEqualTo("7.17.2"); testing.waitAndAssertTraces( trace -> diff --git a/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/ElasticsearchRest5Test.java b/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/ElasticsearchRest5Test.java index 72dd9bfc4322..fc0b9313f7b6 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/ElasticsearchRest5Test.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v5_0/ElasticsearchRest5Test.java @@ -14,6 +14,7 @@ import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static org.assertj.core.api.Assertions.assertThat; import com.fasterxml.jackson.databind.ObjectMapper; import io.opentelemetry.api.trace.SpanKind; @@ -27,7 +28,6 @@ import org.elasticsearch.client.ResponseListener; import org.elasticsearch.client.RestClient; import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -89,36 +89,32 @@ void elasticsearchStatus() throws IOException { Map result = objectMapper.readValue(response.getEntity().getContent(), Map.class); // usually this test reports green status, but sometimes it is yellow - Assertions.assertTrue( - "green".equals(result.get("status")) || "yellow".equals(result.get("status"))); + assertThat(result.get("status")).isIn("green", "yellow"); testing.waitAndAssertTraces( - trace -> { - trace.hasSpansSatisfyingExactly( - span -> { - span.hasName("GET") - .hasKind(SpanKind.CLIENT) - .hasNoParent() - .hasAttributesSatisfyingExactly( - equalTo(maybeStable(DB_SYSTEM), "elasticsearch"), - equalTo(HTTP_REQUEST_METHOD, "GET"), - equalTo(SERVER_ADDRESS, httpHost.getHostName()), - equalTo(SERVER_PORT, httpHost.getPort()), - equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")); - }, - span -> { - span.hasName("GET") - .hasKind(SpanKind.CLIENT) - .hasParent(trace.getSpan(0)) - .hasAttributesSatisfyingExactly( - equalTo(SERVER_ADDRESS, httpHost.getHostName()), - equalTo(SERVER_PORT, httpHost.getPort()), - equalTo(HTTP_REQUEST_METHOD, "GET"), - equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), - equalTo(HTTP_RESPONSE_STATUS_CODE, 200)); - }); - }); + trace -> + trace.hasSpansSatisfyingExactly( + span -> + span.hasName("GET") + .hasKind(SpanKind.CLIENT) + .hasNoParent() + .hasAttributesSatisfyingExactly( + equalTo(maybeStable(DB_SYSTEM), "elasticsearch"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")), + span -> + span.hasName("GET") + .hasKind(SpanKind.CLIENT) + .hasParent(trace.getSpan(0)) + .hasAttributesSatisfyingExactly( + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200)))); } @Test @@ -151,10 +147,7 @@ public void onFailure(Exception e) { }; testing.runWithSpan( - "parent", - () -> { - client.performRequestAsync("GET", "_cluster/health", responseListener); - }); + "parent", () -> client.performRequestAsync("GET", "_cluster/health", responseListener)); countDownLatch.await(); if (exception[0] != null) { throw exception[0]; @@ -162,41 +155,36 @@ public void onFailure(Exception e) { Map result = objectMapper.readValue(requestResponse[0].getEntity().getContent(), Map.class); // usually this test reports green status, but sometimes it is yellow - Assertions.assertTrue( - "green".equals(result.get("status")) || "yellow".equals(result.get("status"))); + assertThat(result.get("status")).isIn("green", "yellow"); testing.waitAndAssertTraces( - trace -> { - trace.hasSpansSatisfyingExactly( - span -> { - span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(); - }, - span -> { - span.hasName("GET") - .hasKind(SpanKind.CLIENT) - .hasParent(trace.getSpan(0)) - .hasAttributesSatisfyingExactly( - equalTo(maybeStable(DB_SYSTEM), "elasticsearch"), - equalTo(HTTP_REQUEST_METHOD, "GET"), - equalTo(SERVER_ADDRESS, httpHost.getHostName()), - equalTo(SERVER_PORT, httpHost.getPort()), - equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")); - }, - span -> { - span.hasName("GET") - .hasKind(SpanKind.CLIENT) - .hasParent(trace.getSpan(1)) - .hasAttributesSatisfyingExactly( - equalTo(SERVER_ADDRESS, httpHost.getHostName()), - equalTo(SERVER_PORT, httpHost.getPort()), - equalTo(HTTP_REQUEST_METHOD, "GET"), - equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), - equalTo(HTTP_RESPONSE_STATUS_CODE, 200)); - }, - span -> { - span.hasName("callback").hasKind(SpanKind.INTERNAL).hasParent(trace.getSpan(0)); - }); - }); + trace -> + trace.hasSpansSatisfyingExactly( + span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), + span -> + span.hasName("GET") + .hasKind(SpanKind.CLIENT) + .hasParent(trace.getSpan(0)) + .hasAttributesSatisfyingExactly( + equalTo(maybeStable(DB_SYSTEM), "elasticsearch"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")), + span -> + span.hasName("GET") + .hasKind(SpanKind.CLIENT) + .hasParent(trace.getSpan(1)) + .hasAttributesSatisfyingExactly( + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200)), + span -> + span.hasName("callback") + .hasKind(SpanKind.INTERNAL) + .hasParent(trace.getSpan(0)))); } } diff --git a/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/ElasticsearchRest6Test.java b/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/ElasticsearchRest6Test.java index fe0c402b1246..f9c4f8291323 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/ElasticsearchRest6Test.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-6.4/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v6_4/ElasticsearchRest6Test.java @@ -14,6 +14,7 @@ import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static org.assertj.core.api.Assertions.assertThat; import com.fasterxml.jackson.databind.ObjectMapper; import io.opentelemetry.api.trace.SpanKind; @@ -27,7 +28,6 @@ import org.elasticsearch.client.ResponseListener; import org.elasticsearch.client.RestClient; import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -75,46 +75,43 @@ static void cleanUp() { @Test @SuppressWarnings({"deprecation", "rawtypes"}) // ignore deprecation interface - public void elasticsearchStatus() throws IOException { - + void elasticsearchStatus() throws IOException { Response response = client.performRequest("GET", "_cluster/health"); Map result = objectMapper.readValue(response.getEntity().getContent(), Map.class); - Assertions.assertEquals(result.get("status"), "green"); + assertThat(result.get("status")).isEqualTo("green"); testing.waitAndAssertTraces( trace -> { trace.hasSpansSatisfyingExactly( - span -> { - span.hasName("GET") - .hasKind(SpanKind.CLIENT) - .hasNoParent() - .hasAttributesSatisfyingExactly( - equalTo(maybeStable(DB_SYSTEM), "elasticsearch"), - equalTo(HTTP_REQUEST_METHOD, "GET"), - equalTo(SERVER_ADDRESS, httpHost.getHostName()), - equalTo(SERVER_PORT, httpHost.getPort()), - equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")); - }, - span -> { - span.hasName("GET") - .hasKind(SpanKind.CLIENT) - .hasParent(trace.getSpan(0)) - .hasAttributesSatisfyingExactly( - equalTo(SERVER_ADDRESS, httpHost.getHostName()), - equalTo(SERVER_PORT, httpHost.getPort()), - equalTo(HTTP_REQUEST_METHOD, "GET"), - equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), - equalTo(HTTP_RESPONSE_STATUS_CODE, 200L)); - }); + span -> + span.hasName("GET") + .hasKind(SpanKind.CLIENT) + .hasNoParent() + .hasAttributesSatisfyingExactly( + equalTo(maybeStable(DB_SYSTEM), "elasticsearch"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")), + span -> + span.hasName("GET") + .hasKind(SpanKind.CLIENT) + .hasParent(trace.getSpan(0)) + .hasAttributesSatisfyingExactly( + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200L))); }); } @Test @SuppressWarnings({"deprecation", "rawtypes"}) // ignore deprecation interface - public void elasticsearchStatusAsync() throws Exception { + void elasticsearchStatusAsync() throws Exception { Response[] requestResponse = {null}; Exception[] exception = {null}; CountDownLatch countDownLatch = new CountDownLatch(1); @@ -152,40 +149,36 @@ public void onFailure(Exception e) { } Map result = objectMapper.readValue(requestResponse[0].getEntity().getContent(), Map.class); - Assertions.assertEquals(result.get("status"), "green"); + assertThat(result.get("status")).isEqualTo("green"); testing.waitAndAssertTraces( - trace -> { - trace.hasSpansSatisfyingExactly( - span -> { - span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(); - }, - span -> { - span.hasName("GET") - .hasKind(SpanKind.CLIENT) - .hasParent(trace.getSpan(0)) - .hasAttributesSatisfyingExactly( - equalTo(maybeStable(DB_SYSTEM), "elasticsearch"), - equalTo(HTTP_REQUEST_METHOD, "GET"), - equalTo(SERVER_ADDRESS, httpHost.getHostName()), - equalTo(SERVER_PORT, httpHost.getPort()), - equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")); - }, - span -> { - span.hasName("GET") - .hasKind(SpanKind.CLIENT) - .hasParent(trace.getSpan(1)) - .hasAttributesSatisfyingExactly( - equalTo(SERVER_ADDRESS, httpHost.getHostName()), - equalTo(SERVER_PORT, httpHost.getPort()), - equalTo(HTTP_REQUEST_METHOD, "GET"), - equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), - equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), - equalTo(HTTP_RESPONSE_STATUS_CODE, 200)); - }, - span -> { - span.hasName("callback").hasKind(SpanKind.INTERNAL).hasParent(trace.getSpan(0)); - }); - }); + trace -> + trace.hasSpansSatisfyingExactly( + span -> span.hasName("parent").hasKind(SpanKind.INTERNAL).hasNoParent(), + span -> + span.hasName("GET") + .hasKind(SpanKind.CLIENT) + .hasParent(trace.getSpan(0)) + .hasAttributesSatisfyingExactly( + equalTo(maybeStable(DB_SYSTEM), "elasticsearch"), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health")), + span -> + span.hasName("GET") + .hasKind(SpanKind.CLIENT) + .hasParent(trace.getSpan(1)) + .hasAttributesSatisfyingExactly( + equalTo(SERVER_ADDRESS, httpHost.getHostName()), + equalTo(SERVER_PORT, httpHost.getPort()), + equalTo(HTTP_REQUEST_METHOD, "GET"), + equalTo(NETWORK_PROTOCOL_VERSION, "1.1"), + equalTo(URL_FULL, httpHost.toURI() + "/_cluster/health"), + equalTo(HTTP_RESPONSE_STATUS_CODE, 200)), + span -> + span.hasName("callback") + .hasKind(SpanKind.INTERNAL) + .hasParent(trace.getSpan(0)))); } } diff --git a/instrumentation/elasticsearch/elasticsearch-rest-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java b/instrumentation/elasticsearch/elasticsearch-rest-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java index e4f7ee05db09..44d9f5bff583 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-7.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java @@ -15,6 +15,7 @@ import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.AgentInstrumentationExtension; @@ -28,7 +29,6 @@ import org.elasticsearch.client.ResponseListener; import org.elasticsearch.client.RestClient; import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -76,10 +76,11 @@ static void cleanUp() { } @Test - public void elasticsearchStatus() throws Exception { + void elasticsearchStatus() throws Exception { Response response = client.performRequest(new Request("GET", "_cluster/health")); Map result = objectMapper.readValue(response.getEntity().getContent(), Map.class); - Assertions.assertEquals(result.get("status"), "green"); + + assertThat(result.get("status")).isEqualTo("green"); testing.waitAndAssertTraces( trace -> @@ -108,7 +109,7 @@ public void elasticsearchStatus() throws Exception { } @Test - public void elasticsearchStatusAsync() throws Exception { + void elasticsearchStatusAsync() throws Exception { AsyncRequest asyncRequest = new AsyncRequest(); CountDownLatch countDownLatch = new CountDownLatch(1); ResponseListener responseListener = @@ -148,7 +149,7 @@ public void onFailure(Exception e) { Map result = objectMapper.readValue( asyncRequest.getRequestResponse().getEntity().getContent(), Map.class); - Assertions.assertEquals(result.get("status"), "green"); + assertThat(result.get("status")).isEqualTo("green"); testing.waitAndAssertTraces( trace -> diff --git a/instrumentation/elasticsearch/elasticsearch-rest-7.0/library/src/test/java/io/opentelemetry/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java b/instrumentation/elasticsearch/elasticsearch-rest-7.0/library/src/test/java/io/opentelemetry/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java index 95152db42d05..7242f65fddf4 100644 --- a/instrumentation/elasticsearch/elasticsearch-rest-7.0/library/src/test/java/io/opentelemetry/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java +++ b/instrumentation/elasticsearch/elasticsearch-rest-7.0/library/src/test/java/io/opentelemetry/instrumentation/elasticsearch/rest/v7_0/ElasticsearchRest7Test.java @@ -13,6 +13,7 @@ import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static io.opentelemetry.semconv.UrlAttributes.URL_FULL; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; +import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.SpanKind; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; @@ -26,7 +27,6 @@ import org.elasticsearch.client.ResponseListener; import org.elasticsearch.client.RestClient; import org.junit.jupiter.api.AfterAll; -import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.RegisterExtension; @@ -75,10 +75,10 @@ static void cleanUp() { } @Test - public void elasticsearchStatus() throws Exception { + void elasticsearchStatus() throws Exception { Response response = client.performRequest(new Request("GET", "_cluster/health")); Map result = objectMapper.readValue(response.getEntity().getContent(), Map.class); - Assertions.assertEquals(result.get("status"), "green"); + assertThat(result.get("status")).isEqualTo("green"); testing.waitAndAssertTraces( trace -> @@ -136,7 +136,7 @@ public void onFailure(Exception e) { Map result = objectMapper.readValue( asyncRequest.getRequestResponse().getEntity().getContent(), Map.class); - Assertions.assertEquals(result.get("status"), "green"); + assertThat(result.get("status")).isEqualTo("green"); testing.waitAndAssertTraces( trace -> diff --git a/instrumentation/hikaricp-3.0/javaagent/build.gradle.kts b/instrumentation/hikaricp-3.0/javaagent/build.gradle.kts index ad2f01808c53..d5262fe7f54d 100644 --- a/instrumentation/hikaricp-3.0/javaagent/build.gradle.kts +++ b/instrumentation/hikaricp-3.0/javaagent/build.gradle.kts @@ -22,13 +22,18 @@ dependencies { testImplementation(project(":instrumentation:hikaricp-3.0:testing")) } +val collectMetadata = findProperty("collectMetadata")?.toString() ?: "false" + tasks { val testStableSemconv by registering(Test::class) { jvmArgs("-Dotel.semconv-stability.opt-in=database") + + systemProperty("collectMetadata", collectMetadata) + systemProperty("metaDataConfig", "otel.semconv-stability.opt-in=database") } test { - systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") + systemProperty("collectMetadata", collectMetadata) } check { diff --git a/instrumentation/java-http-client/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/JavaHttpClientTest.java b/instrumentation/java-http-client/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/JavaHttpClientTest.java index 97e3b9917b1d..8846201f662a 100644 --- a/instrumentation/java-http-client/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/JavaHttpClientTest.java +++ b/instrumentation/java-http-client/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/javahttpclient/JavaHttpClientTest.java @@ -13,18 +13,20 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.extension.RegisterExtension; -public abstract class JavaHttpClientTest extends AbstractJavaHttpClientTest { +class JavaHttpClientTest { - @RegisterExtension - static final InstrumentationExtension testing = HttpClientInstrumentationExtension.forAgent(); + abstract static class AbstractTest extends AbstractJavaHttpClientTest { + @RegisterExtension + static final InstrumentationExtension testing = HttpClientInstrumentationExtension.forAgent(); - @Override - protected HttpClient configureHttpClient(HttpClient httpClient) { - return httpClient; + @Override + protected HttpClient configureHttpClient(HttpClient httpClient) { + return httpClient; + } } @Nested - static class Http1ClientTest extends JavaHttpClientTest { + class Http1ClientTest extends AbstractTest { @Override protected void configureHttpClientBuilder(HttpClient.Builder httpClientBuilder) { @@ -33,7 +35,7 @@ protected void configureHttpClientBuilder(HttpClient.Builder httpClientBuilder) } @Nested - static class Http2ClientTest extends JavaHttpClientTest { + class Http2ClientTest extends AbstractTest { @Override protected void configureHttpClientBuilder(HttpClient.Builder httpClientBuilder) { diff --git a/instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTest.java b/instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTest.java index e490d7134523..3bd5d511d485 100644 --- a/instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTest.java +++ b/instrumentation/java-http-client/library/src/test/java/io/opentelemetry/instrumentation/javahttpclient/JavaHttpClientTest.java @@ -14,24 +14,26 @@ import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.extension.RegisterExtension; -public abstract class JavaHttpClientTest extends AbstractJavaHttpClientTest { +class JavaHttpClientTest { - @RegisterExtension - static final InstrumentationExtension testing = HttpClientInstrumentationExtension.forLibrary(); + abstract static class AbstractTest extends AbstractJavaHttpClientTest { + @RegisterExtension + static final InstrumentationExtension testing = HttpClientInstrumentationExtension.forLibrary(); - @Override - protected HttpClient configureHttpClient(HttpClient httpClient) { - return JavaHttpClientTelemetry.builder(testing.getOpenTelemetry()) - .setCapturedRequestHeaders( - Collections.singletonList(AbstractHttpClientTest.TEST_REQUEST_HEADER)) - .setCapturedResponseHeaders( - Collections.singletonList(AbstractHttpClientTest.TEST_RESPONSE_HEADER)) - .build() - .newHttpClient(httpClient); + @Override + protected HttpClient configureHttpClient(HttpClient httpClient) { + return JavaHttpClientTelemetry.builder(testing.getOpenTelemetry()) + .setCapturedRequestHeaders( + Collections.singletonList(AbstractHttpClientTest.TEST_REQUEST_HEADER)) + .setCapturedResponseHeaders( + Collections.singletonList(AbstractHttpClientTest.TEST_RESPONSE_HEADER)) + .build() + .newHttpClient(httpClient); + } } @Nested - static class Http1ClientTest extends JavaHttpClientTest { + class Http1ClientTest extends AbstractTest { @Override protected void configureHttpClientBuilder(HttpClient.Builder httpClientBuilder) { @@ -40,7 +42,7 @@ protected void configureHttpClientBuilder(HttpClient.Builder httpClientBuilder) } @Nested - static class Http2ClientTest extends JavaHttpClientTest { + class Http2ClientTest extends AbstractTest { @Override protected void configureHttpClientBuilder(HttpClient.Builder httpClientBuilder) { diff --git a/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java b/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java index 2050cef44978..ce1597a57b63 100644 --- a/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java +++ b/instrumentation/jdbc/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jdbc/test/JdbcInstrumentationTest.java @@ -11,18 +11,18 @@ import static io.opentelemetry.instrumentation.testing.junit.db.SemconvStabilityUtil.maybeStableDbSystemName; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.DbAttributes.DB_COLLECTION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_NAMESPACE; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_BATCH_SIZE; +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.incubating.DbIncubatingAttributes.DB_COLLECTION_NAME; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_CONNECTION_STRING; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAMESPACE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION_BATCH_SIZE; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION_NAME; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM_NAME; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER; import static java.util.Arrays.asList; import static org.junit.jupiter.api.Assumptions.assumeTrue; diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/DataSourceDbAttributesExtractor.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/DataSourceDbAttributesExtractor.java index b601e4b4aa8a..58c184def1f5 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/DataSourceDbAttributesExtractor.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/DataSourceDbAttributesExtractor.java @@ -6,6 +6,8 @@ package io.opentelemetry.instrumentation.jdbc.internal; import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet; +import static io.opentelemetry.semconv.DbAttributes.DB_NAMESPACE; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributesBuilder; @@ -21,10 +23,7 @@ enum DataSourceDbAttributesExtractor implements AttributesExtractor DB_NAME = AttributeKey.stringKey("db.name"); - private static final AttributeKey DB_NAMESPACE = AttributeKey.stringKey("db.namespace"); private static final AttributeKey DB_SYSTEM = AttributeKey.stringKey("db.system"); - private static final AttributeKey DB_SYSTEM_NAME = - AttributeKey.stringKey("db.system.name"); private static final AttributeKey DB_USER = AttributeKey.stringKey("db.user"); private static final AttributeKey DB_CONNECTION_STRING = AttributeKey.stringKey("db.connection_string"); diff --git a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/TransactionAttributeExtractor.java b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/TransactionAttributeExtractor.java index cb3553b1e7cc..f601f8a0a86d 100644 --- a/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/TransactionAttributeExtractor.java +++ b/instrumentation/jdbc/library/src/main/java/io/opentelemetry/instrumentation/jdbc/internal/TransactionAttributeExtractor.java @@ -6,6 +6,7 @@ package io.opentelemetry.instrumentation.jdbc.internal; import static io.opentelemetry.instrumentation.api.internal.AttributesExtractorUtil.internalSet; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.api.common.AttributesBuilder; @@ -19,8 +20,6 @@ enum TransactionAttributeExtractor implements AttributesExtractor DB_OPERATION = AttributeKey.stringKey("db.operation"); - private static final AttributeKey DB_OPERATION_NAME = - AttributeKey.stringKey("db.operation.name"); @Override public void onStart(AttributesBuilder attributes, Context parentContext, DbRequest request) { diff --git a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java index 145f8e07df7d..752f8028a9b1 100644 --- a/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java +++ b/instrumentation/jdbc/library/src/test/java/io/opentelemetry/instrumentation/jdbc/datasource/JdbcTelemetryTest.java @@ -8,19 +8,19 @@ 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_NAMESPACE; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_BATCH_SIZE; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_QUERY_TEXT; +import static io.opentelemetry.semconv.DbAttributes.DB_RESPONSE_STATUS_CODE; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; import static io.opentelemetry.semconv.ErrorAttributes.ERROR_TYPE; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAME; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAMESPACE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION_BATCH_SIZE; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION_NAME; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_QUERY_TEXT; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_RESPONSE_STATUS_CODE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM_NAME; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatCode; import static org.junit.jupiter.api.Assumptions.assumeTrue; diff --git a/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java b/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java index f8fb3b2d5fdd..cd66b86ca897 100644 --- a/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java +++ b/instrumentation/jedis/jedis-3.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/jedis/v3_0/Jedis30ClientTest.java @@ -9,16 +9,16 @@ 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.NetworkAttributes.NETWORK_PEER_ADDRESS; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; 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; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION_NAME; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM_NAME; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.SpanKind; diff --git a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceConnectAttributesExtractor.java b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceConnectAttributesExtractor.java index e54700344b79..de23c06bbd46 100644 --- a/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceConnectAttributesExtractor.java +++ b/instrumentation/lettuce/lettuce-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/lettuce/v4_0/LettuceConnectAttributesExtractor.java @@ -10,6 +10,7 @@ import io.opentelemetry.context.Context; import io.opentelemetry.instrumentation.api.instrumenter.AttributesExtractor; import io.opentelemetry.instrumentation.api.internal.SemconvStability; +import io.opentelemetry.semconv.DbAttributes; import io.opentelemetry.semconv.incubating.DbIncubatingAttributes; import javax.annotation.Nullable; @@ -20,8 +21,7 @@ final class LettuceConnectAttributesExtractor implements AttributesExtractor DB_SYSTEM = AttributeKey.stringKey("db.system"); - private static final AttributeKey DB_SYSTEM_NAME = - AttributeKey.stringKey("db.system.name"); private static final AttributeKey DB_STATEMENT = AttributeKey.stringKey("db.statement"); - private static final AttributeKey DB_QUERY_TEXT = AttributeKey.stringKey("db.query.text"); private static final AttributeKey DB_REDIS_DATABASE_INDEX = AttributeKey.longKey("db.redis.database_index"); // copied from DbIncubatingAttributes.DbSystemIncubatingValues diff --git a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceClientTest.java b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceClientTest.java index 56573539a278..41f1258b0837 100644 --- a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceClientTest.java @@ -6,7 +6,7 @@ package io.opentelemetry.instrumentation.lettuce.v5_1; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAMESPACE; +import static io.opentelemetry.semconv.DbAttributes.DB_NAMESPACE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_REDIS_DATABASE_INDEX; import io.lettuce.core.RedisClient; diff --git a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientTest.java b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientTest.java index 2011a35a525b..29e17ea1e1ba 100644 --- a/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientTest.java +++ b/instrumentation/lettuce/lettuce-5.1/testing/src/main/java/io/opentelemetry/instrumentation/lettuce/v5_1/AbstractLettuceSyncClientTest.java @@ -9,15 +9,15 @@ 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_NAMESPACE; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_TYPE; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAMESPACE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM_NAME; import static java.nio.charset.StandardCharsets.UTF_8; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.assertThat; diff --git a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoAttributesExtractor.java b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoAttributesExtractor.java index 75254966739e..1d1cf58f2e0a 100644 --- a/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoAttributesExtractor.java +++ b/instrumentation/mongo/mongo-3.1/library/src/main/java/io/opentelemetry/instrumentation/mongo/v3_1/MongoAttributesExtractor.java @@ -7,6 +7,7 @@ import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitOldDatabaseSemconv; import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; +import static io.opentelemetry.semconv.DbAttributes.DB_COLLECTION_NAME; import static java.util.Arrays.asList; import com.mongodb.event.CommandStartedEvent; @@ -21,8 +22,6 @@ class MongoAttributesExtractor implements AttributesExtractor { // copied from DbIncubatingAttributes - private static final AttributeKey DB_COLLECTION_NAME = - AttributeKey.stringKey("db.collection.name"); private static final AttributeKey DB_MONGODB_COLLECTION = AttributeKey.stringKey("db.mongodb.collection"); diff --git a/instrumentation/oracle-ucp-11.2/javaagent/build.gradle.kts b/instrumentation/oracle-ucp-11.2/javaagent/build.gradle.kts index 3438caf2215b..65d60d416e68 100644 --- a/instrumentation/oracle-ucp-11.2/javaagent/build.gradle.kts +++ b/instrumentation/oracle-ucp-11.2/javaagent/build.gradle.kts @@ -20,17 +20,19 @@ dependencies { testImplementation(project(":instrumentation:oracle-ucp-11.2:testing")) } +val collectMetadata = findProperty("collectMetadata")?.toString() ?: "false" + tasks { test { usesService(gradle.sharedServices.registrations["testcontainersBuildService"].service) + systemProperty("collectMetadata", collectMetadata) } val testStableSemconv by registering(Test::class) { jvmArgs("-Dotel.semconv-stability.opt-in=database") - } - test { - systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") + systemProperty("collectMetadata", collectMetadata) + systemProperty("metaDataConfig", "otel.semconv-stability.opt-in=database") } check { diff --git a/instrumentation/oracle-ucp-11.2/library/src/main/java/io/opentelemetry/instrumentation/oracleucp/v11_2/ConnectionPoolMetrics.java b/instrumentation/oracle-ucp-11.2/library/src/main/java/io/opentelemetry/instrumentation/oracleucp/v11_2/ConnectionPoolMetrics.java index 860fc246e5e7..24acbd65ff13 100644 --- a/instrumentation/oracle-ucp-11.2/library/src/main/java/io/opentelemetry/instrumentation/oracleucp/v11_2/ConnectionPoolMetrics.java +++ b/instrumentation/oracle-ucp-11.2/library/src/main/java/io/opentelemetry/instrumentation/oracleucp/v11_2/ConnectionPoolMetrics.java @@ -15,7 +15,7 @@ import oracle.ucp.UniversalConnectionPool; final class ConnectionPoolMetrics { - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.orcale-ucp-11.2"; + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.oracle-ucp-11.2"; // a weak map does not make sense here because each Meter holds a reference to the connection pool // none of the UniversalConnectionPool implementations contain equals()/hashCode(), so it's safe diff --git a/instrumentation/oracle-ucp-11.2/testing/src/main/java/io/opentelemetry/instrumentation/oracleucp/AbstractOracleUcpInstrumentationTest.java b/instrumentation/oracle-ucp-11.2/testing/src/main/java/io/opentelemetry/instrumentation/oracleucp/AbstractOracleUcpInstrumentationTest.java index 507b301421a6..8e1585df99a7 100644 --- a/instrumentation/oracle-ucp-11.2/testing/src/main/java/io/opentelemetry/instrumentation/oracleucp/AbstractOracleUcpInstrumentationTest.java +++ b/instrumentation/oracle-ucp-11.2/testing/src/main/java/io/opentelemetry/instrumentation/oracleucp/AbstractOracleUcpInstrumentationTest.java @@ -33,7 +33,7 @@ public abstract class AbstractOracleUcpInstrumentationTest { private static final Logger logger = LoggerFactory.getLogger(AbstractOracleUcpInstrumentationTest.class); - private static final String INSTRUMENTATION_NAME = "io.opentelemetry.orcale-ucp-11.2"; + private static final String INSTRUMENTATION_NAME = "io.opentelemetry.oracle-ucp-11.2"; private static OracleContainer oracle; protected abstract InstrumentationExtension testing(); diff --git a/instrumentation/oshi/javaagent/build.gradle.kts b/instrumentation/oshi/javaagent/build.gradle.kts index 61bbb729f4c8..e8293171a9c7 100644 --- a/instrumentation/oshi/javaagent/build.gradle.kts +++ b/instrumentation/oshi/javaagent/build.gradle.kts @@ -24,10 +24,16 @@ dependencies { tasks { withType().configureEach { + systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") + } + + val testExperimental by registering(Test::class) { jvmArgs("-Dotel.instrumentation.oshi.experimental-metrics.enabled=true") + systemProperty("testExperimental", "true") + systemProperty("metaDataConfig", "otel.instrumentation.oshi.experimental-metrics.enabled=true") } - test { - systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") + check { + dependsOn(testExperimental) } } diff --git a/instrumentation/oshi/metadata.yaml b/instrumentation/oshi/metadata.yaml index 0afedf010d6a..7abda9582c21 100644 --- a/instrumentation/oshi/metadata.yaml +++ b/instrumentation/oshi/metadata.yaml @@ -1,6 +1,6 @@ description: When the OSHI library is detected on the classpath, this instrumentation will use the system class loader to load classes from the oshi-core jar that are then used to generate system metrics. configurations: - name: otel.instrumentation.oshi.experimental-metrics.enabled - description: Enable the OSHI process metrics. + description: Enable the OSHI process runtime metrics. type: boolean default: false diff --git a/instrumentation/oshi/testing/src/main/java/io/opentelemetry/instrumentation/oshi/AbstractProcessMetricsTest.java b/instrumentation/oshi/testing/src/main/java/io/opentelemetry/instrumentation/oshi/AbstractProcessMetricsTest.java index 7a4f043eb297..ff8b322a4310 100644 --- a/instrumentation/oshi/testing/src/main/java/io/opentelemetry/instrumentation/oshi/AbstractProcessMetricsTest.java +++ b/instrumentation/oshi/testing/src/main/java/io/opentelemetry/instrumentation/oshi/AbstractProcessMetricsTest.java @@ -9,6 +9,7 @@ import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.condition.EnabledIfSystemProperty; public abstract class AbstractProcessMetricsTest { @@ -17,6 +18,7 @@ public abstract class AbstractProcessMetricsTest { protected abstract InstrumentationExtension testing(); @Test + @EnabledIfSystemProperty(named = "testExperimental", matches = "true") void test() { // when registerMetrics(); diff --git a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/ProcessResource.java b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/ProcessResource.java index 244e4cf5e1cb..666c2964d8e2 100644 --- a/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/ProcessResource.java +++ b/instrumentation/resources/library/src/main/java/io/opentelemetry/instrumentation/resources/ProcessResource.java @@ -93,6 +93,8 @@ private static Resource doBuildResource() { String[] args = ProcessArguments.getProcessArguments(); // This will only work with Java 9+ but provides everything except the executablePath. + // Argument array may be empty on Java 9+ when the command line is too long, see + // https://bugs.openjdk.org/browse/JDK-8345117 if (args.length > 0) { List commandArgs = new ArrayList<>(args.length + 1); commandArgs.add(executablePath.toString()); diff --git a/instrumentation/tomcat/tomcat-jdbc/javaagent/build.gradle.kts b/instrumentation/tomcat/tomcat-jdbc/javaagent/build.gradle.kts index 47541bf80e47..e712e958f876 100644 --- a/instrumentation/tomcat/tomcat-jdbc/javaagent/build.gradle.kts +++ b/instrumentation/tomcat/tomcat-jdbc/javaagent/build.gradle.kts @@ -16,8 +16,21 @@ dependencies { testImplementation("org.apache.tomcat:tomcat-jdbc:8.5.0") } +val collectMetadata = findProperty("collectMetadata")?.toString() ?: "false" + tasks { + val testStableSemconv by registering(Test::class) { + jvmArgs("-Dotel.semconv-stability.opt-in=database") + + systemProperty("collectMetadata", collectMetadata) + systemProperty("metaDataConfig", "otel.semconv-stability.opt-in=database") + } + test { - systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") + systemProperty("collectMetadata", collectMetadata) + } + + check { + dependsOn(testStableSemconv) } } diff --git a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientTest.java b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientTest.java index 214bed2cfe5f..e58ba72ddc1e 100644 --- a/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientTest.java +++ b/instrumentation/vertx/vertx-redis-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/redis/VertxRedisClientTest.java @@ -7,18 +7,18 @@ import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.equalTo; +import static io.opentelemetry.semconv.DbAttributes.DB_NAMESPACE; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_QUERY_TEXT; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_ADDRESS; import static io.opentelemetry.semconv.NetworkAttributes.NETWORK_PEER_PORT; import static io.opentelemetry.semconv.ServerAttributes.SERVER_ADDRESS; import static io.opentelemetry.semconv.ServerAttributes.SERVER_PORT; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_NAMESPACE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION_NAME; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_QUERY_TEXT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_REDIS_DATABASE_INDEX; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM_NAME; import static org.assertj.core.api.Assertions.assertThat; import io.opentelemetry.api.trace.SpanKind; diff --git a/instrumentation/vibur-dbcp-11.0/javaagent/build.gradle.kts b/instrumentation/vibur-dbcp-11.0/javaagent/build.gradle.kts index 601ffb6e066b..5fd9a33e6b37 100644 --- a/instrumentation/vibur-dbcp-11.0/javaagent/build.gradle.kts +++ b/instrumentation/vibur-dbcp-11.0/javaagent/build.gradle.kts @@ -19,13 +19,18 @@ dependencies { testImplementation(project(":instrumentation:vibur-dbcp-11.0:testing")) } +val collectMetadata = findProperty("collectMetadata")?.toString() ?: "false" + tasks { val testStableSemconv by registering(Test::class) { jvmArgs("-Dotel.semconv-stability.opt-in=database") + + systemProperty("collectMetadata", collectMetadata) + systemProperty("metaDataConfig", "otel.semconv-stability.opt-in=database") } test { - systemProperty("collectMetadata", findProperty("collectMetadata")?.toString() ?: "false") + systemProperty("collectMetadata", collectMetadata) } check { diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java index 5a08597845f1..927111b6023e 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/AgentInstaller.java @@ -57,6 +57,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.concurrent.ThreadLocalRandom; import java.util.logging.LogManager; import java.util.logging.Logger; import java.util.stream.Stream; @@ -123,6 +124,11 @@ private static void installBytebuddyAgent( EmbeddedInstrumentationProperties.setPropertiesLoader(extensionClassLoader); setDefineClassHandler(); FieldBackedImplementationConfiguration.configure(earlyConfig); + // preload ThreadLocalRandom to avoid occasional + // java.lang.ClassCircularityError: java/util/concurrent/ThreadLocalRandom + // see https://github.com/raphw/byte-buddy/issues/1666 and + // https://bugs.openjdk.org/browse/JDK-8164165 + ThreadLocalRandom.current(); AgentBuilder agentBuilder = new AgentBuilder.Default( diff --git a/licenses/byte-buddy-dep-1.17.5.jar/META-INF/LICENSE b/licenses/byte-buddy-dep-1.17.6.jar/META-INF/LICENSE similarity index 100% rename from licenses/byte-buddy-dep-1.17.5.jar/META-INF/LICENSE rename to licenses/byte-buddy-dep-1.17.6.jar/META-INF/LICENSE diff --git a/licenses/byte-buddy-dep-1.17.5.jar/META-INF/NOTICE b/licenses/byte-buddy-dep-1.17.6.jar/META-INF/NOTICE similarity index 100% rename from licenses/byte-buddy-dep-1.17.5.jar/META-INF/NOTICE rename to licenses/byte-buddy-dep-1.17.6.jar/META-INF/NOTICE diff --git a/licenses/jackson-annotations-2.19.0.jar/META-INF/LICENSE b/licenses/jackson-annotations-2.19.1.jar/META-INF/LICENSE similarity index 100% rename from licenses/jackson-annotations-2.19.0.jar/META-INF/LICENSE rename to licenses/jackson-annotations-2.19.1.jar/META-INF/LICENSE diff --git a/licenses/jackson-annotations-2.19.0.jar/META-INF/NOTICE b/licenses/jackson-annotations-2.19.1.jar/META-INF/NOTICE similarity index 100% rename from licenses/jackson-annotations-2.19.0.jar/META-INF/NOTICE rename to licenses/jackson-annotations-2.19.1.jar/META-INF/NOTICE diff --git a/licenses/jackson-core-2.19.0.jar/META-INF/LICENSE b/licenses/jackson-core-2.19.1.jar/META-INF/LICENSE similarity index 100% rename from licenses/jackson-core-2.19.0.jar/META-INF/LICENSE rename to licenses/jackson-core-2.19.1.jar/META-INF/LICENSE diff --git a/licenses/jackson-core-2.19.0.jar/META-INF/NOTICE b/licenses/jackson-core-2.19.1.jar/META-INF/NOTICE similarity index 100% rename from licenses/jackson-core-2.19.0.jar/META-INF/NOTICE rename to licenses/jackson-core-2.19.1.jar/META-INF/NOTICE diff --git a/licenses/jackson-databind-2.19.0.jar/META-INF/LICENSE b/licenses/jackson-databind-2.19.1.jar/META-INF/LICENSE similarity index 100% rename from licenses/jackson-databind-2.19.0.jar/META-INF/LICENSE rename to licenses/jackson-databind-2.19.1.jar/META-INF/LICENSE diff --git a/licenses/jackson-databind-2.19.0.jar/META-INF/NOTICE b/licenses/jackson-databind-2.19.1.jar/META-INF/NOTICE similarity index 100% rename from licenses/jackson-databind-2.19.0.jar/META-INF/NOTICE rename to licenses/jackson-databind-2.19.1.jar/META-INF/NOTICE diff --git a/licenses/jackson-dataformat-yaml-2.19.0.jar/META-INF/LICENSE b/licenses/jackson-dataformat-yaml-2.19.1.jar/META-INF/LICENSE similarity index 100% rename from licenses/jackson-dataformat-yaml-2.19.0.jar/META-INF/LICENSE rename to licenses/jackson-dataformat-yaml-2.19.1.jar/META-INF/LICENSE diff --git a/licenses/jackson-dataformat-yaml-2.19.0.jar/META-INF/NOTICE b/licenses/jackson-dataformat-yaml-2.19.1.jar/META-INF/NOTICE similarity index 100% rename from licenses/jackson-dataformat-yaml-2.19.0.jar/META-INF/NOTICE rename to licenses/jackson-dataformat-yaml-2.19.1.jar/META-INF/NOTICE diff --git a/licenses/licenses.md b/licenses/licenses.md index 5687895c245a..f65c735d26b8 100644 --- a/licenses/licenses.md +++ b/licenses/licenses.md @@ -4,7 +4,7 @@ ## Apache License, Version 2.0 -**1** **Group:** `codes.rafael.asmjdkbridge` **Name:** `asm-jdk-bridge` **Version:** `0.0.9` +**1** **Group:** `codes.rafael.asmjdkbridge` **Name:** `asm-jdk-bridge` **Version:** `0.0.10` > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) **2** **Group:** `com.blogspot.mydailyjava` **Name:** `weak-lock-free` **Version:** `0.18` @@ -12,33 +12,33 @@ > - **POM Project URL**: [https://github.com/raphw/weak-lock-free](https://github.com/raphw/weak-lock-free) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**3** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-annotations` **Version:** `2.19.0` +**3** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-annotations` **Version:** `2.19.1` > - **Project URL**: [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -> - **Embedded license files**: [jackson-annotations-2.19.0.jar/META-INF/LICENSE](jackson-annotations-2.19.0.jar/META-INF/LICENSE) - - [jackson-annotations-2.19.0.jar/META-INF/NOTICE](jackson-annotations-2.19.0.jar/META-INF/NOTICE) +> - **Embedded license files**: [jackson-annotations-2.19.1.jar/META-INF/LICENSE](jackson-annotations-2.19.1.jar/META-INF/LICENSE) + - [jackson-annotations-2.19.1.jar/META-INF/NOTICE](jackson-annotations-2.19.1.jar/META-INF/NOTICE) -**4** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-core` **Version:** `2.19.0` +**4** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-core` **Version:** `2.19.1` > - **Project URL**: [https://github.com/FasterXML/jackson-core](https://github.com/FasterXML/jackson-core) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -> - **Embedded license files**: [jackson-core-2.19.0.jar/META-INF/LICENSE](jackson-core-2.19.0.jar/META-INF/LICENSE) - - [jackson-core-2.19.0.jar/META-INF/NOTICE](jackson-core-2.19.0.jar/META-INF/NOTICE) +> - **Embedded license files**: [jackson-core-2.19.1.jar/META-INF/LICENSE](jackson-core-2.19.1.jar/META-INF/LICENSE) + - [jackson-core-2.19.1.jar/META-INF/NOTICE](jackson-core-2.19.1.jar/META-INF/NOTICE) -**5** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-databind` **Version:** `2.19.0` +**5** **Group:** `com.fasterxml.jackson.core` **Name:** `jackson-databind` **Version:** `2.19.1` > - **Project URL**: [https://github.com/FasterXML/jackson](https://github.com/FasterXML/jackson) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -> - **Embedded license files**: [jackson-databind-2.19.0.jar/META-INF/LICENSE](jackson-databind-2.19.0.jar/META-INF/LICENSE) - - [jackson-databind-2.19.0.jar/META-INF/NOTICE](jackson-databind-2.19.0.jar/META-INF/NOTICE) +> - **Embedded license files**: [jackson-databind-2.19.1.jar/META-INF/LICENSE](jackson-databind-2.19.1.jar/META-INF/LICENSE) + - [jackson-databind-2.19.1.jar/META-INF/NOTICE](jackson-databind-2.19.1.jar/META-INF/NOTICE) -**6** **Group:** `com.fasterxml.jackson.dataformat` **Name:** `jackson-dataformat-yaml` **Version:** `2.19.0` +**6** **Group:** `com.fasterxml.jackson.dataformat` **Name:** `jackson-dataformat-yaml` **Version:** `2.19.1` > - **Project URL**: [https://github.com/FasterXML/jackson-dataformats-text](https://github.com/FasterXML/jackson-dataformats-text) > - **Manifest License**: Apache License, Version 2.0 (Not Packaged) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -> - **Embedded license files**: [jackson-dataformat-yaml-2.19.0.jar/META-INF/LICENSE](jackson-dataformat-yaml-2.19.0.jar/META-INF/LICENSE) - - [jackson-dataformat-yaml-2.19.0.jar/META-INF/NOTICE](jackson-dataformat-yaml-2.19.0.jar/META-INF/NOTICE) +> - **Embedded license files**: [jackson-dataformat-yaml-2.19.1.jar/META-INF/LICENSE](jackson-dataformat-yaml-2.19.1.jar/META-INF/LICENSE) + - [jackson-dataformat-yaml-2.19.1.jar/META-INF/NOTICE](jackson-dataformat-yaml-2.19.1.jar/META-INF/NOTICE) **7** **Group:** `com.google.cloud.opentelemetry` **Name:** `detector-resources-support` **Version:** `0.34.0` > - **POM Project URL**: [https://github.com/GoogleCloudPlatform/opentelemetry-operations-java](https://github.com/GoogleCloudPlatform/opentelemetry-operations-java) @@ -54,11 +54,11 @@ > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) > - **Embedded license files**: [okhttp-4.12.0.jar/okhttp3/internal/publicsuffix/NOTICE](okhttp-4.12.0.jar/okhttp3/internal/publicsuffix/NOTICE) -**10** **Group:** `com.squareup.okio` **Name:** `okio` **Version:** `3.12.0` +**10** **Group:** `com.squareup.okio` **Name:** `okio` **Version:** `3.13.0` > - **POM Project URL**: [https://github.com/square/okio/](https://github.com/square/okio/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**11** **Group:** `com.squareup.okio` **Name:** `okio-jvm` **Version:** `3.12.0` +**11** **Group:** `com.squareup.okio` **Name:** `okio-jvm` **Version:** `3.13.0` > - **POM Project URL**: [https://github.com/square/okio/](https://github.com/square/okio/) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) @@ -174,11 +174,11 @@ > - **POM Project URL**: [https://github.com/open-telemetry/opentelemetry-java-contrib](https://github.com/open-telemetry/opentelemetry-java-contrib) > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -**40** **Group:** `io.opentelemetry.semconv` **Name:** `opentelemetry-semconv` **Version:** `1.32.0` +**40** **Group:** `io.opentelemetry.semconv` **Name:** `opentelemetry-semconv` **Version:** `1.34.0` > - **POM Project URL**: [https://github.com/open-telemetry/semantic-conventions-java](https://github.com/open-telemetry/semantic-conventions-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) -**41** **Group:** `io.opentelemetry.semconv` **Name:** `opentelemetry-semconv-incubating` **Version:** `1.32.0-alpha` +**41** **Group:** `io.opentelemetry.semconv` **Name:** `opentelemetry-semconv-incubating` **Version:** `1.34.0-alpha` > - **POM Project URL**: [https://github.com/open-telemetry/semantic-conventions-java](https://github.com/open-telemetry/semantic-conventions-java) > - **POM License**: Apache License, Version 2.0 - [http://www.apache.org/licenses/LICENSE-2.0](http://www.apache.org/licenses/LICENSE-2.0) @@ -220,10 +220,10 @@ > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) > - **Embedded license files**: [zipkin-2.27.1.jar/META-INF/LICENSE](zipkin-2.27.1.jar/META-INF/LICENSE) -**50** **Group:** `net.bytebuddy` **Name:** `byte-buddy-dep` **Version:** `1.17.5` +**50** **Group:** `net.bytebuddy` **Name:** `byte-buddy-dep` **Version:** `1.17.6` > - **POM License**: Apache License, Version 2.0 - [https://www.apache.org/licenses/LICENSE-2.0](https://www.apache.org/licenses/LICENSE-2.0) -> - **Embedded license files**: [byte-buddy-dep-1.17.5.jar/META-INF/LICENSE](byte-buddy-dep-1.17.5.jar/META-INF/LICENSE) - - [byte-buddy-dep-1.17.5.jar/META-INF/NOTICE](byte-buddy-dep-1.17.5.jar/META-INF/NOTICE) +> - **Embedded license files**: [byte-buddy-dep-1.17.6.jar/META-INF/LICENSE](byte-buddy-dep-1.17.6.jar/META-INF/LICENSE) + - [byte-buddy-dep-1.17.6.jar/META-INF/NOTICE](byte-buddy-dep-1.17.6.jar/META-INF/NOTICE) **51** **Group:** `org.jetbrains` **Name:** `annotations` **Version:** `13.0` > - **POM Project URL**: [http://www.jetbrains.org](http://www.jetbrains.org) diff --git a/smoke-tests/images/grpc/build.gradle.kts b/smoke-tests/images/grpc/build.gradle.kts index a11859d88ac4..b9144b0ec986 100644 --- a/smoke-tests/images/grpc/build.gradle.kts +++ b/smoke-tests/images/grpc/build.gradle.kts @@ -11,7 +11,7 @@ dependencies { implementation(platform("io.grpc:grpc-bom:1.73.0")) implementation(platform("io.opentelemetry:opentelemetry-bom:1.0.0")) implementation(platform("io.opentelemetry:opentelemetry-bom-alpha:1.0.0-alpha")) - implementation(platform("org.apache.logging.log4j:log4j-bom:2.24.3")) + implementation(platform("org.apache.logging.log4j:log4j-bom:2.25.0")) implementation("io.grpc:grpc-netty-shaded") implementation("io.grpc:grpc-protobuf") diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/internal/MetaDataCollector.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/internal/MetaDataCollector.java index 6a15c133539b..76ddac93b6d9 100644 --- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/internal/MetaDataCollector.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/internal/MetaDataCollector.java @@ -69,30 +69,36 @@ private static void writeMetricData(String instrumentationPath, Map { - try { - writer.write(" - name: " + key.getKey() + "\n"); - writer.write(" type: " + key.getType().toString() + "\n"); - } catch (IOException e) { - throw new IllegalStateException(e); - } - }); - } + writer.write("when: " + when + "\n"); + + writer.write("metrics:\n"); + for (MetricData metric : metrics.values()) { + writer.write(" - name: " + metric.getName() + "\n"); + writer.write(" description: " + metric.getDescription() + "\n"); + writer.write(" type: " + metric.getType().toString() + "\n"); + writer.write(" unit: " + sanitizeUnit(metric.getUnit()) + "\n"); + writer.write(" attributes: \n"); + metric.getData().getPoints().stream() + .findFirst() + .get() + .getAttributes() + .forEach( + (key, value) -> { + try { + writer.write(" - name: " + key.getKey() + "\n"); + writer.write(" type: " + key.getType().toString() + "\n"); + } catch (IOException e) { + throw new IllegalStateException(e); + } + }); } } } diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/DbClientMetricsTestUtil.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/DbClientMetricsTestUtil.java index ba8c8843d1c3..c604943f755f 100644 --- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/DbClientMetricsTestUtil.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/DbClientMetricsTestUtil.java @@ -7,7 +7,7 @@ import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv; import static io.opentelemetry.sdk.testing.assertj.OpenTelemetryAssertions.assertThat; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.testing.junit.InstrumentationExtension; diff --git a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/SemconvStabilityUtil.java b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/SemconvStabilityUtil.java index c5b83a80cabf..b316e24bc019 100644 --- a/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/SemconvStabilityUtil.java +++ b/testing-common/src/main/java/io/opentelemetry/instrumentation/testing/junit/db/SemconvStabilityUtil.java @@ -5,6 +5,11 @@ package io.opentelemetry.instrumentation.testing.junit.db; +import static io.opentelemetry.semconv.DbAttributes.DB_COLLECTION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_NAMESPACE; +import static io.opentelemetry.semconv.DbAttributes.DB_OPERATION_NAME; +import static io.opentelemetry.semconv.DbAttributes.DB_QUERY_TEXT; +import static io.opentelemetry.semconv.DbAttributes.DB_SYSTEM_NAME; import static io.opentelemetry.semconv.incubating.CassandraIncubatingAttributes.CASSANDRA_CONSISTENCY_LEVEL; import static io.opentelemetry.semconv.incubating.CassandraIncubatingAttributes.CASSANDRA_COORDINATOR_DC; import static io.opentelemetry.semconv.incubating.CassandraIncubatingAttributes.CASSANDRA_COORDINATOR_ID; @@ -24,7 +29,6 @@ import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT; import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM; -import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM_NAME; import io.opentelemetry.api.common.AttributeKey; import io.opentelemetry.instrumentation.api.internal.SemconvStability; @@ -34,13 +38,6 @@ // until old database semconv are dropped in 3.0 public class SemconvStabilityUtil { - private static final AttributeKey DB_NAMESPACE = AttributeKey.stringKey("db.namespace"); - private static final AttributeKey DB_QUERY_TEXT = AttributeKey.stringKey("db.query.text"); - private static final AttributeKey DB_OPERATION_NAME = - AttributeKey.stringKey("db.operation.name"); - private static final AttributeKey DB_COLLECTION_NAME = - AttributeKey.stringKey("db.collection.name"); - private static final Map, AttributeKey> oldToNewMap = buildMap(); @SuppressWarnings("deprecation") // using deprecated semconv