Skip to content

Commit 3c07ff9

Browse files
committed
add instrumentation handling v4.4.2+
1 parent d90027b commit 3c07ff9

File tree

9 files changed

+267
-0
lines changed

9 files changed

+267
-0
lines changed
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
apply from: "$rootDir/gradle/java.gradle"
2+
3+
muzzle {
4+
pass {
5+
group = 'io.vertx'
6+
module = 'vertx-pg-client'
7+
versions = '[4.4.2,4.6.0)'
8+
assertInverse = true
9+
}
10+
}
11+
12+
addTestSuiteForDir('latestDepTest', 'test')
13+
addTestSuiteExtendingForDir('latestDepForkedTest', 'latestDepTest', 'test')
14+
15+
apply from: "$rootDir/gradle/configure_tests.gradle"
16+
17+
latestDepTest {
18+
finalizedBy 'latestDepForkedTest'
19+
}
20+
21+
dependencies {
22+
compileOnly group: 'io.vertx', name: 'vertx-pg-client', version: '4.4.2'
23+
}
24+
25+
tasks.withType(Test).configureEach {
26+
usesService(testcontainersLimit)
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
package datadog.trace.instrumentation.vertx_pg_client_4_4_2;
2+
3+
import datadog.trace.bootstrap.InstrumentationContext;
4+
import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo;
5+
import io.vertx.core.Future;
6+
import io.vertx.pgclient.PgConnectOptions;
7+
import io.vertx.pgclient.PgConnection;
8+
import io.vertx.pgclient.impl.PgConnectionFactory;
9+
import io.vertx.sqlclient.SqlConnectOptions;
10+
import io.vertx.sqlclient.impl.SingletonSupplier;
11+
import java.util.function.Supplier;
12+
import net.bytebuddy.asm.Advice;
13+
14+
public class PgConnectionFactoryConstructorAdvice {
15+
@Advice.OnMethodExit(suppress = Throwable.class)
16+
public static void afterConstructor(
17+
@Advice.This final PgConnectionFactory factory,
18+
@Advice.Argument(1) final Supplier<? extends Future<? extends SqlConnectOptions>> databases) {
19+
if (databases instanceof SingletonSupplier) {
20+
SqlConnectOptions options = (SqlConnectOptions) ((SingletonSupplier) databases).unwrap();
21+
DBInfo.Builder builder = DBInfo.DEFAULT.toBuilder();
22+
DBInfo info =
23+
builder
24+
.host(options.getHost())
25+
.port(options.getPort())
26+
.db(options.getDatabase())
27+
.user(options.getUser())
28+
.type("postgresql")
29+
.build();
30+
InstrumentationContext.get(PgConnectionFactory.class, DBInfo.class).put(factory, info);
31+
}
32+
}
33+
34+
// Limit ourselves to 4.4.2+ by using SingletonSupplier which was added in 4.4.2
35+
private static void muzzleCheck(PgConnection connection) {
36+
Supplier<Future<PgConnectOptions>> supplier = SingletonSupplier.wrap(new PgConnectOptions());
37+
}
38+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package datadog.trace.instrumentation.vertx_pg_client_4_4_2;
2+
3+
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
4+
import static java.util.Collections.singletonMap;
5+
import static net.bytebuddy.matcher.ElementMatchers.isConstructor;
6+
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
7+
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
8+
9+
import com.google.auto.service.AutoService;
10+
import datadog.trace.agent.tooling.Instrumenter;
11+
import datadog.trace.agent.tooling.InstrumenterModule;
12+
import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo;
13+
import java.util.Map;
14+
15+
@AutoService(InstrumenterModule.class)
16+
public class PgConnectionFactoryInstrumentation extends InstrumenterModule.Tracing
17+
implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice {
18+
public PgConnectionFactoryInstrumentation() {
19+
super("vertx", "vertx-sql-client");
20+
}
21+
22+
@Override
23+
public Map<String, String> contextStore() {
24+
return singletonMap("io.vertx.pgclient.impl.PgConnectionFactory", DBInfo.class.getName());
25+
}
26+
27+
@Override
28+
public String instrumentedType() {
29+
return "io.vertx.pgclient.impl.PgConnectionFactory";
30+
}
31+
32+
@Override
33+
public void methodAdvice(MethodTransformer transformer) {
34+
transformer.applyAdvice(
35+
isConstructor()
36+
.and(takesArguments(2))
37+
.and(takesArgument(1, named("java.util.function.Supplier"))),
38+
packageName + ".PgConnectionFactoryConstructorAdvice");
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package datadog.trace.instrumentation.vertx_pg_client_4_4_2;
2+
3+
import datadog.trace.bootstrap.InstrumentationContext;
4+
import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo;
5+
import io.vertx.core.Future;
6+
import io.vertx.pgclient.PgConnectOptions;
7+
import io.vertx.pgclient.PgConnection;
8+
import io.vertx.sqlclient.SqlClient;
9+
import io.vertx.sqlclient.SqlConnectOptions;
10+
import io.vertx.sqlclient.impl.SingletonSupplier;
11+
import java.util.function.Supplier;
12+
import net.bytebuddy.asm.Advice;
13+
14+
public class PgDriverAdvice {
15+
16+
@Advice.OnMethodExit(suppress = Throwable.class)
17+
public static void afterNewPoolImpl(
18+
@Advice.Return final SqlClient zis,
19+
@Advice.Argument(1) final Supplier<? extends Future<? extends SqlConnectOptions>> databases) {
20+
21+
if (databases instanceof SingletonSupplier) {
22+
SqlConnectOptions options = (SqlConnectOptions) ((SingletonSupplier) databases).unwrap();
23+
DBInfo.Builder builder = DBInfo.DEFAULT.toBuilder();
24+
DBInfo info =
25+
builder
26+
.host(options.getHost())
27+
.port(options.getPort())
28+
.db(options.getDatabase())
29+
.user(options.getUser())
30+
.type("postgresql")
31+
.build();
32+
InstrumentationContext.get(SqlClient.class, DBInfo.class).put(zis, info);
33+
}
34+
}
35+
36+
// Limit ourselves to 4.4.2+ by using SingletonSupplier which was added in 4.4.2
37+
private static void muzzleCheck(PgConnection connection) {
38+
Supplier<Future<PgConnectOptions>> supplier = SingletonSupplier.wrap(new PgConnectOptions());
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package datadog.trace.instrumentation.vertx_pg_client_4_4_2;
2+
3+
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
4+
import static java.util.Collections.singletonMap;
5+
import static net.bytebuddy.matcher.ElementMatchers.isPrivate;
6+
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
7+
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
8+
9+
import com.google.auto.service.AutoService;
10+
import datadog.trace.agent.tooling.Instrumenter;
11+
import datadog.trace.agent.tooling.InstrumenterModule;
12+
import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo;
13+
import java.util.Map;
14+
15+
@AutoService(InstrumenterModule.class)
16+
public class PgDriverInstrumentation extends InstrumenterModule.Tracing
17+
implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice {
18+
19+
public PgDriverInstrumentation() {
20+
super("vertx", "vertx-sql-client");
21+
}
22+
23+
@Override
24+
public Map<String, String> contextStore() {
25+
return singletonMap("io.vertx.sqlclient.SqlClient", DBInfo.class.getName());
26+
}
27+
28+
@Override
29+
public String instrumentedType() {
30+
return "io.vertx.pgclient.spi.PgDriver";
31+
}
32+
33+
@Override
34+
public void methodAdvice(MethodTransformer transformer) {
35+
transformer.applyAdvice(
36+
isPrivate()
37+
.and(named("newPoolImpl"))
38+
.and(takesArguments(4).and(takesArgument(1, named("java.util.function.Supplier")))),
39+
packageName + ".PgDriverAdvice");
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package datadog.trace.instrumentation.vertx_pg_client_4_4_2;
2+
3+
import datadog.trace.bootstrap.InstrumentationContext;
4+
import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo;
5+
import io.vertx.core.Future;
6+
import io.vertx.pgclient.PgConnectOptions;
7+
import io.vertx.pgclient.PgConnection;
8+
import io.vertx.pgclient.impl.PgConnectionFactory;
9+
import io.vertx.sqlclient.SqlClient;
10+
import io.vertx.sqlclient.impl.SingletonSupplier;
11+
import io.vertx.sqlclient.spi.ConnectionFactory;
12+
import java.util.function.Supplier;
13+
import net.bytebuddy.asm.Advice;
14+
15+
public class SqlConnectionBaseConstructorAdvice {
16+
17+
@Advice.OnMethodExit(suppress = Throwable.class)
18+
public static void afterConstructor(
19+
@Advice.This final SqlClient zis,
20+
@Advice.Argument(1) final ConnectionFactory connectionFactory) {
21+
22+
if (connectionFactory instanceof PgConnectionFactory) {
23+
InstrumentationContext.get(SqlClient.class, DBInfo.class)
24+
.put(
25+
zis,
26+
InstrumentationContext.get(PgConnectionFactory.class, DBInfo.class)
27+
.get((PgConnectionFactory) connectionFactory));
28+
}
29+
}
30+
31+
// Limit ourselves to 4.4.2+ by using SingletonSupplier which was added in 4.4.2
32+
private static void muzzleCheck(PgConnection connection) {
33+
Supplier<Future<PgConnectOptions>> supplier = SingletonSupplier.wrap(new PgConnectOptions());
34+
}
35+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package datadog.trace.instrumentation.vertx_pg_client_4_4_2;
2+
3+
import static datadog.trace.agent.tooling.bytebuddy.matcher.NameMatchers.named;
4+
import static net.bytebuddy.matcher.ElementMatchers.isConstructor;
5+
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
6+
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
7+
8+
import com.google.auto.service.AutoService;
9+
import datadog.trace.agent.tooling.Instrumenter;
10+
import datadog.trace.agent.tooling.InstrumenterModule;
11+
import datadog.trace.bootstrap.instrumentation.jdbc.DBInfo;
12+
import java.util.HashMap;
13+
import java.util.Map;
14+
15+
@AutoService(InstrumenterModule.class)
16+
public class SqlConnectionBaseInstrumentation extends InstrumenterModule.Tracing
17+
implements Instrumenter.ForSingleType, Instrumenter.HasMethodAdvice {
18+
public SqlConnectionBaseInstrumentation() {
19+
super("vertx", "vertx-sql-client");
20+
}
21+
22+
@Override
23+
public Map<String, String> contextStore() {
24+
Map<String, String> contextStores = new HashMap<>();
25+
contextStores.put("io.vertx.sqlclient.SqlClient", DBInfo.class.getName());
26+
contextStores.put("io.vertx.pgclient.impl.PgConnectionFactory", DBInfo.class.getName());
27+
return contextStores;
28+
}
29+
30+
@Override
31+
public String instrumentedType() {
32+
return "io.vertx.sqlclient.impl.SqlConnectionBase";
33+
}
34+
35+
@Override
36+
public void methodAdvice(MethodTransformer transformer) {
37+
38+
transformer.applyAdvice(
39+
isConstructor()
40+
.and(takesArguments(4))
41+
.and(takesArgument(1, named("io.vertx.sqlclient.spi.ConnectionFactory"))),
42+
packageName + ".SqlConnectionBaseConstructorAdvice");
43+
}
44+
}

dd-java-agent/instrumentation/vertx-pg-client-4/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ dependencies {
3333
testImplementation group: 'org.testcontainers', name: 'postgresql', version: libs.versions.testcontainers.get()
3434

3535
latestDepTestImplementation group: 'io.vertx', name: 'vertx-pg-client', version: '4.+'
36+
latestDepTestImplementation project(':dd-java-agent:instrumentation:vertx-pg-client-4.4.2')
3637
}
3738

3839
tasks.withType(Test).configureEach {

settings.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -502,6 +502,7 @@ include ':dd-java-agent:instrumentation:vertx-mysql-client-3.9'
502502
include ':dd-java-agent:instrumentation:vertx-mysql-client-4.0'
503503
include ':dd-java-agent:instrumentation:vertx-mysql-client-4.4.2'
504504
include ':dd-java-agent:instrumentation:vertx-pg-client-4'
505+
include ':dd-java-agent:instrumentation:vertx-pg-client-4.4.2'
505506
include ':dd-java-agent:instrumentation:vertx-redis-client-3.9'
506507
include ':dd-java-agent:instrumentation:vertx-redis-client-3.9:stubs'
507508
include ':dd-java-agent:instrumentation:vertx-rx-3.5'

0 commit comments

Comments
 (0)