diff --git a/.github/config/latest-dep-versions.json b/.github/config/latest-dep-versions.json index f41ffb38f067..6bb6f1c8513e 100644 --- a/.github/config/latest-dep-versions.json +++ b/.github/config/latest-dep-versions.json @@ -41,7 +41,7 @@ "com.github.etaty:rediscala_2.11#+": "1.9.0", "com.github.etaty:rediscala_2.12#+": "1.9.0", "com.github.etaty:rediscala_2.13#+": "1.9.0", - "com.github.oshi:oshi-core#+": "7.2.0", + "com.github.oshi:oshi-core#+": "7.2.1", "com.google.guava:guava#+": "33.6.0-jre", "com.google.gwt:gwt-servlet#+": "2.10.0", "com.google.http-client:google-http-client#+": "2.1.0", @@ -119,7 +119,7 @@ "com.typesafe.play:play_2.11#2.7.+": "2.7.9", "com.typesafe.play:play_2.12#+": "2.8.22", "com.typesafe.play:play_2.13#+": "2.9.11", - "com.vaadin:flow-server#+": "25.1.6", + "com.vaadin:flow-server#+": "25.1.7", "com.vaadin:vaadin-spring-boot-starter#14.11.+": "14.11.14", "com.xuxueli:xxl-job-core#+": "3.4.0", "com.xuxueli:xxl-job-core#2.2.+": "2.2.0", @@ -140,7 +140,7 @@ "io.avaje:avaje-jex#+": "3.5", "io.awspring.cloud:spring-cloud-aws-sqs#+": "4.0.2", "io.awspring.cloud:spring-cloud-aws-starter-sqs#+": "4.0.2", - "io.dropwizard.metrics:metrics-core#+": "4.2.38", + "io.dropwizard.metrics:metrics-core#+": "4.2.39", "io.dropwizard:dropwizard-client#+": "5.0.1", "io.dropwizard:dropwizard-views#+": "5.0.1", "io.github.rediscala:rediscala_2.13#+": "1.17.0", @@ -206,36 +206,40 @@ "io.reactivex:rxjava#+": "1.3.8", "io.undertow:undertow-core#+": "2.4.1.Final", "io.undertow:undertow-servlet-jakarta#+": "2.2.20.Final", - "io.vertx:vertx-circuit-breaker#+": "5.0.12", + "io.vertx:vertx-circuit-breaker#+": "5.1.0", "io.vertx:vertx-circuit-breaker#3.+": "3.9.16", "io.vertx:vertx-circuit-breaker#4.+": "4.5.27", - "io.vertx:vertx-codegen#+": "5.0.12", + "io.vertx:vertx-codegen#+": "5.1.0", "io.vertx:vertx-codegen#3.+": "3.9.16", "io.vertx:vertx-codegen#4.+": "4.5.27", - "io.vertx:vertx-core#+": "5.0.12", + "io.vertx:vertx-codegen#5.0.+": "5.0.12", + "io.vertx:vertx-core#+": "5.1.0", "io.vertx:vertx-core#3.+": "3.9.16", "io.vertx:vertx-core#4.+": "4.5.27", "io.vertx:vertx-docgen#+": "3.5.1", "io.vertx:vertx-docgen#3.+": "3.5.1", - "io.vertx:vertx-jdbc-client#+": "5.0.12", + "io.vertx:vertx-jdbc-client#+": "5.1.0", "io.vertx:vertx-jdbc-client#3.+": "3.9.16", "io.vertx:vertx-jdbc-client#4.+": "4.5.27", - "io.vertx:vertx-kafka-client#+": "5.0.12", + "io.vertx:vertx-jdbc-client#5.0.+": "5.0.12", + "io.vertx:vertx-kafka-client#+": "5.1.0", "io.vertx:vertx-kafka-client#3.+": "3.9.16", "io.vertx:vertx-kafka-client#4.+": "4.5.27", - "io.vertx:vertx-lang-kotlin-coroutines#+": "5.0.12", - "io.vertx:vertx-pg-client#+": "5.0.12", + "io.vertx:vertx-lang-kotlin-coroutines#+": "5.1.0", + "io.vertx:vertx-pg-client#+": "5.1.0", "io.vertx:vertx-pg-client#4.+": "4.5.27", - "io.vertx:vertx-redis-client#+": "5.0.12", - "io.vertx:vertx-rx-java2#+": "5.0.12", + "io.vertx:vertx-pg-client#5.0.+": "5.0.12", + "io.vertx:vertx-redis-client#+": "5.1.0", + "io.vertx:vertx-rx-java2#+": "5.1.0", "io.vertx:vertx-rx-java2#3.+": "3.9.16", "io.vertx:vertx-rx-java2#4.+": "4.5.27", - "io.vertx:vertx-sql-client#+": "5.0.12", + "io.vertx:vertx-sql-client#+": "5.1.0", "io.vertx:vertx-sql-client#4.+": "4.5.27", - "io.vertx:vertx-web#+": "5.0.12", + "io.vertx:vertx-sql-client#5.0.+": "5.0.12", + "io.vertx:vertx-web#+": "5.1.0", "io.vertx:vertx-web#3.+": "3.9.16", "io.vertx:vertx-web#4.+": "4.5.27", - "io.vertx:vertx-web-client#+": "5.0.12", + "io.vertx:vertx-web-client#+": "5.1.0", "io.vertx:vertx-web-client#3.+": "3.9.16", "io.vertx:vertx-web-client#4.+": "4.5.27", "jakarta.el:jakarta.el-api#4.+": "4.0.0", @@ -258,11 +262,11 @@ "log4j:log4j#+": "1.2.17", "net.logstash.logback:logstash-logback-encoder#+": "9.0", "net.spy:spymemcached#+": "2.12.3", - "org.apache.axis2:axis2-jaxws#+": "2.0.0", + "org.apache.axis2:axis2-jaxws#+": "2.0.1", "org.apache.axis2:axis2-jaxws#1.+": "1.8.2", - "org.apache.axis2:axis2-transport-http#+": "2.0.0", + "org.apache.axis2:axis2-transport-http#+": "2.0.1", "org.apache.axis2:axis2-transport-http#1.+": "1.8.2", - "org.apache.axis2:axis2-transport-local#+": "2.0.0", + "org.apache.axis2:axis2-transport-local#+": "2.0.1", "org.apache.axis2:axis2-transport-local#1.+": "1.8.2", "org.apache.camel:camel-aws#2.+": "2.25.4", "org.apache.camel:camel-cassandraql#2.+": "2.25.4", @@ -393,11 +397,13 @@ "org.gwtproject:gwt-dev#+": "2.13.0", "org.gwtproject:gwt-servlet#+": "2.13.0", "org.gwtproject:gwt-user#+": "2.13.0", - "org.hibernate.orm:hibernate-core#+": "7.3.6.Final", + "org.hibernate.orm:hibernate-core#+": "7.4.0.Final", + "org.hibernate.orm:hibernate-core#6.+": "6.6.51.Final", + "org.hibernate.orm:hibernate-core#7.+": "7.4.0.Final", "org.hibernate.reactive:hibernate-reactive-core#+": "4.3.5.Final", "org.hibernate.reactive:hibernate-reactive-core#1.+": "1.1.9.Final", "org.hibernate.reactive:hibernate-reactive-core#3.+": "3.3.7.Final", - "org.hibernate:hibernate-core#+": "7.3.6.Final", + "org.hibernate:hibernate-core#+": "7.4.0.Final", "org.hibernate:hibernate-core#3.+": "3.6.10.Final", "org.hibernate:hibernate-core#5.+": "5.6.15.Final", "org.hibernate:hibernate-core#6.+": "6.6.51.Final", @@ -544,21 +550,21 @@ "redis.clients:jedis#+": "7.5.0", "redis.clients:jedis#2.+": "2.10.2", "redis.clients:jedis#3.+": "3.10.0", - "software.amazon.awssdk.crt:aws-crt#+": "0.46.0", - "software.amazon.awssdk:aws-core#+": "2.44.12", - "software.amazon.awssdk:aws-json-protocol#+": "2.44.12", - "software.amazon.awssdk:bedrockruntime#+": "2.44.12", - "software.amazon.awssdk:dynamodb#+": "2.44.12", - "software.amazon.awssdk:ec2#+": "2.44.12", - "software.amazon.awssdk:kinesis#+": "2.44.12", - "software.amazon.awssdk:lambda#+": "2.44.12", - "software.amazon.awssdk:rds#+": "2.44.12", - "software.amazon.awssdk:s3#+": "2.44.12", - "software.amazon.awssdk:secretsmanager#+": "2.44.12", - "software.amazon.awssdk:ses#+": "2.44.12", - "software.amazon.awssdk:sfn#+": "2.44.12", - "software.amazon.awssdk:sns#+": "2.44.12", - "software.amazon.awssdk:sqs#+": "2.44.12", + "software.amazon.awssdk.crt:aws-crt#+": "0.46.1", + "software.amazon.awssdk:aws-core#+": "2.44.13", + "software.amazon.awssdk:aws-json-protocol#+": "2.44.13", + "software.amazon.awssdk:bedrockruntime#+": "2.44.13", + "software.amazon.awssdk:dynamodb#+": "2.44.13", + "software.amazon.awssdk:ec2#+": "2.44.13", + "software.amazon.awssdk:kinesis#+": "2.44.13", + "software.amazon.awssdk:lambda#+": "2.44.13", + "software.amazon.awssdk:rds#+": "2.44.13", + "software.amazon.awssdk:s3#+": "2.44.13", + "software.amazon.awssdk:secretsmanager#+": "2.44.13", + "software.amazon.awssdk:ses#+": "2.44.13", + "software.amazon.awssdk:sfn#+": "2.44.13", + "software.amazon.awssdk:sns#+": "2.44.13", + "software.amazon.awssdk:sqs#+": "2.44.13", "tech.powerjob:powerjob-official-processors#+": "5.1.2", "tech.powerjob:powerjob-worker#+": "5.1.2" } diff --git a/instrumentation/hibernate/hibernate-6.0/javaagent/build.gradle.kts b/instrumentation/hibernate/hibernate-6.0/javaagent/build.gradle.kts index ee47f3d8208f..02192474d7e8 100644 --- a/instrumentation/hibernate/hibernate-6.0/javaagent/build.gradle.kts +++ b/instrumentation/hibernate/hibernate-6.0/javaagent/build.gradle.kts @@ -4,7 +4,7 @@ plugins { muzzle { pass { - group.set("org.hibernate") + group.set("org.hibernate.orm") module.set("hibernate-core") versions.set("[6.0.0.Final,)") assertInverse.set(true) @@ -12,7 +12,7 @@ muzzle { } dependencies { - library("org.hibernate:hibernate-core:6.0.0.Final") + library("org.hibernate.orm:hibernate-core:6.0.0.Final") implementation(project(":instrumentation:hibernate:hibernate-common-3.3:javaagent")) @@ -49,7 +49,7 @@ testing { implementation("com.h2database:h2:1.4.197") implementation("org.hsqldb:hsqldb:2.0.0") implementation(project(":instrumentation:hibernate:testing")) - implementation("org.hibernate:hibernate-core:${baseVersion("6.0.0.Final").orLatest("6.+")}") + implementation("org.hibernate.orm:hibernate-core:${baseVersion("6.0.0.Final").orLatest("6.+")}") } } @@ -64,7 +64,7 @@ testing { implementation("com.h2database:h2:1.4.197") implementation("org.hsqldb:hsqldb:2.0.0") implementation(project(":instrumentation:hibernate:testing")) - implementation("org.hibernate:hibernate-core:${baseVersion("7.0.0.Final").orLatest("7.+")}") + implementation("org.hibernate.orm:hibernate-core:${baseVersion("7.0.0.Final").orLatest("7.+")}") } } } diff --git a/instrumentation/hibernate/hibernate-6.0/spring-testing/build.gradle.kts b/instrumentation/hibernate/hibernate-6.0/spring-testing/build.gradle.kts index 64de50694322..c95ee4000a17 100644 --- a/instrumentation/hibernate/hibernate-6.0/spring-testing/build.gradle.kts +++ b/instrumentation/hibernate/hibernate-6.0/spring-testing/build.gradle.kts @@ -5,7 +5,7 @@ plugins { val springAgent by configurations.creating dependencies { - library("org.hibernate:hibernate-core:6.0.0.Final") + library("org.hibernate.orm:hibernate-core:6.0.0.Final") testInstrumentation(project(":instrumentation:hibernate:hibernate-6.0:javaagent")) testInstrumentation(project(":instrumentation:jdbc:javaagent")) diff --git a/instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v4_0/VertxClientInstrumentationModule.java b/instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v4_0/VertxClientInstrumentationModule.java index 2edcae80e05e..d36382630588 100644 --- a/instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v4_0/VertxClientInstrumentationModule.java +++ b/instrumentation/vertx/vertx-http-client/vertx-http-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v4_0/VertxClientInstrumentationModule.java @@ -28,7 +28,7 @@ public ElementMatcher.Junction classLoaderMatcher() { // removed in 4.0 return not(hasClassesNamed("io.vertx.core.Starter")) // added in 5.0 - .and(not(hasClassesNamed("io.vertx.core.http.impl.HttpClientConnectionInternal"))); + .and(not(hasClassesNamed("io.vertx.core.http.HttpClientConnection"))); } @Override diff --git a/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/ResourceManagerInstrumentation.java b/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/HttpClientImplInstrumentation.java similarity index 70% rename from instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/ResourceManagerInstrumentation.java rename to instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/HttpClientImplInstrumentation.java index e9eb3cfefcf0..db6dfe216521 100644 --- a/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/ResourceManagerInstrumentation.java +++ b/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/HttpClientImplInstrumentation.java @@ -7,6 +7,7 @@ import static net.bytebuddy.matcher.ElementMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.returns; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -16,23 +17,24 @@ import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.matcher.ElementMatcher; -/** Propagate context to connection established callback. */ -class ResourceManagerInstrumentation implements TypeInstrumentation { +class HttpClientImplInstrumentation implements TypeInstrumentation { @Override public ElementMatcher typeMatcher() { - return named("io.vertx.core.internal.resource.ResourceManager"); + return named("io.vertx.core.http.impl.HttpClientImpl"); } @Override public void transform(TypeTransformer transformer) { transformer.applyAdviceToMethod( - named("withResourceAsync").and(returns(named("io.vertx.core.Future"))), - getClass().getName() + "$WithResourceAsyncAdvice"); + named("request") + .and(takesArgument(0, named("io.vertx.core.http.RequestOptions"))) + .and(returns(named("io.vertx.core.Future"))), + getClass().getName() + "$WrapFutureAdvice"); } @SuppressWarnings("unused") - public static class WithResourceAsyncAdvice { + public static class WrapFutureAdvice { @AssignReturned.ToReturned @Advice.OnMethodExit(suppress = Throwable.class, inline = false) public static Future wrapFuture(@Advice.Return Future future) { diff --git a/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/HttpClientResponseImplInstrumentation.java b/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/HttpClientResponseImplInstrumentation.java new file mode 100644 index 000000000000..fc1c591e02aa --- /dev/null +++ b/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/HttpClientResponseImplInstrumentation.java @@ -0,0 +1,42 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.vertx.httpclient.v5_0; + +import static net.bytebuddy.matcher.ElementMatchers.isConstructor; +import static net.bytebuddy.matcher.ElementMatchers.named; + +import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; +import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; +import io.vertx.core.http.HttpClientResponse; +import io.vertx.core.http.HttpConnection; +import net.bytebuddy.asm.Advice; +import net.bytebuddy.asm.Advice.AssignReturned; +import net.bytebuddy.description.type.TypeDescription; +import net.bytebuddy.matcher.ElementMatcher; + +class HttpClientResponseImplInstrumentation implements TypeInstrumentation { + + @Override + public ElementMatcher typeMatcher() { + return named("io.vertx.core.http.impl.HttpClientResponseImpl"); + } + + @Override + public void transform(TypeTransformer transformer) { + transformer.applyAdviceToMethod(isConstructor(), getClass().getName() + "$ConstructorAdvice"); + } + + @SuppressWarnings("unused") + public static class ConstructorAdvice { + @AssignReturned.ToReturned + @Advice.OnMethodExit(suppress = Throwable.class, inline = false) + public static void setConnection( + @Advice.This HttpClientResponse response, + @Advice.FieldValue("conn") HttpConnection connection) { + VertxClientSingletons.setConnection(response, connection); + } + } +} diff --git a/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/Vertx5HttpAttributesGetter.java b/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/Vertx5HttpAttributesGetter.java index 1fea36c6f54e..b41b54f838cb 100644 --- a/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/Vertx5HttpAttributesGetter.java +++ b/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/Vertx5HttpAttributesGetter.java @@ -8,6 +8,7 @@ import io.opentelemetry.javaagent.instrumentation.vertx.httpclient.common.v3_0.AbstractVertxHttpAttributesGetter; import io.vertx.core.http.HttpClientRequest; import io.vertx.core.http.HttpClientResponse; +import io.vertx.core.http.HttpConnection; import io.vertx.core.http.HttpVersion; import io.vertx.core.net.HostAndPort; import io.vertx.core.net.SocketAddress; @@ -79,7 +80,11 @@ public String getNetworkPeerAddress( if (response == null) { return null; } - SocketAddress socketAddress = response.netSocket().remoteAddress(); + HttpConnection connection = VertxClientSingletons.getConnection(response); + if (connection == null) { + return null; + } + SocketAddress socketAddress = connection.remoteAddress(); return socketAddress == null ? null : socketAddress.hostAddress(); } @@ -90,7 +95,11 @@ public Integer getNetworkPeerPort( if (response == null) { return null; } - SocketAddress socketAddress = response.netSocket().remoteAddress(); + HttpConnection connection = VertxClientSingletons.getConnection(response); + if (connection == null) { + return null; + } + SocketAddress socketAddress = connection.remoteAddress(); return socketAddress == null ? null : socketAddress.port(); } } diff --git a/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/VertxClientInstrumentationModule.java b/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/VertxClientInstrumentationModule.java index cd305f97ca7b..3109d2773793 100644 --- a/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/VertxClientInstrumentationModule.java +++ b/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/VertxClientInstrumentationModule.java @@ -25,7 +25,7 @@ public VertxClientInstrumentationModule() { @Override public ElementMatcher.Junction classLoaderMatcher() { // added in 5.0 - return hasClassesNamed("io.vertx.core.http.impl.HttpClientConnectionInternal"); + return hasClassesNamed("io.vertx.core.http.HttpClientConnection"); } @Override @@ -33,7 +33,8 @@ public List typeInstrumentations() { return asList( new HttpRequestInstrumentation(), new HttpClientRequestBaseInstrumentation(), - new ResourceManagerInstrumentation(), + new HttpClientResponseImplInstrumentation(), + new HttpClientImplInstrumentation(), new TaskQueueInstrumentation()); } } diff --git a/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/VertxClientSingletons.java b/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/VertxClientSingletons.java index 08a6f683289d..c9dbc092b0d0 100644 --- a/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/VertxClientSingletons.java +++ b/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/VertxClientSingletons.java @@ -14,6 +14,7 @@ import io.vertx.core.Future; import io.vertx.core.http.HttpClientRequest; import io.vertx.core.http.HttpClientResponse; +import io.vertx.core.http.HttpConnection; import io.vertx.core.net.HostAndPort; import java.util.concurrent.CompletableFuture; import javax.annotation.Nullable; @@ -30,6 +31,9 @@ public class VertxClientSingletons { public static final VirtualField CONTEXTS = VirtualField.find(HttpClientRequest.class, Contexts.class); + private static final VirtualField CONNECTION_FIELD = + VirtualField.find(HttpClientResponse.class, HttpConnection.class); + public static Instrumenter instrumenter() { return instrumenter; } @@ -43,6 +47,16 @@ public static HostAndPort getAuthority(HttpClientRequest request) { return AUTHORITY_FIELD.get(request); } + public static void setConnection( + HttpClientResponse response, @Nullable HttpConnection connection) { + CONNECTION_FIELD.set(response, connection); + } + + @Nullable + public static HttpConnection getConnection(HttpClientResponse response) { + return CONNECTION_FIELD.get(response); + } + public static Future wrapFuture(Future future) { Context context = Context.current(); CompletableFuture result = new CompletableFuture<>(); diff --git a/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/VertxSingleConnection.java b/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/VertxSingleConnection.java index a46e51b53467..b2ca10bda6d2 100644 --- a/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/VertxSingleConnection.java +++ b/instrumentation/vertx/vertx-http-client/vertx-http-client-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/httpclient/v5_0/VertxSingleConnection.java @@ -6,6 +6,7 @@ package io.opentelemetry.javaagent.instrumentation.vertx.httpclient.v5_0; import static java.util.Objects.requireNonNull; +import static java.util.concurrent.TimeUnit.SECONDS; import io.opentelemetry.instrumentation.testing.junit.http.SingleConnection; import io.vertx.core.Future; @@ -19,6 +20,7 @@ import io.vertx.core.http.RequestOptions; import java.util.Map; import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeoutException; class VertxSingleConnection implements SingleConnection { @@ -37,14 +39,18 @@ class VertxSingleConnection implements SingleConnection { @Override public int doRequest(String path, Map headers) - throws ExecutionException, InterruptedException { + throws ExecutionException, InterruptedException, TimeoutException { String requestId = requireNonNull(headers.get(REQUEST_ID_HEADER)); RequestOptions requestOptions = new RequestOptions().setHost(host).setPort(port).setURI(path); headers.forEach(requestOptions::putHeader); Future request = httpClient.request(requestOptions); HttpClientResponse response = - request.compose(HttpClientRequest::send).toCompletionStage().toCompletableFuture().get(); + request + .compose(HttpClientRequest::send) + .toCompletionStage() + .toCompletableFuture() + .get(10, SECONDS); String responseId = response.getHeader(REQUEST_ID_HEADER); if (!requestId.equals(responseId)) { diff --git a/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/build.gradle.kts b/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/build.gradle.kts index b62ca5ee1b9e..cb1fbae6af0b 100644 --- a/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/build.gradle.kts +++ b/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/build.gradle.kts @@ -20,6 +20,8 @@ dependencies { library("io.vertx:vertx-sql-client:$version") library("io.vertx:vertx-codegen:$version") + compileOnly(project(":muzzle")) // For @NoMuzzle + implementation(project(":instrumentation:vertx:vertx-sql-client:vertx-sql-client-common-4.0:javaagent")) testInstrumentation(project(":instrumentation:jdbc:javaagent")) @@ -27,7 +29,7 @@ dependencies { testInstrumentation(project(":instrumentation:vertx:vertx-sql-client:vertx-sql-client-4.0:javaagent")) testLibrary("io.vertx:vertx-pg-client:$version") - testImplementation("io.vertx:vertx-jdbc-client:$version") + testLibrary("io.vertx:vertx-jdbc-client:$version") testImplementation("io.agroal:agroal-pool:2.5") testImplementation("org.hsqldb:hsqldb:2.3.4") } diff --git a/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sqlclient/v5_0/CommandSchedulerInstrumentation.java b/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sqlclient/v5_0/CommandSchedulerInstrumentation.java index bad7b9162aa9..f370843aea8c 100644 --- a/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sqlclient/v5_0/CommandSchedulerInstrumentation.java +++ b/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sqlclient/v5_0/CommandSchedulerInstrumentation.java @@ -8,13 +8,13 @@ import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface; import static net.bytebuddy.matcher.ElementMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; import static net.bytebuddy.matcher.ElementMatchers.takesArgument; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; -import io.vertx.sqlclient.internal.command.CommandBase; import javax.annotation.Nullable; import net.bytebuddy.asm.Advice; import net.bytebuddy.description.type.TypeDescription; @@ -37,19 +37,30 @@ class CommandSchedulerInstrumentation implements TypeInstrumentation { @Override public ElementMatcher classLoaderOptimization() { - return hasClassesNamed("io.vertx.sqlclient.internal.command.CommandScheduler"); + return hasClassesNamed("io.vertx.sqlclient.internal.command.CommandScheduler") + .or(hasClassesNamed("io.vertx.sqlclient.spi.protocol.CommandScheduler")); } @Override public ElementMatcher typeMatcher() { - return implementsInterface(named("io.vertx.sqlclient.internal.command.CommandScheduler")); + return implementsInterface( + namedOneOf( + // 5.0.0 + "io.vertx.sqlclient.internal.command.CommandScheduler", + // 5.1.0 + "io.vertx.sqlclient.spi.protocol.CommandScheduler")); } @Override public void transform(TypeTransformer transformer) { transformer.applyAdviceToMethod( named("schedule") - .and(takesArgument(0, named("io.vertx.sqlclient.internal.command.CommandBase"))) + .and( + takesArgument( + 0, + namedOneOf( + "io.vertx.sqlclient.internal.command.CommandBase", + "io.vertx.sqlclient.spi.protocol.CommandBase"))) .and(takesArgument(1, named("io.vertx.core.Completable"))), getClass().getName() + "$ScheduleAdvice"); } @@ -59,7 +70,7 @@ public static class ScheduleAdvice { @Advice.OnMethodEnter(suppress = Throwable.class, inline = false) @Nullable - public static Scope onEnter(@Advice.Argument(0) CommandBase command) { + public static Scope onEnter(@Advice.Argument(0) Object command) { Context stored = VertxSqlClientSingletons.getCommandContext(command); if (stored == null) { // First schedule call (query executor → pool or direct connection). diff --git a/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sqlclient/v5_0/VertxSqlClientInstrumentationModule.java b/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sqlclient/v5_0/VertxSqlClientInstrumentationModule.java index 2015f21424f5..43e9bb27cc35 100644 --- a/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sqlclient/v5_0/VertxSqlClientInstrumentationModule.java +++ b/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sqlclient/v5_0/VertxSqlClientInstrumentationModule.java @@ -10,10 +10,12 @@ import static java.util.Collections.singletonList; import com.google.auto.service.AutoService; +import io.opentelemetry.context.Context; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; import java.util.List; +import java.util.function.BiConsumer; import net.bytebuddy.matcher.ElementMatcher; @AutoService(InstrumentationModule.class) @@ -51,4 +53,16 @@ public List typeInstrumentations() { new QueryResultBuilderInstrumentation(), new TransactionImplInstrumentation()); } + + @Override + public void registerVirtualFields(BiConsumer virtualFieldRegistrar) { + // we add the virtual field to CommandBase manually because it is in different package in 5.0 + // and 5.1 + // used in 5.0 + virtualFieldRegistrar.accept( + "io.vertx.sqlclient.internal.command.CommandBase", Context.class.getName()); + // used in 5.1 + virtualFieldRegistrar.accept( + "io.vertx.sqlclient.spi.protocol.CommandBase", Context.class.getName()); + } } diff --git a/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sqlclient/v5_0/VertxSqlClientSingletons.java b/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sqlclient/v5_0/VertxSqlClientSingletons.java index 1d39025d9b8d..8e43dcfcf9f6 100644 --- a/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sqlclient/v5_0/VertxSqlClientSingletons.java +++ b/instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sqlclient/v5_0/VertxSqlClientSingletons.java @@ -12,12 +12,12 @@ import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.instrumentation.vertx.sqlclient.common.v4_0.VertxSqlClientRequest; import io.opentelemetry.javaagent.instrumentation.vertx.sqlclient.common.v4_0.VertxSqlInstrumenterFactory; +import io.opentelemetry.javaagent.tooling.muzzle.NoMuzzle; import io.vertx.core.Future; import io.vertx.sqlclient.Pool; import io.vertx.sqlclient.SqlConnectOptions; import io.vertx.sqlclient.SqlConnection; import io.vertx.sqlclient.internal.SqlClientBase; -import io.vertx.sqlclient.internal.command.CommandBase; import javax.annotation.Nullable; public class VertxSqlClientSingletons { @@ -34,26 +34,47 @@ public class VertxSqlClientSingletons { private static final VirtualField connectOptionsField = VirtualField.find(SqlClientBase.class, SqlConnectOptions.class); - // CommandBase is a generic type; VirtualField.find requires the raw type - @SuppressWarnings("rawtypes") - private static final VirtualField commandContextField = - VirtualField.find(CommandBase.class, Context.class); + @Nullable + private static final VirtualField commandContextField = + getCommandContextVirtualField(); public static Instrumenter instrumenter() { return instrumenter; } - // CommandBase is a generic type used as VirtualField key - @SuppressWarnings("rawtypes") + @NoMuzzle // to skip virtual field detection in this method + @SuppressWarnings("unchecked") // virtual field key type is not known at compile time + private static VirtualField getCommandContextVirtualField() { + // CommandBase that we want to attach context to is in different packages in 5.0 and 5.1 + Class commandClass = null; + try { + // 5.0.0 + commandClass = Class.forName("io.vertx.sqlclient.internal.command.CommandBase"); + } catch (ClassNotFoundException ignored) { + // ignored + } + if (commandClass == null) { + try { + // 5.1.0 + commandClass = Class.forName("io.vertx.sqlclient.spi.protocol.CommandBase"); + } catch (ClassNotFoundException ignored) { + // ignored + } + } + return commandClass != null + ? (VirtualField) VirtualField.find(commandClass, Context.class) + : null; + } + @Nullable - public static Context getCommandContext(CommandBase command) { - return commandContextField.get(command); + public static Context getCommandContext(Object command) { + return commandContextField != null ? commandContextField.get(command) : null; } - // CommandBase is a generic type used as VirtualField key - @SuppressWarnings("rawtypes") - public static void setCommandContext(CommandBase command, Context context) { - commandContextField.set(command, context); + public static void setCommandContext(Object command, Context context) { + if (commandContextField != null) { + commandContextField.set(command, context); + } } public static void storePoolDbSystem(Pool pool, String dbSystem) { diff --git a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/internal/ExperimentalInstrumentationModule.java b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/internal/ExperimentalInstrumentationModule.java index 61d27665cb56..705506e831fa 100644 --- a/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/internal/ExperimentalInstrumentationModule.java +++ b/javaagent-extension-api/src/main/java/io/opentelemetry/javaagent/extension/instrumentation/internal/ExperimentalInstrumentationModule.java @@ -11,6 +11,7 @@ import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; import java.util.List; import java.util.Map; +import java.util.function.BiConsumer; import net.bytebuddy.utility.JavaModule; /** @@ -19,6 +20,12 @@ */ public interface ExperimentalInstrumentationModule { + /** + * Register virtual field. First argument for the consumer is dot class name of the type where the + * field is added and the second argument is the dot class name of the field type. + */ + default void registerVirtualFields(BiConsumer virtualFieldRegistrar) {} + /** * Returns a list of helper classes that will be defined in the class loader of the instrumented * library. diff --git a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/VirtualFieldImplementationInstallerFactory.java b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/VirtualFieldImplementationInstallerFactory.java index c83aa3797843..c64f70eeba6e 100644 --- a/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/VirtualFieldImplementationInstallerFactory.java +++ b/javaagent-tooling/src/main/java/io/opentelemetry/javaagent/tooling/field/VirtualFieldImplementationInstallerFactory.java @@ -9,6 +9,7 @@ import io.opentelemetry.instrumentation.api.internal.RuntimeVirtualFieldSupplier; import io.opentelemetry.javaagent.extension.instrumentation.InstrumentationModule; +import io.opentelemetry.javaagent.extension.instrumentation.internal.ExperimentalInstrumentationModule; import io.opentelemetry.javaagent.tooling.TransformSafeLogger; import io.opentelemetry.javaagent.tooling.muzzle.InstrumentationModuleMuzzle; import io.opentelemetry.javaagent.tooling.muzzle.VirtualFieldMappings; @@ -31,6 +32,10 @@ public static VirtualFieldImplementationInstallerFactory getInstance() { public VirtualFieldImplementationInstaller create(InstrumentationModule instrumentationModule) { VirtualFieldMappingsBuilderImpl builder = new VirtualFieldMappingsBuilderImpl(); + if (instrumentationModule instanceof ExperimentalInstrumentationModule) { + ((ExperimentalInstrumentationModule) instrumentationModule) + .registerVirtualFields(builder::register); + } if (instrumentationModule instanceof InstrumentationModuleMuzzle) { ((InstrumentationModuleMuzzle) instrumentationModule).registerMuzzleVirtualFields(builder); } else { diff --git a/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/ReferenceCollectingClassVisitor.java b/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/ReferenceCollectingClassVisitor.java index 225835af65b4..bedbff177b9b 100644 --- a/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/ReferenceCollectingClassVisitor.java +++ b/muzzle/src/main/java/io/opentelemetry/javaagent/tooling/muzzle/ReferenceCollectingClassVisitor.java @@ -275,8 +275,13 @@ public void visitEnd() { } } } - MethodVisitor target = - skip ? methodVisitor : new AdviceReferenceMethodVisitor(methodVisitor); + MethodVisitor target; + if (skip) { + target = methodVisitor; + } else { + target = new AdviceReferenceMethodVisitor(methodVisitor); + target = new VirtualFieldCollectingMethodVisitor(target); + } if (target != null) { accept(target); } @@ -284,7 +289,7 @@ public void visitEnd() { }; // Additional references we could check // - Classes in signature (return type, params) and visible from this package - return new VirtualFieldCollectingMethodVisitor(methodNode); + return methodNode; } private static VisibilityFlag computeVisibilityFlag(int access) {