Skip to content

Commit 5cbd0bc

Browse files
committed
Move VirtualField.find() out of advice in CommandSchedulerInstrumentation
VirtualField.find() cannot be called directly in advice methods (fails the VirtualFieldChecker in indy mode). Move the VirtualField to a static field in VertxSqlClientSingletons and expose getCommandContext/setCommandContext helper methods that the advice calls instead.
1 parent 1344a77 commit 5cbd0bc

2 files changed

Lines changed: 24 additions & 7 deletions

File tree

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

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

88
import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.implementsInterface;
9+
import static io.opentelemetry.javaagent.instrumentation.vertx.v5_0.sql.VertxSqlClientSingletons.getCommandContext;
10+
import static io.opentelemetry.javaagent.instrumentation.vertx.v5_0.sql.VertxSqlClientSingletons.setCommandContext;
911
import static net.bytebuddy.matcher.ElementMatchers.named;
1012
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
1113

1214
import io.opentelemetry.context.Context;
1315
import io.opentelemetry.context.Scope;
14-
import io.opentelemetry.instrumentation.api.util.VirtualField;
1516
import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation;
1617
import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer;
1718
import io.vertx.sqlclient.internal.command.CommandBase;
@@ -49,20 +50,17 @@ public void transform(TypeTransformer transformer) {
4950
CommandSchedulerInstrumentation.class.getName() + "$ScheduleAdvice");
5051
}
5152

52-
// VirtualField.find requires the raw type; CommandBase is invoked reflectively by ByteBuddy
53-
@SuppressWarnings({"unused", "rawtypes"})
53+
@SuppressWarnings("unused")
5454
public static class ScheduleAdvice {
5555

5656
@Advice.OnMethodEnter(suppress = Throwable.class)
5757
@Nullable
5858
public static Scope onEnter(@Advice.Argument(0) CommandBase<?> command) {
59-
VirtualField<CommandBase, Context> contextField =
60-
VirtualField.find(CommandBase.class, Context.class);
61-
Context stored = contextField.get(command);
59+
Context stored = getCommandContext(command);
6260
if (stored == null) {
6361
// First schedule call (query executor → pool or direct connection).
6462
// The current OpenTelemetry context is correct — store it on the command.
65-
contextField.set(command, Context.current());
63+
setCommandContext(command, Context.current());
6664
return null;
6765
}
6866
// Subsequent schedule call (pool → connection).

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import static io.opentelemetry.semconv.incubating.DbIncubatingAttributes.DbSystemNameIncubatingValues.OTHER_SQL;
99

10+
import io.opentelemetry.context.Context;
1011
import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter;
1112
import io.opentelemetry.instrumentation.api.util.VirtualField;
1213
import io.opentelemetry.javaagent.instrumentation.vertx.sql.VertxSqlClientRequest;
@@ -16,6 +17,7 @@
1617
import io.vertx.sqlclient.SqlConnectOptions;
1718
import io.vertx.sqlclient.SqlConnection;
1819
import io.vertx.sqlclient.internal.SqlClientBase;
20+
import io.vertx.sqlclient.internal.command.CommandBase;
1921

2022
public final class VertxSqlClientSingletons {
2123
private static final String INSTRUMENTATION_NAME = "io.opentelemetry.vertx-sql-client-5.0";
@@ -35,6 +37,23 @@ public static Instrumenter<VertxSqlClientRequest, Void> instrumenter() {
3537
private static final VirtualField<SqlClientBase, SqlConnectOptions> connectOptionsField =
3638
VirtualField.find(SqlClientBase.class, SqlConnectOptions.class);
3739

40+
// CommandBase is a generic type; VirtualField.find requires the raw type
41+
@SuppressWarnings("rawtypes")
42+
private static final VirtualField<CommandBase, Context> commandContextField =
43+
VirtualField.find(CommandBase.class, Context.class);
44+
45+
// CommandBase is a generic type used as VirtualField key
46+
@SuppressWarnings("rawtypes")
47+
public static Context getCommandContext(CommandBase<?> command) {
48+
return commandContextField.get(command);
49+
}
50+
51+
// CommandBase is a generic type used as VirtualField key
52+
@SuppressWarnings("rawtypes")
53+
public static void setCommandContext(CommandBase<?> command, Context context) {
54+
commandContextField.set(command, context);
55+
}
56+
3857
public static void storePoolDbSystem(Pool pool, String dbSystem) {
3958
poolDbSystem.set(pool, dbSystem);
4059
}

0 commit comments

Comments
 (0)