Skip to content

Commit cf9d33d

Browse files
committed
Support db.system.name in vertx sql instrumentation
1 parent e76909e commit cf9d33d

11 files changed

Lines changed: 271 additions & 4 deletions

File tree

instrumentation/hibernate/hibernate-reactive-1.0/hibernate-reactive-2.0-testing/src/main/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v2_0/AbstractHibernateReactiveTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION;
1717
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE;
1818
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT;
19+
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM;
1920
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER;
21+
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DbSystemNameIncubatingValues.POSTGRESQL;
2022
import static java.util.concurrent.TimeUnit.SECONDS;
2123

2224
import io.opentelemetry.api.trace.Span;
@@ -299,6 +301,9 @@ private void assertTrace() {
299301
.hasKind(SpanKind.CLIENT)
300302
.hasParent(trace.getSpan(0))
301303
.hasAttributesSatisfyingExactly(
304+
equalTo(
305+
maybeStable(DB_SYSTEM),
306+
emitStableDatabaseSemconv() ? POSTGRESQL : null),
302307
equalTo(maybeStable(DB_NAME), DB),
303308
equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB),
304309
equalTo(

instrumentation/hibernate/hibernate-reactive-1.0/javaagent/src/hibernateReactive1Test/java/io/opentelemetry/javaagent/instrumentation/hibernate/reactive/v1_0/HibernateReactiveTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,9 @@
1616
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION;
1717
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE;
1818
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT;
19+
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM;
1920
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER;
21+
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DbSystemNameIncubatingValues.POSTGRESQL;
2022
import static java.util.concurrent.TimeUnit.SECONDS;
2123

2224
import io.opentelemetry.api.trace.Span;
@@ -310,6 +312,9 @@ private static void assertTrace() {
310312
.hasKind(SpanKind.CLIENT)
311313
.hasParent(trace.getSpan(0))
312314
.hasAttributesSatisfyingExactly(
315+
equalTo(
316+
maybeStable(DB_SYSTEM),
317+
emitStableDatabaseSemconv() ? POSTGRESQL : null),
313318
equalTo(maybeStable(DB_NAME), DB),
314319
equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB),
315320
equalTo(

instrumentation/vertx/vertx-sql-client/vertx-sql-client-4.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/PoolInstrumentation.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
99
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
1010
import static io.opentelemetry.javaagent.instrumentation.vertx.sql.VertxSqlClientUtil.getPoolSqlConnectOptions;
11+
import static io.opentelemetry.javaagent.instrumentation.vertx.sql.VertxSqlClientUtil.resolveAndStoreDbSystem;
1112
import static io.opentelemetry.javaagent.instrumentation.vertx.sql.VertxSqlClientUtil.setPoolConnectOptions;
1213
import static io.opentelemetry.javaagent.instrumentation.vertx.sql.VertxSqlClientUtil.setSqlConnectOptions;
1314
import static io.opentelemetry.javaagent.instrumentation.vertx.sql.VertxSqlClientUtil.wrapContext;
1415
import static io.opentelemetry.javaagent.instrumentation.vertx.v4_0.sql.VertxSqlClientSingletons.attachConnectOptions;
16+
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
1517
import static net.bytebuddy.matcher.ElementMatchers.isStatic;
1618
import static net.bytebuddy.matcher.ElementMatchers.named;
1719
import static net.bytebuddy.matcher.ElementMatchers.returns;
@@ -49,8 +51,8 @@ public void transform(TypeTransformer transformer) {
4951
named("pool")
5052
.and(isStatic())
5153
.and(takesArguments(3))
52-
.and(takesArgument(1, named("io.vertx.sqlclient.SqlConnectOptions")))
53-
.and(returns(named("io.vertx.sqlclient.Pool"))),
54+
.and(takesArgument(1, hasSuperType(named("io.vertx.sqlclient.SqlConnectOptions"))))
55+
.and(returns(hasSuperType(named("io.vertx.sqlclient.Pool")))),
5456
PoolInstrumentation.class.getName() + "$PoolAdvice");
5557

5658
transformer.applyAdviceToMethod(
@@ -82,6 +84,7 @@ public static void onExit(
8284
}
8385

8486
setPoolConnectOptions(pool, sqlConnectOptions);
87+
resolveAndStoreDbSystem(pool, sqlConnectOptions);
8588
setSqlConnectOptions(null);
8689
}
8790
}

instrumentation/vertx/vertx-sql-client/vertx-sql-client-4.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v4_0/sql/VertxSqlClientTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION;
2222
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE;
2323
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT;
24+
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM;
2425
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER;
26+
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DbSystemNameIncubatingValues.POSTGRESQL;
2527
import static java.util.concurrent.TimeUnit.SECONDS;
2628

2729
import io.opentelemetry.api.trace.SpanKind;
@@ -143,6 +145,9 @@ void testSimpleSelect() throws Exception {
143145
.hasKind(SpanKind.CLIENT)
144146
.hasParent(trace.getSpan(0))
145147
.hasAttributesSatisfyingExactly(
148+
equalTo(
149+
maybeStable(DB_SYSTEM),
150+
emitStableDatabaseSemconv() ? POSTGRESQL : null),
146151
equalTo(maybeStable(DB_NAME), DB),
147152
equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB),
148153
equalTo(maybeStable(DB_STATEMENT), "select * from test"),
@@ -207,6 +212,9 @@ void testInvalidQuery() throws Exception {
207212
EXCEPTION_STACKTRACE,
208213
val -> val.isInstanceOf(String.class))))
209214
.hasAttributesSatisfyingExactly(
215+
equalTo(
216+
maybeStable(DB_SYSTEM),
217+
emitStableDatabaseSemconv() ? POSTGRESQL : null),
210218
equalTo(maybeStable(DB_NAME), DB),
211219
equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB),
212220
equalTo(maybeStable(DB_STATEMENT), "invalid"),
@@ -249,6 +257,9 @@ private static void assertPreparedSelect() {
249257
.hasKind(SpanKind.CLIENT)
250258
.hasParent(trace.getSpan(0))
251259
.hasAttributesSatisfyingExactly(
260+
equalTo(
261+
maybeStable(DB_SYSTEM),
262+
emitStableDatabaseSemconv() ? POSTGRESQL : null),
252263
equalTo(maybeStable(DB_NAME), DB),
253264
equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB),
254265
equalTo(maybeStable(DB_STATEMENT), "select * from test where id = $1"),
@@ -287,6 +298,9 @@ void testBatch() throws Exception {
287298
.hasKind(SpanKind.CLIENT)
288299
.hasParent(trace.getSpan(0))
289300
.hasAttributesSatisfyingExactly(
301+
equalTo(
302+
maybeStable(DB_SYSTEM),
303+
emitStableDatabaseSemconv() ? POSTGRESQL : null),
290304
equalTo(maybeStable(DB_NAME), DB),
291305
equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB),
292306
equalTo(
@@ -384,6 +398,9 @@ void testManyQueries() throws Exception {
384398
.hasKind(SpanKind.CLIENT)
385399
.hasParent(trace.getSpan(0))
386400
.hasAttributesSatisfyingExactly(
401+
equalTo(
402+
maybeStable(DB_SYSTEM),
403+
emitStableDatabaseSemconv() ? POSTGRESQL : null),
387404
equalTo(maybeStable(DB_NAME), DB),
388405
equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB),
389406
equalTo(maybeStable(DB_STATEMENT), "select * from test"),
@@ -458,6 +475,9 @@ void testConcurrency() throws Exception {
458475
.hasKind(SpanKind.CLIENT)
459476
.hasParent(trace.getSpan(0))
460477
.hasAttributesSatisfyingExactly(
478+
equalTo(
479+
maybeStable(DB_SYSTEM),
480+
emitStableDatabaseSemconv() ? POSTGRESQL : null),
461481
equalTo(maybeStable(DB_NAME), DB),
462482
equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB),
463483
equalTo(
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.javaagent.instrumentation.vertx.v5_0.sql;
7+
8+
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
9+
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
10+
import static io.opentelemetry.javaagent.instrumentation.vertx.sql.VertxSqlClientUtil.getDbSystemFromDriverClass;
11+
import static io.opentelemetry.javaagent.instrumentation.vertx.sql.VertxSqlClientUtil.storePoolDbSystem;
12+
import static net.bytebuddy.matcher.ElementMatchers.isStatic;
13+
import static net.bytebuddy.matcher.ElementMatchers.named;
14+
import static net.bytebuddy.matcher.ElementMatchers.not;
15+
import static net.bytebuddy.matcher.ElementMatchers.returns;
16+
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
17+
18+
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
19+
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
20+
import io.vertx.sqlclient.Pool;
21+
import net.bytebuddy.asm.Advice;
22+
import net.bytebuddy.description.type.TypeDescription;
23+
import net.bytebuddy.matcher.ElementMatcher;
24+
25+
public class DriverInstrumentation implements TypeInstrumentation {
26+
27+
@Override
28+
public ElementMatcher<ClassLoader> classLoaderOptimization() {
29+
return hasClassesNamed("io.vertx.sqlclient.spi.Driver");
30+
}
31+
32+
@Override
33+
public ElementMatcher<TypeDescription> typeMatcher() {
34+
return implementsInterface(named("io.vertx.sqlclient.spi.Driver"));
35+
}
36+
37+
@Override
38+
public void transform(TypeTransformer transformer) {
39+
transformer.applyAdviceToMethod(
40+
named("newPool")
41+
.and(not(isStatic()))
42+
.and(takesArguments(6))
43+
.and(returns(named("io.vertx.sqlclient.Pool"))),
44+
DriverInstrumentation.class.getName() + "$NewPoolAdvice");
45+
}
46+
47+
@SuppressWarnings("unused")
48+
public static class NewPoolAdvice {
49+
50+
@Advice.OnMethodExit(suppress = Throwable.class)
51+
public static void onExit(@Advice.This Object driver, @Advice.Return Pool pool) {
52+
if (pool != null) {
53+
String dbSystem = getDbSystemFromDriverClass(driver.getClass().getName());
54+
if (dbSystem != null) {
55+
storePoolDbSystem(pool, dbSystem);
56+
}
57+
}
58+
}
59+
}
60+
}

instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v5_0/sql/PoolInstrumentation.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,12 @@
88
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed;
99
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
1010
import static io.opentelemetry.javaagent.instrumentation.vertx.sql.VertxSqlClientUtil.getPoolSqlConnectOptions;
11+
import static io.opentelemetry.javaagent.instrumentation.vertx.sql.VertxSqlClientUtil.resolveAndStoreDbSystem;
1112
import static io.opentelemetry.javaagent.instrumentation.vertx.sql.VertxSqlClientUtil.setPoolConnectOptions;
1213
import static io.opentelemetry.javaagent.instrumentation.vertx.sql.VertxSqlClientUtil.setSqlConnectOptions;
1314
import static io.opentelemetry.javaagent.instrumentation.vertx.sql.VertxSqlClientUtil.wrapContext;
1415
import static io.opentelemetry.javaagent.instrumentation.vertx.v5_0.sql.VertxSqlClientSingletons.attachConnectOptions;
16+
import static net.bytebuddy.matcher.ElementMatchers.hasSuperType;
1517
import static net.bytebuddy.matcher.ElementMatchers.isStatic;
1618
import static net.bytebuddy.matcher.ElementMatchers.named;
1719
import static net.bytebuddy.matcher.ElementMatchers.returns;
@@ -49,8 +51,8 @@ public void transform(TypeTransformer transformer) {
4951
named("pool")
5052
.and(isStatic())
5153
.and(takesArguments(3))
52-
.and(takesArgument(1, named("io.vertx.sqlclient.SqlConnectOptions")))
53-
.and(returns(named("io.vertx.sqlclient.Pool"))),
54+
.and(takesArgument(1, hasSuperType(named("io.vertx.sqlclient.SqlConnectOptions"))))
55+
.and(returns(hasSuperType(named("io.vertx.sqlclient.Pool")))),
5456
PoolInstrumentation.class.getName() + "$PoolAdvice");
5557

5658
transformer.applyAdviceToMethod(
@@ -83,6 +85,7 @@ public static void onExit(
8385
}
8486

8587
setPoolConnectOptions(pool, sqlConnectOptions);
88+
resolveAndStoreDbSystem(pool, sqlConnectOptions);
8689
setSqlConnectOptions(null);
8790
}
8891
}

instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/v5_0/sql/VertxSqlClientInstrumentationModule.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public List<String> injectedClassNames() {
4343
@Override
4444
public List<TypeInstrumentation> typeInstrumentations() {
4545
return asList(
46+
new DriverInstrumentation(),
4647
new PoolInstrumentation(),
4748
new SqlClientBaseInstrumentation(),
4849
new QueryExecutorInstrumentation(),

instrumentation/vertx/vertx-sql-client/vertx-sql-client-5.0/javaagent/src/test/java/io/opentelemetry/javaagent/instrumentation/vertx/v5_0/sql/VertxSqlClientTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_OPERATION;
2222
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SQL_TABLE;
2323
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_STATEMENT;
24+
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_SYSTEM;
2425
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DB_USER;
26+
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DbSystemNameIncubatingValues.POSTGRESQL;
2527
import static java.util.concurrent.TimeUnit.SECONDS;
2628

2729
import io.opentelemetry.api.trace.SpanKind;
@@ -144,6 +146,9 @@ void testSimpleSelect() throws Exception {
144146
.hasKind(SpanKind.CLIENT)
145147
.hasParent(trace.getSpan(0))
146148
.hasAttributesSatisfyingExactly(
149+
equalTo(
150+
maybeStable(DB_SYSTEM),
151+
emitStableDatabaseSemconv() ? POSTGRESQL : null),
147152
equalTo(maybeStable(DB_NAME), DB),
148153
equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB),
149154
equalTo(maybeStable(DB_STATEMENT), "select * from test"),
@@ -214,6 +219,9 @@ void testInvalidQuery() throws Exception {
214219
EXCEPTION_STACKTRACE,
215220
val -> val.isInstanceOf(String.class))))
216221
.hasAttributesSatisfyingExactly(
222+
equalTo(
223+
maybeStable(DB_SYSTEM),
224+
emitStableDatabaseSemconv() ? POSTGRESQL : null),
217225
equalTo(maybeStable(DB_NAME), DB),
218226
equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB),
219227
equalTo(maybeStable(DB_STATEMENT), "invalid"),
@@ -250,6 +258,9 @@ private static void assertPreparedSelect() {
250258
.hasKind(SpanKind.CLIENT)
251259
.hasParent(trace.getSpan(0))
252260
.hasAttributesSatisfyingExactly(
261+
equalTo(
262+
maybeStable(DB_SYSTEM),
263+
emitStableDatabaseSemconv() ? POSTGRESQL : null),
253264
equalTo(maybeStable(DB_NAME), DB),
254265
equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB),
255266
equalTo(maybeStable(DB_STATEMENT), "select * from test where id = $1"),
@@ -288,6 +299,9 @@ void testBatch() throws Exception {
288299
.hasKind(SpanKind.CLIENT)
289300
.hasParent(trace.getSpan(0))
290301
.hasAttributesSatisfyingExactly(
302+
equalTo(
303+
maybeStable(DB_SYSTEM),
304+
emitStableDatabaseSemconv() ? POSTGRESQL : null),
291305
equalTo(maybeStable(DB_NAME), DB),
292306
equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB),
293307
equalTo(
@@ -386,6 +400,9 @@ void testManyQueries() throws Exception {
386400
.hasKind(SpanKind.CLIENT)
387401
.hasParent(trace.getSpan(0))
388402
.hasAttributesSatisfyingExactly(
403+
equalTo(
404+
maybeStable(DB_SYSTEM),
405+
emitStableDatabaseSemconv() ? POSTGRESQL : null),
389406
equalTo(maybeStable(DB_NAME), DB),
390407
equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB),
391408
equalTo(maybeStable(DB_STATEMENT), "select * from test"),
@@ -460,6 +477,9 @@ void testConcurrency() throws Exception {
460477
.hasKind(SpanKind.CLIENT)
461478
.hasParent(trace.getSpan(0))
462479
.hasAttributesSatisfyingExactly(
480+
equalTo(
481+
maybeStable(DB_SYSTEM),
482+
emitStableDatabaseSemconv() ? POSTGRESQL : null),
463483
equalTo(maybeStable(DB_NAME), DB),
464484
equalTo(DB_USER, emitStableDatabaseSemconv() ? null : USER_DB),
465485
equalTo(

instrumentation/vertx/vertx-sql-client/vertx-sql-client-common/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/vertx/sql/VertxSqlClientAttributesGetter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
package io.opentelemetry.javaagent.instrumentation.vertx.sql;
77

88
import static io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlDialect.DOUBLE_QUOTES_ARE_STRING_LITERALS;
9+
import static io.opentelemetry.instrumentation.api.internal.SemconvStability.emitStableDatabaseSemconv;
910
import static java.util.Collections.singleton;
1011

1112
import io.opentelemetry.instrumentation.api.incubator.semconv.db.SqlClientAttributesGetter;
@@ -24,7 +25,12 @@ enum VertxSqlClientAttributesGetter
2425
createResponseStatusExtractor();
2526

2627
@Override
28+
@Nullable
2729
public String getDbSystemName(VertxSqlClientRequest request) {
30+
if (emitStableDatabaseSemconv()) {
31+
return request.getDbSystemName();
32+
}
33+
// preserving old behavior
2834
return null;
2935
}
3036

0 commit comments

Comments
 (0)