diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/build.gradle b/dd-java-agent/instrumentation/vertx-mysql-client-3.9/build.gradle index 222285d1b8e..e3285676f9f 100644 --- a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/build.gradle +++ b/dd-java-agent/instrumentation/vertx-mysql-client-3.9/build.gradle @@ -28,6 +28,7 @@ dependencies { compileOnly group: 'io.vertx', name: 'vertx-mysql-client', version: '3.9.0' testImplementation group: 'io.vertx', name: 'vertx-mysql-client', version: '3.9.0' + testImplementation project(':dd-java-agent:instrumentation:vertx-sql-common') // This is needed for the test container to start testImplementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.23' diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/SqlClientBaseAdvice.java b/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/SqlClientBaseAdvice.java deleted file mode 100644 index 91d9136a189..00000000000 --- a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/SqlClientBaseAdvice.java +++ /dev/null @@ -1,50 +0,0 @@ -package datadog.trace.instrumentation.vertx_sql_client; - -import datadog.trace.api.Pair; -import datadog.trace.bootstrap.InstrumentationContext; -import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo; -import datadog.trace.bootstrap.instrumentation.jdbc.DBQueryInfo; -import io.vertx.mysqlclient.MySQLConnection; -import io.vertx.sqlclient.Query; -import io.vertx.sqlclient.SqlClient; -import net.bytebuddy.asm.Advice; - -public class SqlClientBaseAdvice { - public static class NormalQuery { - @Advice.OnMethodExit(suppress = Throwable.class) - public static void afterQuery( - @Advice.This final SqlClient zis, - @Advice.Argument(0) final String sql, - @Advice.Return final Query query) { - Pair info = - Pair.of( - InstrumentationContext.get(SqlClient.class, DBInfo.class).get(zis), - DBQueryInfo.ofStatement(sql)); - InstrumentationContext.get(Query.class, Pair.class).put(query, info); - } - - // Limit ourselves to 3.9.x and MySQL by checking for this method that was removed in 4.x - private static void muzzleCheck(MySQLConnection connection) { - connection.close(); - } - } - - public static class PreparedQuery { - @Advice.OnMethodExit(suppress = Throwable.class) - public static void afterPreparedQuery( - @Advice.This final SqlClient zis, - @Advice.Argument(0) final String sql, - @Advice.Return final Query query) { - Pair info = - Pair.of( - InstrumentationContext.get(SqlClient.class, DBInfo.class).get(zis), - DBQueryInfo.ofPreparedStatement(sql)); - InstrumentationContext.get(Query.class, Pair.class).put(query, info); - } - - // Limit ourselves to 3.9.x and MySQL by checking for this method that was removed in 4.x - private static void muzzleCheck(MySQLConnection connection) { - connection.close(); - } - } -} diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/SqlConnectionBaseInstrumentation.java b/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/SqlConnectionBaseInstrumentation.java deleted file mode 100644 index 1704d06b688..00000000000 --- a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/SqlConnectionBaseInstrumentation.java +++ /dev/null @@ -1,54 +0,0 @@ -package datadog.trace.instrumentation.vertx_sql_client; - -import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.isMethod; -import static net.bytebuddy.matcher.ElementMatchers.isPublic; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import static net.bytebuddy.matcher.ElementMatchers.takesArguments; - -import com.google.auto.service.AutoService; -import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; -import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo; -import java.util.HashMap; -import java.util.Map; - -@AutoService(InstrumenterModule.class) -public class SqlConnectionBaseInstrumentation extends InstrumenterModule.Tracing - implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public SqlConnectionBaseInstrumentation() { - super("vertx", "vertx-sql-client"); - } - - @Override - public Map contextStore() { - Map contextStores = new HashMap<>(); - contextStores.put("io.vertx.sqlclient.SqlClient", DBInfo.class.getName()); - contextStores.put("io.vertx.sqlclient.PreparedStatement", "datadog.trace.api.Pair"); - return contextStores; - } - - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".PrepareHandlerWrapper", - }; - } - - @Override - public String instrumentedType() { - return "io.vertx.sqlclient.impl.SqlConnectionBase"; - } - - @Override - public void methodAdvice(MethodTransformer transformer) { - transformer.applyAdvice( - isMethod() - .and(isPublic()) - .and(named("prepare")) - .and(takesArguments(2)) - .and(takesArgument(0, named("java.lang.String"))) - .and(takesArgument(1, named("io.vertx.core.Handler"))), - packageName + ".SqlConnectionBasePrepareAdvice"); - } -} diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/SqlConnectionBasePrepareAdvice.java b/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/SqlConnectionBasePrepareAdvice.java deleted file mode 100644 index 9fdc0cdf7dc..00000000000 --- a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/SqlConnectionBasePrepareAdvice.java +++ /dev/null @@ -1,35 +0,0 @@ -package datadog.trace.instrumentation.vertx_sql_client; - -import datadog.trace.api.Pair; -import datadog.trace.bootstrap.InstrumentationContext; -import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo; -import datadog.trace.bootstrap.instrumentation.jdbc.DBQueryInfo; -import io.vertx.core.AsyncResult; -import io.vertx.core.Handler; -import io.vertx.mysqlclient.MySQLConnection; -import io.vertx.sqlclient.PreparedStatement; -import io.vertx.sqlclient.SqlClient; -import net.bytebuddy.asm.Advice; - -public class SqlConnectionBasePrepareAdvice { - @Advice.OnMethodEnter(suppress = Throwable.class) - public static void beforePrepare( - @Advice.This final SqlClient zis, - @Advice.Argument(0) final String sql, - @Advice.Argument(value = 1, readOnly = false) - Handler> handler) { - Pair info = - Pair.of( - InstrumentationContext.get(SqlClient.class, DBInfo.class).get(zis), - DBQueryInfo.ofStatement(sql)); - - handler = - new PrepareHandlerWrapper( - handler, InstrumentationContext.get(PreparedStatement.class, Pair.class), info); - } - - // Limit ourselves to 3.9.x and MySQL by checking for this method that was removed in 4.x - private static void muzzleCheck(MySQLConnection connection) { - connection.close(); - } -} diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/build.gradle b/dd-java-agent/instrumentation/vertx-mysql-client-4.0/build.gradle index ec8c516a81f..937a0ee67a6 100644 --- a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/build.gradle +++ b/dd-java-agent/instrumentation/vertx-mysql-client-4.0/build.gradle @@ -23,6 +23,7 @@ dependencies { compileOnly group: 'io.vertx', name: 'vertx-mysql-client', version: '4.0.0' testImplementation group: 'io.vertx', name: 'vertx-mysql-client', version: '4.0.0' + testImplementation project(':dd-java-agent:instrumentation:vertx-sql-common') // This is needed for the test container to start testImplementation group: 'mysql', name: 'mysql-connector-java', version: '8.0.23' diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/CursorImplInstrumentation.java b/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/CursorImplInstrumentation.java deleted file mode 100644 index 9348c80989b..00000000000 --- a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/CursorImplInstrumentation.java +++ /dev/null @@ -1,47 +0,0 @@ -package datadog.trace.instrumentation.vertx_sql_client_4; - -import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static java.util.Collections.singletonMap; -import static net.bytebuddy.matcher.ElementMatchers.isMethod; -import static net.bytebuddy.matcher.ElementMatchers.isPublic; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; - -import com.google.auto.service.AutoService; -import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; -import java.util.Map; - -@AutoService(InstrumenterModule.class) -public class CursorImplInstrumentation extends InstrumenterModule.Tracing - implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public CursorImplInstrumentation() { - super("vertx", "vertx-sql-client"); - } - - @Override - public Map contextStore() { - return singletonMap("io.vertx.sqlclient.PreparedStatement", "datadog.trace.api.Pair"); - } - - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".QueryResultHandlerWrapper", packageName + ".VertxSqlClientDecorator", - }; - } - - @Override - public String instrumentedType() { - return "io.vertx.sqlclient.impl.CursorImpl"; - } - - @Override - public void methodAdvice(MethodTransformer transformer) { - transformer.applyAdvice( - isMethod() - .and(isPublic()) - .and(named("read")) - .and(takesArgument(1, named("io.vertx.core.Handler"))), - packageName + ".CursorReadAdvice"); - } -} diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/CursorReadAdvice.java b/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/CursorReadAdvice.java deleted file mode 100644 index f02405d8f58..00000000000 --- a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/CursorReadAdvice.java +++ /dev/null @@ -1,56 +0,0 @@ -package datadog.trace.instrumentation.vertx_sql_client_4; - -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureSpan; -import static datadog.trace.instrumentation.vertx_sql_client_4.VertxSqlClientDecorator.DECORATE; - -import datadog.trace.api.Pair; -import datadog.trace.bootstrap.InstrumentationContext; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; -import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import io.vertx.core.AsyncResult; -import io.vertx.core.Handler; -import io.vertx.mysqlclient.MySQLConnection; -import io.vertx.sqlclient.PreparedStatement; -import io.vertx.sqlclient.Row; -import io.vertx.sqlclient.RowSet; -import net.bytebuddy.asm.Advice; -import net.bytebuddy.implementation.bytecode.assign.Assigner; - -public class CursorReadAdvice { - @Advice.OnMethodEnter(suppress = Throwable.class) - public static AgentScope beforeRead( - @Advice.Argument(value = 1, readOnly = false) Handler>> handler, - @Advice.FieldValue(value = "ps", typing = Assigner.Typing.DYNAMIC) - final PreparedStatement ps) { - if (handler instanceof QueryResultHandlerWrapper) { - return null; - } - final AgentSpan parentSpan = activeSpan(); - final AgentScope.Continuation parentContinuation = - null == parentSpan ? null : captureSpan(parentSpan); - final AgentSpan clientSpan = - DECORATE.startAndDecorateSpanForStatement( - ps, InstrumentationContext.get(PreparedStatement.class, Pair.class), true); - if (null == clientSpan) { - return null; - } - handler = new QueryResultHandlerWrapper<>(handler, clientSpan, parentContinuation); - - return activateSpan(clientSpan, true); - } - - @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void afterRead( - @Advice.Thrown final Throwable throwable, @Advice.Enter final AgentScope clientScope) { - if (null != clientScope) { - clientScope.close(); - } - } - - // Limit ourselves to 4.x by checking for the ping() method that was added in 4.x - private static void muzzleCheck(MySQLConnection connection) { - connection.ping(); - } -} diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/PrepareHandlerWrapper.java b/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/PrepareHandlerWrapper.java deleted file mode 100644 index 202db4fcc66..00000000000 --- a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/PrepareHandlerWrapper.java +++ /dev/null @@ -1,32 +0,0 @@ -package datadog.trace.instrumentation.vertx_sql_client_4; - -import datadog.trace.api.Pair; -import datadog.trace.bootstrap.ContextStore; -import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo; -import datadog.trace.bootstrap.instrumentation.jdbc.DBQueryInfo; -import io.vertx.core.AsyncResult; -import io.vertx.core.Handler; -import io.vertx.sqlclient.PreparedStatement; - -public class PrepareHandlerWrapper implements Handler> { - private final Handler> handler; - private final ContextStore contextStore; - private final Pair queryInfo; - - public PrepareHandlerWrapper( - Handler> handler, - ContextStore contextStore, - Pair queryInfo) { - this.handler = handler; - this.contextStore = contextStore; - this.queryInfo = queryInfo; - } - - @Override - public void handle(AsyncResult event) { - if (event.succeeded()) { - contextStore.put(event.result(), queryInfo); - } - handler.handle(event); - } -} diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/PreparedQueryInstrumentation.java b/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/PreparedQueryInstrumentation.java deleted file mode 100644 index b7843ccdf89..00000000000 --- a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/PreparedQueryInstrumentation.java +++ /dev/null @@ -1,72 +0,0 @@ -package datadog.trace.instrumentation.vertx_sql_client_4; - -import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.implementsInterface; -import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static java.util.Collections.singletonMap; -import static net.bytebuddy.matcher.ElementMatchers.isMethod; -import static net.bytebuddy.matcher.ElementMatchers.isPublic; -import static net.bytebuddy.matcher.ElementMatchers.isVirtual; -import static net.bytebuddy.matcher.ElementMatchers.returns; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import static net.bytebuddy.matcher.ElementMatchers.takesArguments; - -import com.google.auto.service.AutoService; -import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; -import java.util.Map; -import net.bytebuddy.description.type.TypeDescription; -import net.bytebuddy.matcher.ElementMatcher; - -@AutoService(InstrumenterModule.class) -public class PreparedQueryInstrumentation extends InstrumenterModule.Tracing - implements Instrumenter.ForTypeHierarchy, Instrumenter.HasMethodAdvice { - public PreparedQueryInstrumentation() { - super("vertx", "vertx-sql-client"); - } - - @Override - public Map contextStore() { - return singletonMap("io.vertx.sqlclient.Query", "datadog.trace.api.Pair"); - } - - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".QueryResultHandlerWrapper", packageName + ".VertxSqlClientDecorator", - }; - } - - @Override - public String hierarchyMarkerType() { - return "io.vertx.sqlclient.PreparedQuery"; - } - - @Override - public ElementMatcher hierarchyMatcher() { - return implementsInterface(named(hierarchyMarkerType())); - } - - @Override - public void methodAdvice(MethodTransformer transformer) { - transformer.applyAdvice( - isMethod() - .and(isPublic()) - .and(named("execute")) - .and(takesArguments(2)) - .and(takesArgument(1, named("io.vertx.core.Handler"))), - packageName + ".QueryAdvice$Execute"); - transformer.applyAdvice( - isMethod() - .and(isPublic()) - .and(named("executeBatch")) - .and(takesArguments(2)) - .and(takesArgument(1, named("io.vertx.core.Handler"))), - packageName + ".QueryAdvice$Execute"); - transformer.applyAdvice( - isMethod() - .and(isVirtual()) - .and(named("copy")) - .and(returns(named("io.vertx.sqlclient.impl.QueryBase"))), - packageName + ".QueryAdvice$Copy"); - } -} diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/QueryAdvice.java b/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/QueryAdvice.java deleted file mode 100644 index 3ee9ba79e59..00000000000 --- a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/QueryAdvice.java +++ /dev/null @@ -1,82 +0,0 @@ -package datadog.trace.instrumentation.vertx_sql_client_4; - -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureSpan; -import static datadog.trace.instrumentation.vertx_sql_client_4.VertxSqlClientDecorator.DECORATE; - -import datadog.trace.api.Pair; -import datadog.trace.bootstrap.ContextStore; -import datadog.trace.bootstrap.InstrumentationContext; -import datadog.trace.bootstrap.instrumentation.api.AgentScope; -import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import io.vertx.core.AsyncResult; -import io.vertx.core.Handler; -import io.vertx.mysqlclient.MySQLConnection; -import io.vertx.sqlclient.Query; -import io.vertx.sqlclient.SqlResult; -import net.bytebuddy.asm.Advice; -import net.bytebuddy.implementation.bytecode.assign.Assigner; - -public class QueryAdvice { - public static class Copy { - @Advice.OnMethodExit(suppress = Throwable.class) - public static void afterCopy( - @Advice.This final Query zis, @Advice.Return final Query ret) { - ContextStore contextStore = InstrumentationContext.get(Query.class, Pair.class); - contextStore.put(ret, contextStore.get(zis)); - } - - // Limit ourselves to 4.x by checking for the ping() method that was added in 4.x - private static void muzzleCheck(MySQLConnection connection) { - connection.ping(); - } - } - - public static class Execute { - @Advice.OnMethodEnter(suppress = Throwable.class) - public static > AgentScope beforeExecute( - @Advice.This final Query zis, - @Advice.Argument( - value = 0, - readOnly = false, - optional = true, - typing = Assigner.Typing.DYNAMIC) - Object maybeHandler, - @Advice.Argument(value = 1, readOnly = false, optional = true) - Handler> handler) { - final boolean prepared = !(maybeHandler instanceof Handler); - - final AgentSpan parentSpan = activeSpan(); - final AgentScope.Continuation parentContinuation = - null == parentSpan ? null : captureSpan(parentSpan); - final AgentSpan clientSpan = - DECORATE.startAndDecorateSpanForStatement( - zis, InstrumentationContext.get(Query.class, Pair.class), prepared); - if (null == clientSpan) { - return null; - } - if (prepared) { - handler = new QueryResultHandlerWrapper<>(handler, clientSpan, parentContinuation); - } else { - maybeHandler = - new QueryResultHandlerWrapper<>( - (Handler>) maybeHandler, clientSpan, parentContinuation); - } - return activateSpan(clientSpan); - } - - @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) - public static void afterExecute( - @Advice.Thrown final Throwable throwable, @Advice.Enter final AgentScope clientScope) { - if (null != clientScope) { - clientScope.close(); - } - } - - // Limit ourselves to 4.x by checking for the ping() method that was added in 4.x - private static void muzzleCheck(MySQLConnection connection) { - connection.ping(); - } - } -} diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/QueryImplInstrumentation.java b/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/QueryImplInstrumentation.java deleted file mode 100644 index b911e24d68d..00000000000 --- a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/QueryImplInstrumentation.java +++ /dev/null @@ -1,57 +0,0 @@ -package datadog.trace.instrumentation.vertx_sql_client_4; - -import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static java.util.Collections.singletonMap; -import static net.bytebuddy.matcher.ElementMatchers.isMethod; -import static net.bytebuddy.matcher.ElementMatchers.isPublic; -import static net.bytebuddy.matcher.ElementMatchers.isVirtual; -import static net.bytebuddy.matcher.ElementMatchers.returns; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import static net.bytebuddy.matcher.ElementMatchers.takesArguments; - -import com.google.auto.service.AutoService; -import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; -import java.util.Map; - -@AutoService(InstrumenterModule.class) -public class QueryImplInstrumentation extends InstrumenterModule.Tracing - implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public QueryImplInstrumentation() { - super("vertx", "vertx-sql-client"); - } - - @Override - public Map contextStore() { - return singletonMap("io.vertx.sqlclient.Query", "datadog.trace.api.Pair"); - } - - @Override - public String[] helperClassNames() { - return new String[] { - packageName + ".QueryResultHandlerWrapper", packageName + ".VertxSqlClientDecorator", - }; - } - - @Override - public String instrumentedType() { - return "io.vertx.sqlclient.impl.SqlClientBase$QueryImpl"; - } - - @Override - public void methodAdvice(MethodTransformer transformer) { - transformer.applyAdvice( - isMethod() - .and(isPublic()) - .and(named("execute")) - .and(takesArguments(1)) - .and(takesArgument(0, named("io.vertx.core.Handler"))), - packageName + ".QueryAdvice$Execute"); - transformer.applyAdvice( - isMethod() - .and(isVirtual()) - .and(named("copy")) - .and(returns(named("io.vertx.sqlclient.impl.QueryBase"))), - packageName + ".QueryAdvice$Copy"); - } -} diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/QueryResultHandlerWrapper.java b/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/QueryResultHandlerWrapper.java deleted file mode 100644 index e0d77a5a613..00000000000 --- a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/QueryResultHandlerWrapper.java +++ /dev/null @@ -1,41 +0,0 @@ -package datadog.trace.instrumentation.vertx_sql_client_4; - -import datadog.trace.bootstrap.instrumentation.api.AgentScope; -import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import io.vertx.core.AsyncResult; -import io.vertx.core.Handler; -import io.vertx.sqlclient.SqlResult; - -public class QueryResultHandlerWrapper> - implements Handler> { - private final Handler> handler; - private final AgentSpan clientSpan; - private final AgentScope.Continuation parentContinuation; - - public QueryResultHandlerWrapper( - final Handler> handler, - final AgentSpan clientSpan, - final AgentScope.Continuation parentContinuation) { - this.handler = handler; - this.clientSpan = clientSpan; - this.parentContinuation = parentContinuation; - } - - @Override - public void handle(final AsyncResult event) { - AgentScope scope = null; - try { - if (null != clientSpan) { - clientSpan.finish(); - } - if (null != parentContinuation) { - scope = parentContinuation.activate(); - } - handler.handle(event); - } finally { - if (null != scope) { - scope.close(); - } - } - } -} diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/SqlClientBaseInstrumentation.java b/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/SqlClientBaseInstrumentation.java deleted file mode 100644 index 920a8bfe375..00000000000 --- a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/SqlClientBaseInstrumentation.java +++ /dev/null @@ -1,53 +0,0 @@ -package datadog.trace.instrumentation.vertx_sql_client_4; - -import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; -import static net.bytebuddy.matcher.ElementMatchers.isMethod; -import static net.bytebuddy.matcher.ElementMatchers.isPublic; -import static net.bytebuddy.matcher.ElementMatchers.takesArgument; -import static net.bytebuddy.matcher.ElementMatchers.takesArguments; - -import com.google.auto.service.AutoService; -import datadog.trace.agent.tooling.Instrumenter; -import datadog.trace.agent.tooling.InstrumenterModule; -import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo; -import java.util.HashMap; -import java.util.Map; - -@AutoService(InstrumenterModule.class) -public class SqlClientBaseInstrumentation extends InstrumenterModule.Tracing - implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { - public SqlClientBaseInstrumentation() { - super("vertx", "vertx-sql-client"); - } - - @Override - public Map contextStore() { - Map contextStores = new HashMap<>(); - contextStores.put("io.vertx.sqlclient.SqlClient", DBInfo.class.getName()); - contextStores.put("io.vertx.sqlclient.Query", "datadog.trace.api.Pair"); - return contextStores; - } - - @Override - public String instrumentedType() { - return "io.vertx.sqlclient.impl.SqlClientBase"; - } - - @Override - public void methodAdvice(MethodTransformer transformer) { - transformer.applyAdvice( - isMethod() - .and(isPublic()) - .and(named("query")) - .and(takesArguments(1)) - .and(takesArgument(0, named("java.lang.String"))), - packageName + ".SqlClientBaseAdvice$NormalQuery"); - transformer.applyAdvice( - isMethod() - .and(isPublic()) - .and(named("preparedQuery")) - .and(takesArguments(1)) - .and(takesArgument(0, named("java.lang.String"))), - packageName + ".SqlClientBaseAdvice$PreparedQuery"); - } -} diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/VertxSqlClientDecorator.java b/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/VertxSqlClientDecorator.java deleted file mode 100644 index a1b19c81169..00000000000 --- a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/VertxSqlClientDecorator.java +++ /dev/null @@ -1,115 +0,0 @@ -package datadog.trace.instrumentation.vertx_sql_client_4; - -import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; -import static datadog.trace.bootstrap.instrumentation.api.Tags.DB_OPERATION; - -import datadog.trace.api.Pair; -import datadog.trace.api.naming.SpanNaming; -import datadog.trace.bootstrap.ContextStore; -import datadog.trace.bootstrap.instrumentation.api.AgentSpan; -import datadog.trace.bootstrap.instrumentation.api.InternalSpanTypes; -import datadog.trace.bootstrap.instrumentation.api.Tags; -import datadog.trace.bootstrap.instrumentation.api.UTF8BytesString; -import datadog.trace.bootstrap.instrumentation.decorator.DatabaseClientDecorator; -import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo; -import datadog.trace.bootstrap.instrumentation.jdbc.DBQueryInfo; - -public class VertxSqlClientDecorator extends DatabaseClientDecorator { - - public static final VertxSqlClientDecorator DECORATE = new VertxSqlClientDecorator(); - - private static final CharSequence VERTX_SQL = UTF8BytesString.create("vertx-sql"); - private static final CharSequence DATABASE_QUERY = UTF8BytesString.create("database.query"); - private static final UTF8BytesString DB_QUERY = UTF8BytesString.create("DB Query"); - private static final UTF8BytesString VERTX_STATEMENT = - UTF8BytesString.create("vertx-sql-statement"); - private static final UTF8BytesString VERTX_PREPARED_STATEMENT = - UTF8BytesString.create("vertx-sql-prepared_statement"); - private static final String DEFAULT_SERVICE_NAME = - SpanNaming.instance().namingSchema().database().service("vertx-sql"); - - @Override - protected String[] instrumentationNames() { - return new String[] {"vertx", "vertx-sql-client"}; - } - - @Override - protected String service() { - return DEFAULT_SERVICE_NAME; // Overridden by onConnection - } - - @Override - protected CharSequence component() { - return VERTX_SQL; // Overridden by onStatement and onPreparedStatement - } - - @Override - protected CharSequence spanType() { - return InternalSpanTypes.SQL; - } - - @Override - protected String dbType() { - return "vertx-sql"; - } - - @Override - protected String dbUser(final DBInfo info) { - return info.getUser(); - } - - @Override - protected String dbInstance(final DBInfo info) { - if (info.getInstance() != null) { - return info.getInstance(); - } else { - return info.getDb(); - } - } - - @Override - protected String dbHostname(final DBInfo info) { - return info.getHost(); - } - - public AgentSpan startAndDecorateSpanForStatement( - T query, ContextStore contextStore, boolean prepared) { - CharSequence component = prepared ? VERTX_PREPARED_STATEMENT : VERTX_STATEMENT; - AgentSpan span = startSpan(DATABASE_QUERY); - if (null == span) { - return null; - } - afterStart(span); - - DBInfo dbInfo = null; - DBQueryInfo dbQueryInfo = null; - Pair queryInfo = contextStore.get(query); - if (queryInfo != null) { - dbInfo = queryInfo.getLeft(); - dbQueryInfo = queryInfo.getRight(); - } - - if (dbInfo != null) { - processDatabaseType(span, dbInfo.getType()); - } - super.onConnection(span, dbInfo); - if (null != dbQueryInfo) { - span.setResourceName(dbQueryInfo.getSql()); - span.setTag(DB_OPERATION, dbQueryInfo.getOperation()); - } else { - span.setResourceName(DB_QUERY); - } - span.setTag(Tags.COMPONENT, component); - - return span; - } - - @Override - protected void postProcessServiceAndOperationName( - AgentSpan span, DatabaseClientDecorator.NamingEntry namingEntry) { - if (namingEntry.getService() != null) { - span.setServiceName(namingEntry.getService()); - } - span.setOperationName(namingEntry.getOperation()); - } -} diff --git a/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/build.gradle b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/build.gradle new file mode 100644 index 00000000000..24f0dfaf394 --- /dev/null +++ b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/build.gradle @@ -0,0 +1,38 @@ + +apply from: "$rootDir/gradle/java.gradle" + +muzzle { + pass { + group = 'io.vertx' + module = 'vertx-pg-client' + versions = '[4.2.0,5)' + assertInverse = true + } +} + +addTestSuiteForDir('latestDepTest', 'test') +addTestSuiteExtendingForDir('latestDepForkedTest', 'latestDepTest', 'test') + +apply from: "$rootDir/gradle/configure_tests.gradle" + +latestDepTest { + finalizedBy 'latestDepForkedTest' +} + +dependencies { + compileOnly group: 'io.vertx', name: 'vertx-pg-client', version: '4.2.0' + + testImplementation group: 'io.vertx', name: 'vertx-pg-client', version: '4.2.0' + testImplementation project(':dd-java-agent:instrumentation:vertx-sql-common') + + // This is needed for the test container to start + testImplementation group: 'com.ongres.scram', name: 'client', version: '2.1' + testImplementation group: 'org.postgresql', name: 'postgresql', version: '42.7.4' + testImplementation group: 'org.testcontainers', name: 'postgresql', version: libs.versions.testcontainers.get() + + latestDepTestImplementation group: 'io.vertx', name: 'vertx-pg-client', version: '4.+' +} + +tasks.withType(Test).configureEach { + usesService(testcontainersLimit) +} diff --git a/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgConnectionFactoryConstructorAdvice.java b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgConnectionFactoryConstructorAdvice.java new file mode 100644 index 00000000000..3acce8ef900 --- /dev/null +++ b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgConnectionFactoryConstructorAdvice.java @@ -0,0 +1,25 @@ +package datadog.trace.instrumentation.vertx_pg_client_4_2_0; + +import datadog.trace.bootstrap.InstrumentationContext; +import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo; +import io.vertx.pgclient.PgConnectOptions; +import io.vertx.pgclient.impl.PgConnectionFactory; +import net.bytebuddy.asm.Advice; + +public class PgConnectionFactoryConstructorAdvice { + @Advice.OnMethodExit(suppress = Throwable.class) + public static void afterConstructor( + @Advice.This final PgConnectionFactory zis, + @Advice.Argument(1) final PgConnectOptions options) { + DBInfo.Builder builder = DBInfo.DEFAULT.toBuilder(); + DBInfo info = + builder + .host(options.getHost()) + .port(options.getPort()) + .db(options.getDatabase()) + .user(options.getUser()) + .type("postgresql") + .build(); + InstrumentationContext.get(PgConnectionFactory.class, DBInfo.class).put(zis, info); + } +} diff --git a/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgConnectionFactoryInstrumentation.java b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgConnectionFactoryInstrumentation.java new file mode 100644 index 00000000000..b6c2390ef22 --- /dev/null +++ b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgConnectionFactoryInstrumentation.java @@ -0,0 +1,38 @@ +package datadog.trace.instrumentation.vertx_pg_client_4_2_0; + +import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; +import static java.util.Collections.singletonMap; +import static net.bytebuddy.matcher.ElementMatchers.*; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.Instrumenter; +import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo; +import java.util.Map; + +@AutoService(InstrumenterModule.class) +public class PgConnectionFactoryInstrumentation extends InstrumenterModule.Tracing + implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { + public PgConnectionFactoryInstrumentation() { + super("vertx", "vertx-sql-client"); + } + + @Override + public Map contextStore() { + return singletonMap("io.vertx.pgclient.impl.PgConnectionFactory", DBInfo.class.getName()); + } + + @Override + public String instrumentedType() { + return "io.vertx.pgclient.impl.PgConnectionFactory"; + } + + @Override + public void methodAdvice(MethodTransformer transformer) { + transformer.applyAdvice( + isConstructor() + .and(takesArguments(2)) + .and(takesArgument(1, named("io.vertx.pgclient.PgConnectOptions"))), + packageName + ".PgConnectionFactoryConstructorAdvice"); + } +} diff --git a/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgConnectionImplConstructorAdvice.java b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgConnectionImplConstructorAdvice.java new file mode 100644 index 00000000000..acbd4cc7292 --- /dev/null +++ b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgConnectionImplConstructorAdvice.java @@ -0,0 +1,16 @@ +package datadog.trace.instrumentation.vertx_pg_client_4_2_0; + +import datadog.trace.bootstrap.InstrumentationContext; +import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo; +import io.vertx.pgclient.impl.PgConnectionFactory; +import io.vertx.sqlclient.SqlClient; +import net.bytebuddy.asm.Advice; + +public class PgConnectionImplConstructorAdvice { + @Advice.OnMethodExit(suppress = Throwable.class) + public static void afterConstructor( + @Advice.This final SqlClient zis, @Advice.Argument(0) final PgConnectionFactory factory) { + InstrumentationContext.get(SqlClient.class, DBInfo.class) + .put(zis, InstrumentationContext.get(PgConnectionFactory.class, DBInfo.class).get(factory)); + } +} diff --git a/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgConnectionImplInstrumentation.java b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgConnectionImplInstrumentation.java new file mode 100644 index 00000000000..110cf9af591 --- /dev/null +++ b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgConnectionImplInstrumentation.java @@ -0,0 +1,40 @@ +package datadog.trace.instrumentation.vertx_pg_client_4_2_0; + +import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.isConstructor; +import static net.bytebuddy.matcher.ElementMatchers.takesArgument; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.Instrumenter; +import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo; +import java.util.HashMap; +import java.util.Map; + +@AutoService(InstrumenterModule.class) +public class PgConnectionImplInstrumentation extends InstrumenterModule.Tracing + implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { + public PgConnectionImplInstrumentation() { + super("vertx", "vertx-sql-client"); + } + + @Override + public Map contextStore() { + Map contextStores = new HashMap<>(); + contextStores.put("io.vertx.pgclient.impl.PgConnectionFactory", DBInfo.class.getName()); + contextStores.put("io.vertx.sqlclient.SqlClient", DBInfo.class.getName()); + return contextStores; + } + + @Override + public String instrumentedType() { + return "io.vertx.pgclient.impl.PgConnectionImpl"; + } + + @Override + public void methodAdvice(MethodTransformer transformer) { + transformer.applyAdvice( + isConstructor().and(takesArgument(0, named("io.vertx.pgclient.impl.PgConnectionFactory"))), + packageName + ".PgConnectionImplConstructorAdvice"); + } +} diff --git a/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgPoolImplAdvice.java b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgPoolImplAdvice.java new file mode 100644 index 00000000000..d1c30e77669 --- /dev/null +++ b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgPoolImplAdvice.java @@ -0,0 +1,25 @@ +package datadog.trace.instrumentation.vertx_pg_client_4_2_0; + +import datadog.trace.bootstrap.InstrumentationContext; +import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo; +import io.vertx.pgclient.PgConnectOptions; +import io.vertx.sqlclient.SqlClient; +import net.bytebuddy.asm.Advice; + +public class PgPoolImplAdvice { + + @Advice.OnMethodExit(suppress = Throwable.class) + public static void afterCreate( + @Advice.Return final SqlClient zis, @Advice.Argument(2) PgConnectOptions options) { + DBInfo.Builder builder = DBInfo.DEFAULT.toBuilder(); + DBInfo info = + builder + .host(options.getHost()) + .port(options.getPort()) + .db(options.getDatabase()) + .user(options.getUser()) + .type("postgresql") + .build(); + InstrumentationContext.get(SqlClient.class, DBInfo.class).put(zis, info); + } +} diff --git a/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgPoolImplInstrumentation.java b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgPoolImplInstrumentation.java new file mode 100644 index 00000000000..c97044540ea --- /dev/null +++ b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PgPoolImplInstrumentation.java @@ -0,0 +1,41 @@ +package datadog.trace.instrumentation.vertx_pg_client_4_2_0; + +import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; +import static java.util.Collections.singletonMap; +import static net.bytebuddy.matcher.ElementMatchers.*; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.Instrumenter; +import datadog.trace.agent.tooling.InstrumenterModule; +import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo; +import java.util.Map; + +@AutoService(InstrumenterModule.class) +public class PgPoolImplInstrumentation extends InstrumenterModule.Tracing + implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { + public PgPoolImplInstrumentation() { + super("vertx", "vertx-sql-client"); + } + + @Override + public Map contextStore() { + return singletonMap("io.vertx.sqlclient.SqlClient", DBInfo.class.getName()); + } + + @Override + public String instrumentedType() { + return "io.vertx.pgclient.impl.PgPoolImpl"; + } + + @Override + public void methodAdvice(MethodTransformer transformer) { + transformer.applyAdvice( + isStatic() + .and(isPublic()) + .and(isMethod()) + .and(named("create")) + .and(takesArguments(4)) + .and(takesArgument(2, named("io.vertx.pgclient.PgConnectOptions"))), + packageName + ".PgPoolImplAdvice"); + } +} diff --git a/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PreparedStatementImplInstrumentation.java b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PreparedStatementImplInstrumentation.java new file mode 100644 index 00000000000..d023e2483c3 --- /dev/null +++ b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PreparedStatementImplInstrumentation.java @@ -0,0 +1,38 @@ +package datadog.trace.instrumentation.vertx_pg_client_4_2_0; + +import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; +import static net.bytebuddy.matcher.ElementMatchers.*; + +import com.google.auto.service.AutoService; +import datadog.trace.agent.tooling.Instrumenter; +import datadog.trace.agent.tooling.InstrumenterModule; +import java.util.HashMap; +import java.util.Map; + +@AutoService(InstrumenterModule.class) +public class PreparedStatementImplInstrumentation extends InstrumenterModule.Tracing + implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice { + public PreparedStatementImplInstrumentation() { + super("vertx", "vertx-sql-client"); + } + + @Override + public Map contextStore() { + Map contextStores = new HashMap<>(); + contextStores.put("io.vertx.sqlclient.PreparedStatement", "datadog.trace.api.Pair"); + contextStores.put("io.vertx.sqlclient.Query", "datadog.trace.api.Pair"); + return contextStores; + } + + @Override + public String instrumentedType() { + return "io.vertx.sqlclient.impl.PreparedStatementImpl"; + } + + @Override + public void methodAdvice(MethodTransformer transformer) { + transformer.applyAdvice( + isMethod().and(isPublic()).and(named("query")).and(takesNoArguments()), + packageName + ".PreparedStatementQueryAdvice"); + } +} diff --git a/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PreparedStatementQueryAdvice.java b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PreparedStatementQueryAdvice.java new file mode 100644 index 00000000000..3845523cc27 --- /dev/null +++ b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/main/java/datadog/trace/instrumentation/vertx_pg_client_4_2_0/PreparedStatementQueryAdvice.java @@ -0,0 +1,16 @@ +package datadog.trace.instrumentation.vertx_pg_client_4_2_0; + +import datadog.trace.api.Pair; +import datadog.trace.bootstrap.InstrumentationContext; +import io.vertx.sqlclient.PreparedStatement; +import io.vertx.sqlclient.Query; +import net.bytebuddy.asm.Advice; + +public class PreparedStatementQueryAdvice { + @Advice.OnMethodExit(suppress = Throwable.class) + public static void afterQuery( + @Advice.This final PreparedStatement zis, @Advice.Return final Query query) { + InstrumentationContext.get(Query.class, Pair.class) + .put(query, InstrumentationContext.get(PreparedStatement.class, Pair.class).get(zis)); + } +} diff --git a/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/test/groovy/VertxPostgresSqlClientForkedTest.groovy b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/test/groovy/VertxPostgresSqlClientForkedTest.groovy new file mode 100644 index 00000000000..beb8baf354d --- /dev/null +++ b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/test/groovy/VertxPostgresSqlClientForkedTest.groovy @@ -0,0 +1,146 @@ +import TestDatabases.TestDBInfo +import datadog.trace.agent.test.AgentTestRunner +import datadog.trace.agent.test.asserts.TraceAssert +import datadog.trace.bootstrap.instrumentation.api.Tags +import datadog.trace.core.DDSpan +import io.vertx.core.AsyncResult +import io.vertx.core.Vertx +import io.vertx.core.VertxOptions +import io.vertx.pgclient.PgConnectOptions +import io.vertx.pgclient.PgPool +import io.vertx.sqlclient.* +import spock.lang.AutoCleanup +import spock.lang.Shared + +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit + +import static datadog.trace.agent.test.utils.TraceUtils.basicSpan +import static datadog.trace.agent.test.utils.TraceUtils.runUnderTrace + +class VertxPostgresSqlClientForkedTest extends AgentTestRunner { + @AutoCleanup + @Shared + def dbs = TestDatabases.initialise("postgres") + + @AutoCleanup + @Shared + def vertx = Vertx.vertx(new VertxOptions()) + + def "test #type without parent"() { + when: + AsyncResult> asyncResult = executeQueryWithHandler(query) + + then: + asyncResult.succeeded() + + when: + def result = asyncResult.result() + + then: + result.size() == 1 + result[0].getString(0) == '7' + assertTraces(2) { + trace(1) { + checkDBSpan(it, null, 'SELECT $1', "SELECT", dbs.DBInfos.postgresql, prepared) + } + trace(1) { + basicSpan(it, "handler") + } + } + + cleanup: + pool.close() + + where: + type | pool | query | prepared + 'prepared statement' | pool() | prepare(connection(pool), 'SELECT $1').query() | true + } + + Pool pool() { + def connectOptions = PgConnectOptions.fromUri(dbs.DBInfos.postgresql.uri) + def poolOptions = new PoolOptions().setMaxSize(2) + return PgPool.pool(vertx, connectOptions, poolOptions) + } + + def AsyncResult> executeQueryWithHandler(Query> query) { + def latch = new CountDownLatch(1) + AsyncResult> result = null + + if (query instanceof PreparedQuery) { + query.execute(Tuple.of("7")) { rowSetAR -> + runUnderTrace("handler") { + result = rowSetAR + } + latch.countDown() + } + } else { + query.execute { rowSetAR -> + runUnderTrace("handler") { + result = rowSetAR + } + latch.countDown() + } + } + assert latch.await(10, TimeUnit.SECONDS) + return result + } + + AsyncResult> queryCursorWithHandler(Cursor cursor) { + def latch = new CountDownLatch(1) + AsyncResult> result = null + cursor.read(0) { rowSetAR -> + runUnderTrace("handler") { + result = rowSetAR + } + latch.countDown() + } + assert latch.await(10, TimeUnit.SECONDS) + return result + } + + SqlConnection connection(Pool pool) { + def latch = new CountDownLatch(1) + SqlConnection result = null + pool.getConnection({ connectionAR -> + result = connectionAR.result() + latch.countDown() + }) + assert latch.await(10, TimeUnit.SECONDS) + return result + } + + PreparedStatement prepare(SqlConnection connection, String sql) { + def latch = new CountDownLatch(1) + PreparedStatement result = null + connection.prepare(sql, { statementAR -> + result = statementAR.result() + latch.countDown() + }) + assert latch.await(10, TimeUnit.SECONDS) + return result + } + + void checkDBSpan(TraceAssert ta, DDSpan parent, String resource, String operation, TestDBInfo info, boolean prepared = false) { + ta.span(ta.nextSpanId()) { + if (parent != null) { + childOf(parent) + } + operationName info ? "${info.type}.query" : "database.query" + resourceName resource + spanType "sql" + tags { + "$Tags.COMPONENT" prepared ? "vertx-sql-prepared_statement" : "vertx-sql-statement" + "$Tags.SPAN_KIND" Tags.SPAN_KIND_CLIENT + "$Tags.DB_OPERATION" operation + if (info) { + "$Tags.DB_TYPE" info.type + "$Tags.DB_INSTANCE" info.dbName + "$Tags.DB_USER" info.user + "$Tags.PEER_HOSTNAME" info.host + } + defaultTags() + } + } + } +} diff --git a/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/test/java/TestDatabases.java b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/test/java/TestDatabases.java new file mode 100644 index 00000000000..1e31905cf79 --- /dev/null +++ b/dd-java-agent/instrumentation/vertx-pg-client-4.2.0/src/test/java/TestDatabases.java @@ -0,0 +1,99 @@ +import datadog.trace.agent.test.utils.PortUtils; +import java.io.Closeable; +import java.io.IOException; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; +import org.testcontainers.containers.PostgreSQLContainer; + +public class TestDatabases implements Closeable { + + private final PostgreSQLContainer pgsql; + private final Map dbInfos; + + private TestDatabases(String dbName) { + Map infos = new HashMap<>(); + pgsql = + new PostgreSQLContainer("postgres:16-alpine") + .withDatabaseName(dbName) + .withUsername("postgres") + .withPassword("postgres"); + pgsql.start(); + TestDBInfo info = + new TestDBInfo( + pgsql.getUsername(), + pgsql.getPassword(), + pgsql.getHost(), + pgsql.getMappedPort(PostgreSQLContainer.POSTGRESQL_PORT), + "postgresql", + dbName); + PortUtils.waitForPortToOpen(info.host, info.port, 5, TimeUnit.SECONDS); + infos.put("postgresql", info); + dbInfos = Collections.unmodifiableMap(infos); + } + + public static TestDatabases initialise(String dbName) { + return new TestDatabases(dbName); + } + + @Override + public void close() throws IOException { + if (null != pgsql) { + pgsql.close(); + } + } + + public Map getDBInfos() { + return dbInfos; + } + + public static class TestDBInfo { + private final String user; + private final String password; + private final String host; + private final Integer port; + private final String type; + private final String dbName; + private final String uri; + + public TestDBInfo( + String user, String password, String host, Integer port, String type, String dbName) { + this.user = user; + this.password = password; + this.host = host; + this.port = port; + this.type = type; + this.dbName = dbName; + this.uri = type + "://" + user + ":" + password + "@" + host + ":" + port + "/" + dbName; + } + + public String getUser() { + return user; + } + + public String getPassword() { + return password; + } + + public String getHost() { + return host; + } + + public String getPort() { + return port.toString(); + } + + public String getType() { + return type; + } + + public String getDbName() { + return dbName; + } + + public String getUri() { + return uri; + } + } +} diff --git a/dd-java-agent/instrumentation/vertx-sql-common/build.gradle b/dd-java-agent/instrumentation/vertx-sql-common/build.gradle new file mode 100644 index 00000000000..35cd14a7ebf --- /dev/null +++ b/dd-java-agent/instrumentation/vertx-sql-common/build.gradle @@ -0,0 +1,5 @@ +apply from: "$rootDir/gradle/java.gradle" + +dependencies { + compileOnly group: 'io.vertx', name: 'vertx-sql-client', version: '3.9.0' +} diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/CursorImplInstrumentation.java b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/CursorImplInstrumentation.java similarity index 96% rename from dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/CursorImplInstrumentation.java rename to dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/CursorImplInstrumentation.java index 6afeb290963..8e23301bbd5 100644 --- a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/CursorImplInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/CursorImplInstrumentation.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.vertx_sql_client; +package datadog.trace.instrumentation.vertx_sql_common; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static java.util.Collections.singletonMap; diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/CursorReadAdvice.java b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/CursorReadAdvice.java similarity index 84% rename from dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/CursorReadAdvice.java rename to dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/CursorReadAdvice.java index a02e7f8fb3f..c08613fb2e0 100644 --- a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/CursorReadAdvice.java +++ b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/CursorReadAdvice.java @@ -1,9 +1,9 @@ -package datadog.trace.instrumentation.vertx_sql_client; +package datadog.trace.instrumentation.vertx_sql_common; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureSpan; -import static datadog.trace.instrumentation.vertx_sql_client.VertxSqlClientDecorator.DECORATE; +import static datadog.trace.instrumentation.vertx_sql_common.VertxSqlClientDecorator.DECORATE; import datadog.trace.api.Pair; import datadog.trace.bootstrap.InstrumentationContext; @@ -11,7 +11,6 @@ import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import io.vertx.core.AsyncResult; import io.vertx.core.Handler; -import io.vertx.mysqlclient.MySQLConnection; import io.vertx.sqlclient.PreparedStatement; import io.vertx.sqlclient.Row; import io.vertx.sqlclient.RowSet; @@ -48,9 +47,4 @@ public static void afterRead( clientScope.close(); } } - - // Limit ourselves to 3.9.x and MySQL by checking for this method that was removed in 4.x - private static void muzzleCheck(MySQLConnection connection) { - connection.close(); - } } diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/PrepareHandlerWrapper.java b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/PrepareHandlerWrapper.java similarity index 95% rename from dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/PrepareHandlerWrapper.java rename to dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/PrepareHandlerWrapper.java index 4d604798271..55b04ab3ed7 100644 --- a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/PrepareHandlerWrapper.java +++ b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/PrepareHandlerWrapper.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.vertx_sql_client; +package datadog.trace.instrumentation.vertx_sql_common; import datadog.trace.api.Pair; import datadog.trace.bootstrap.ContextStore; diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/PreparedQueryInstrumentation.java b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/PreparedQueryInstrumentation.java similarity index 97% rename from dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/PreparedQueryInstrumentation.java rename to dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/PreparedQueryInstrumentation.java index ca678b659d2..148f68936fa 100644 --- a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/PreparedQueryInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/PreparedQueryInstrumentation.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.vertx_sql_client; +package datadog.trace.instrumentation.vertx_sql_common; import static datadog.trace.agent.tooling.bytebuddy.matcher.HierarchyMatchers.implementsInterface; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/QueryAdvice.java b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/QueryAdvice.java similarity index 83% rename from dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/QueryAdvice.java rename to dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/QueryAdvice.java index 2edacf9a25d..d1acb91c408 100644 --- a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/QueryAdvice.java +++ b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/QueryAdvice.java @@ -1,9 +1,9 @@ -package datadog.trace.instrumentation.vertx_sql_client; +package datadog.trace.instrumentation.vertx_sql_common; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.captureSpan; -import static datadog.trace.instrumentation.vertx_sql_client.VertxSqlClientDecorator.DECORATE; +import static datadog.trace.instrumentation.vertx_sql_common.VertxSqlClientDecorator.DECORATE; import datadog.trace.api.Pair; import datadog.trace.bootstrap.ContextStore; @@ -12,7 +12,6 @@ import datadog.trace.bootstrap.instrumentation.api.AgentSpan; import io.vertx.core.AsyncResult; import io.vertx.core.Handler; -import io.vertx.mysqlclient.MySQLConnection; import io.vertx.sqlclient.Query; import io.vertx.sqlclient.SqlResult; import net.bytebuddy.asm.Advice; @@ -26,11 +25,6 @@ public static void afterCopy( ContextStore contextStore = InstrumentationContext.get(Query.class, Pair.class); contextStore.put(ret, contextStore.get(zis)); } - - // Limit ourselves to 3.9.x and MySQL by checking for this method that was removed in 4.x - private static void muzzleCheck(MySQLConnection connection) { - connection.close(); - } } public static class Execute { @@ -73,10 +67,5 @@ public static void afterExecute( clientScope.close(); } } - - // Limit ourselves to 3.9.x and MySQL by checking for this method that was removed in 4.x - private static void muzzleCheck(MySQLConnection connection) { - connection.close(); - } } } diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/QueryImplInstrumentation.java b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/QueryImplInstrumentation.java similarity index 97% rename from dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/QueryImplInstrumentation.java rename to dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/QueryImplInstrumentation.java index d04c2afbda2..796dfa53c89 100644 --- a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/QueryImplInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/QueryImplInstrumentation.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.vertx_sql_client; +package datadog.trace.instrumentation.vertx_sql_common; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static java.util.Collections.singletonMap; diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/QueryResultHandlerWrapper.java b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/QueryResultHandlerWrapper.java similarity index 95% rename from dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/QueryResultHandlerWrapper.java rename to dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/QueryResultHandlerWrapper.java index 972dbeacd4e..b187a1db75b 100644 --- a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/QueryResultHandlerWrapper.java +++ b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/QueryResultHandlerWrapper.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.vertx_sql_client; +package datadog.trace.instrumentation.vertx_sql_common; import datadog.trace.bootstrap.instrumentation.api.AgentScope; import datadog.trace.bootstrap.instrumentation.api.AgentSpan; diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/SqlClientBaseAdvice.java b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/SqlClientBaseAdvice.java similarity index 75% rename from dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/SqlClientBaseAdvice.java rename to dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/SqlClientBaseAdvice.java index 354440516fa..bffaf0f1b14 100644 --- a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/SqlClientBaseAdvice.java +++ b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/SqlClientBaseAdvice.java @@ -1,10 +1,9 @@ -package datadog.trace.instrumentation.vertx_sql_client_4; +package datadog.trace.instrumentation.vertx_sql_common; import datadog.trace.api.Pair; import datadog.trace.bootstrap.InstrumentationContext; import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo; import datadog.trace.bootstrap.instrumentation.jdbc.DBQueryInfo; -import io.vertx.mysqlclient.MySQLConnection; import io.vertx.sqlclient.Query; import io.vertx.sqlclient.SqlClient; import net.bytebuddy.asm.Advice; @@ -23,11 +22,6 @@ public static void afterQuery( DBQueryInfo.ofStatement(sql)); InstrumentationContext.get(Query.class, Pair.class).put(query, info); } - - // Limit ourselves to 4.x by checking for the ping() method that was added in 4.x - private static void muzzleCheck(MySQLConnection connection) { - connection.ping(); - } } public static class PreparedQuery { @@ -42,10 +36,5 @@ public static void afterPreparedQuery( DBQueryInfo.ofPreparedStatement(sql)); InstrumentationContext.get(Query.class, Pair.class).put(query, info); } - - // Limit ourselves to 4.x by checking for the ping() method that was added in 4.x - private static void muzzleCheck(MySQLConnection connection) { - connection.ping(); - } } } diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/SqlClientBaseInstrumentation.java b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/SqlClientBaseInstrumentation.java similarity index 97% rename from dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/SqlClientBaseInstrumentation.java rename to dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/SqlClientBaseInstrumentation.java index b60abb64a93..f3415958f99 100644 --- a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/SqlClientBaseInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/SqlClientBaseInstrumentation.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.vertx_sql_client; +package datadog.trace.instrumentation.vertx_sql_common; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.isMethod; diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/SqlConnectionBaseInstrumentation.java b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/SqlConnectionBaseInstrumentation.java similarity index 96% rename from dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/SqlConnectionBaseInstrumentation.java rename to dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/SqlConnectionBaseInstrumentation.java index 86b4f7a4bab..600acf86247 100644 --- a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/SqlConnectionBaseInstrumentation.java +++ b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/SqlConnectionBaseInstrumentation.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.vertx_sql_client_4; +package datadog.trace.instrumentation.vertx_sql_common; import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named; import static net.bytebuddy.matcher.ElementMatchers.isMethod; diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/SqlConnectionBasePrepareAdvice.java b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/SqlConnectionBasePrepareAdvice.java similarity index 78% rename from dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/SqlConnectionBasePrepareAdvice.java rename to dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/SqlConnectionBasePrepareAdvice.java index 736084d67a7..176d8016fca 100644 --- a/dd-java-agent/instrumentation/vertx-mysql-client-4.0/src/main/java/datadog/trace/instrumentation/vertx_sql_client_4/SqlConnectionBasePrepareAdvice.java +++ b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/SqlConnectionBasePrepareAdvice.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.vertx_sql_client_4; +package datadog.trace.instrumentation.vertx_sql_common; import datadog.trace.api.Pair; import datadog.trace.bootstrap.InstrumentationContext; @@ -6,7 +6,6 @@ import datadog.trace.bootstrap.instrumentation.jdbc.DBQueryInfo; import io.vertx.core.AsyncResult; import io.vertx.core.Handler; -import io.vertx.mysqlclient.MySQLConnection; import io.vertx.sqlclient.PreparedStatement; import io.vertx.sqlclient.SqlClient; import net.bytebuddy.asm.Advice; @@ -27,9 +26,4 @@ public static void beforePrepare( new PrepareHandlerWrapper( handler, InstrumentationContext.get(PreparedStatement.class, Pair.class), info); } - - // Limit ourselves to 4.x by checking for the ping() method that was added in 4.x - private static void muzzleCheck(MySQLConnection connection) { - connection.ping(); - } } diff --git a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/VertxSqlClientDecorator.java b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/VertxSqlClientDecorator.java similarity index 98% rename from dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/VertxSqlClientDecorator.java rename to dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/VertxSqlClientDecorator.java index d93c9604eaa..eca8852fd4b 100644 --- a/dd-java-agent/instrumentation/vertx-mysql-client-3.9/src/main/java/datadog/trace/instrumentation/vertx_sql_client/VertxSqlClientDecorator.java +++ b/dd-java-agent/instrumentation/vertx-sql-common/src/main/java/datadog/trace/instrumentation/vertx_sql_common/VertxSqlClientDecorator.java @@ -1,4 +1,4 @@ -package datadog.trace.instrumentation.vertx_sql_client; +package datadog.trace.instrumentation.vertx_sql_common; import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan; import static datadog.trace.bootstrap.instrumentation.api.Tags.DB_OPERATION; @@ -93,7 +93,6 @@ public AgentSpan startAndDecorateSpanForStatement( processDatabaseType(span, dbInfo.getType()); } super.onConnection(span, dbInfo); - if (null != dbQueryInfo) { span.setResourceName(dbQueryInfo.getSql()); span.setTag(DB_OPERATION, dbQueryInfo.getOperation()); diff --git a/settings.gradle b/settings.gradle index c79530dd5ba..0dd4017dadf 100644 --- a/settings.gradle +++ b/settings.gradle @@ -501,9 +501,11 @@ include ':dd-java-agent:instrumentation:velocity' include ':dd-java-agent:instrumentation:vertx-mysql-client-3.9' include ':dd-java-agent:instrumentation:vertx-mysql-client-4.0' include ':dd-java-agent:instrumentation:vertx-mysql-client-4.4.2' +include ':dd-java-agent:instrumentation:vertx-pg-client-4.2.0' include ':dd-java-agent:instrumentation:vertx-redis-client-3.9' include ':dd-java-agent:instrumentation:vertx-redis-client-3.9:stubs' include ':dd-java-agent:instrumentation:vertx-rx-3.5' +include ':dd-java-agent:instrumentation:vertx-sql-common' include ':dd-java-agent:instrumentation:vertx-web-3.4' include ':dd-java-agent:instrumentation:vertx-web-3.5' include ':dd-java-agent:instrumentation:vertx-web-3.9'