From f33244d4bb38850be5a3bba70f94ac2772049a8f Mon Sep 17 00:00:00 2001 From: Jonas Kunz Date: Thu, 27 Mar 2025 12:56:57 +0100 Subject: [PATCH 1/8] Move akka virtual fields to static fields --- ...OtelPrivateConstructorForUtilityClass.java | 16 +++++++++++++- .../AkkaActorCellInstrumentation.java | 12 ++++------ ...aultSystemMessageQueueInstrumentation.java | 13 +++++------ .../AkkaDispatcherInstrumentation.java | 11 ++++------ .../akkaactor/AkkaVirtualFields.java | 22 +++++++++++++++++++ 5 files changed, 51 insertions(+), 23 deletions(-) create mode 100644 instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaVirtualFields.java diff --git a/custom-checks/src/main/java/io/opentelemetry/javaagent/customchecks/OtelPrivateConstructorForUtilityClass.java b/custom-checks/src/main/java/io/opentelemetry/javaagent/customchecks/OtelPrivateConstructorForUtilityClass.java index de6586ab36f5..eefb62bcefd9 100644 --- a/custom-checks/src/main/java/io/opentelemetry/javaagent/customchecks/OtelPrivateConstructorForUtilityClass.java +++ b/custom-checks/src/main/java/io/opentelemetry/javaagent/customchecks/OtelPrivateConstructorForUtilityClass.java @@ -15,6 +15,7 @@ import com.google.errorprone.bugpatterns.PrivateConstructorForUtilityClass; import com.google.errorprone.matchers.Description; import com.sun.source.tree.ClassTree; +import com.sun.source.tree.Tree; @AutoService(BugChecker.class) @BugPattern( @@ -31,7 +32,7 @@ public class OtelPrivateConstructorForUtilityClass extends BugChecker @Override public Description matchClass(ClassTree tree, VisitorState state) { - if (tree.getSimpleName().toString().endsWith("Advice")) { + if (isAdviceOrAdviceNestedClass(tree, state)) { return NO_MATCH; } Description description = delegate.matchClass(tree, state); @@ -40,4 +41,17 @@ public Description matchClass(ClassTree tree, VisitorState state) { } return describeMatch(tree); } + + private static boolean isAdviceOrAdviceNestedClass(ClassTree tree, VisitorState state) { + if (tree.getSimpleName().toString().endsWith("Advice")) { + return true; + } + for (Tree parent : state.getPath()) { + if (parent instanceof ClassTree + && ((ClassTree) parent).getSimpleName().toString().endsWith("Advice")) { + return true; + } + } + return false; + } } diff --git a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaActorCellInstrumentation.java b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaActorCellInstrumentation.java index 161cc80a693e..328483aa9870 100644 --- a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaActorCellInstrumentation.java +++ b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaActorCellInstrumentation.java @@ -11,8 +11,6 @@ import akka.dispatch.Envelope; import akka.dispatch.sysmsg.SystemMessage; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.util.VirtualField; -import io.opentelemetry.javaagent.bootstrap.executors.PropagatedContext; import io.opentelemetry.javaagent.bootstrap.executors.TaskAdviceHelper; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -42,9 +40,8 @@ public static class InvokeAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static Scope enter(@Advice.Argument(0) Envelope envelope) { - VirtualField virtualField = - VirtualField.find(Envelope.class, PropagatedContext.class); - return TaskAdviceHelper.makePropagatedContextCurrent(virtualField, envelope); + return TaskAdviceHelper.makePropagatedContextCurrent( + AkkaVirtualFields.ENVELOPE_PROPAGATED_CONTEXT, envelope); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) @@ -60,9 +57,8 @@ public static class SystemInvokeAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static Scope enter(@Advice.Argument(0) SystemMessage systemMessage) { - VirtualField virtualField = - VirtualField.find(SystemMessage.class, PropagatedContext.class); - return TaskAdviceHelper.makePropagatedContextCurrent(virtualField, systemMessage); + return TaskAdviceHelper.makePropagatedContextCurrent( + AkkaVirtualFields.SYSTEM_MESSAGE_PROPAGATED_CONTEXT, systemMessage); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) diff --git a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDefaultSystemMessageQueueInstrumentation.java b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDefaultSystemMessageQueueInstrumentation.java index 8d6ba25fcc1c..b3c15d45608d 100644 --- a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDefaultSystemMessageQueueInstrumentation.java +++ b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDefaultSystemMessageQueueInstrumentation.java @@ -12,7 +12,6 @@ import akka.dispatch.sysmsg.SystemMessage; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.bootstrap.executors.ExecutorAdviceHelper; import io.opentelemetry.javaagent.bootstrap.executors.PropagatedContext; @@ -49,9 +48,8 @@ public static class DispatchSystemAdvice { public static PropagatedContext enter(@Advice.Argument(1) SystemMessage systemMessage) { Context context = Java8BytecodeBridge.currentContext(); if (ExecutorAdviceHelper.shouldPropagateContext(context, systemMessage)) { - VirtualField virtualField = - VirtualField.find(SystemMessage.class, PropagatedContext.class); - return ExecutorAdviceHelper.attachContextToTask(context, virtualField, systemMessage); + return ExecutorAdviceHelper.attachContextToTask( + context, AkkaVirtualFields.SYSTEM_MESSAGE_PROPAGATED_CONTEXT, systemMessage); } return null; } @@ -61,10 +59,11 @@ public static void exit( @Advice.Argument(1) SystemMessage systemMessage, @Advice.Enter PropagatedContext propagatedContext, @Advice.Thrown Throwable throwable) { - VirtualField virtualField = - VirtualField.find(SystemMessage.class, PropagatedContext.class); ExecutorAdviceHelper.cleanUpAfterSubmit( - propagatedContext, throwable, virtualField, systemMessage); + propagatedContext, + throwable, + AkkaVirtualFields.SYSTEM_MESSAGE_PROPAGATED_CONTEXT, + systemMessage); } } } diff --git a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDispatcherInstrumentation.java b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDispatcherInstrumentation.java index 66567fb20413..b711bfa39009 100644 --- a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDispatcherInstrumentation.java +++ b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDispatcherInstrumentation.java @@ -10,7 +10,6 @@ import akka.dispatch.Envelope; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.bootstrap.executors.ExecutorAdviceHelper; import io.opentelemetry.javaagent.bootstrap.executors.PropagatedContext; @@ -43,9 +42,8 @@ public static class DispatchEnvelopeAdvice { public static PropagatedContext enterDispatch(@Advice.Argument(1) Envelope envelope) { Context context = Java8BytecodeBridge.currentContext(); if (ExecutorAdviceHelper.shouldPropagateContext(context, envelope.message())) { - VirtualField virtualField = - VirtualField.find(Envelope.class, PropagatedContext.class); - return ExecutorAdviceHelper.attachContextToTask(context, virtualField, envelope); + return ExecutorAdviceHelper.attachContextToTask( + context, AkkaVirtualFields.ENVELOPE_PROPAGATED_CONTEXT, envelope); } return null; } @@ -55,9 +53,8 @@ public static void exitDispatch( @Advice.Argument(1) Envelope envelope, @Advice.Enter PropagatedContext propagatedContext, @Advice.Thrown Throwable throwable) { - VirtualField virtualField = - VirtualField.find(Envelope.class, PropagatedContext.class); - ExecutorAdviceHelper.cleanUpAfterSubmit(propagatedContext, throwable, virtualField, envelope); + ExecutorAdviceHelper.cleanUpAfterSubmit( + propagatedContext, throwable, AkkaVirtualFields.ENVELOPE_PROPAGATED_CONTEXT, envelope); } } } diff --git a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaVirtualFields.java b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaVirtualFields.java new file mode 100644 index 000000000000..d6a888eb0d5d --- /dev/null +++ b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaVirtualFields.java @@ -0,0 +1,22 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.akkaactor; + +import akka.dispatch.Envelope; +import akka.dispatch.sysmsg.SystemMessage; +import io.opentelemetry.instrumentation.api.util.VirtualField; +import io.opentelemetry.javaagent.bootstrap.executors.PropagatedContext; + +public class AkkaVirtualFields { + + private AkkaVirtualFields() {} + + public static final VirtualField ENVELOPE_PROPAGATED_CONTEXT = + VirtualField.find(Envelope.class, PropagatedContext.class); + public static final VirtualField + SYSTEM_MESSAGE_PROPAGATED_CONTEXT = + VirtualField.find(SystemMessage.class, PropagatedContext.class); +} From c9a725739d911aba83d1ccd4722c59bc4ebba71e Mon Sep 17 00:00:00 2001 From: Jonas Kunz Date: Thu, 27 Mar 2025 14:34:09 +0100 Subject: [PATCH 2/8] Add armeria as simple example --- .../grpc/v1_14/ArmeriaServerCallInstrumentation.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaServerCallInstrumentation.java b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaServerCallInstrumentation.java index 7371894856ec..27f157f713e5 100644 --- a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaServerCallInstrumentation.java +++ b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaServerCallInstrumentation.java @@ -34,6 +34,11 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class ConstructorAdvice { + public static class VirtualFields { + public static final VirtualField, String> SERVER_CALL_AUTHORITY = + VirtualField.find(ServerCall.class, String.class); + } + @Advice.OnMethodExit(suppress = Throwable.class) public static void onExit( @Advice.This ServerCall serverCall, @@ -43,7 +48,7 @@ public static void onExit( // ArmeriaServerCall does not implement getAuthority. We will store the value for authority // header as virtual field, this field is read in grpc instrumentation in // TracingServerInterceptor - VirtualField.find(ServerCall.class, String.class).set(serverCall, authority); + VirtualFields.SERVER_CALL_AUTHORITY.set(serverCall, authority); } } } From b3eee088e62efd87cd9f39e8cb42ba816ac18024 Mon Sep 17 00:00:00 2001 From: Jonas Kunz Date: Thu, 27 Mar 2025 16:01:54 +0100 Subject: [PATCH 3/8] Add remaining akka virtual field usages --- .../AkkaActorCellInstrumentation.java | 4 ++-- ...aultSystemMessageQueueInstrumentation.java | 4 ++-- .../AkkaDispatcherInstrumentation.java | 4 ++-- ...aVirtualFields.java => VirtualFields.java} | 4 ++-- .../AkkaForkJoinPoolInstrumentation.java | 11 ++++----- .../AkkaForkJoinTaskInstrumentation.java | 18 ++++++-------- .../akkaactor/VirtualFields.java | 24 +++++++++++++++++++ .../route/PathMatcherInstrumentation.java | 3 +-- .../PathMatcherStaticInstrumentation.java | 3 +-- .../akkahttp/server/route/VirtualFields.java | 17 +++++++++++++ 10 files changed, 62 insertions(+), 30 deletions(-) rename instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/{AkkaVirtualFields.java => VirtualFields.java} (91%) create mode 100644 instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/VirtualFields.java create mode 100644 instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/VirtualFields.java diff --git a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaActorCellInstrumentation.java b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaActorCellInstrumentation.java index 328483aa9870..f99a4e694f5d 100644 --- a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaActorCellInstrumentation.java +++ b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaActorCellInstrumentation.java @@ -41,7 +41,7 @@ public static class InvokeAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static Scope enter(@Advice.Argument(0) Envelope envelope) { return TaskAdviceHelper.makePropagatedContextCurrent( - AkkaVirtualFields.ENVELOPE_PROPAGATED_CONTEXT, envelope); + VirtualFields.ENVELOPE_PROPAGATED_CONTEXT, envelope); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) @@ -58,7 +58,7 @@ public static class SystemInvokeAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) public static Scope enter(@Advice.Argument(0) SystemMessage systemMessage) { return TaskAdviceHelper.makePropagatedContextCurrent( - AkkaVirtualFields.SYSTEM_MESSAGE_PROPAGATED_CONTEXT, systemMessage); + VirtualFields.SYSTEM_MESSAGE_PROPAGATED_CONTEXT, systemMessage); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) diff --git a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDefaultSystemMessageQueueInstrumentation.java b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDefaultSystemMessageQueueInstrumentation.java index b3c15d45608d..5a23c0577da0 100644 --- a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDefaultSystemMessageQueueInstrumentation.java +++ b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDefaultSystemMessageQueueInstrumentation.java @@ -49,7 +49,7 @@ public static PropagatedContext enter(@Advice.Argument(1) SystemMessage systemMe Context context = Java8BytecodeBridge.currentContext(); if (ExecutorAdviceHelper.shouldPropagateContext(context, systemMessage)) { return ExecutorAdviceHelper.attachContextToTask( - context, AkkaVirtualFields.SYSTEM_MESSAGE_PROPAGATED_CONTEXT, systemMessage); + context, VirtualFields.SYSTEM_MESSAGE_PROPAGATED_CONTEXT, systemMessage); } return null; } @@ -62,7 +62,7 @@ public static void exit( ExecutorAdviceHelper.cleanUpAfterSubmit( propagatedContext, throwable, - AkkaVirtualFields.SYSTEM_MESSAGE_PROPAGATED_CONTEXT, + VirtualFields.SYSTEM_MESSAGE_PROPAGATED_CONTEXT, systemMessage); } } diff --git a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDispatcherInstrumentation.java b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDispatcherInstrumentation.java index b711bfa39009..be1773a4eadf 100644 --- a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDispatcherInstrumentation.java +++ b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaDispatcherInstrumentation.java @@ -43,7 +43,7 @@ public static PropagatedContext enterDispatch(@Advice.Argument(1) Envelope envel Context context = Java8BytecodeBridge.currentContext(); if (ExecutorAdviceHelper.shouldPropagateContext(context, envelope.message())) { return ExecutorAdviceHelper.attachContextToTask( - context, AkkaVirtualFields.ENVELOPE_PROPAGATED_CONTEXT, envelope); + context, VirtualFields.ENVELOPE_PROPAGATED_CONTEXT, envelope); } return null; } @@ -54,7 +54,7 @@ public static void exitDispatch( @Advice.Enter PropagatedContext propagatedContext, @Advice.Thrown Throwable throwable) { ExecutorAdviceHelper.cleanUpAfterSubmit( - propagatedContext, throwable, AkkaVirtualFields.ENVELOPE_PROPAGATED_CONTEXT, envelope); + propagatedContext, throwable, VirtualFields.ENVELOPE_PROPAGATED_CONTEXT, envelope); } } } diff --git a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaVirtualFields.java b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/VirtualFields.java similarity index 91% rename from instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaVirtualFields.java rename to instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/VirtualFields.java index d6a888eb0d5d..e9772a59b3bf 100644 --- a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaVirtualFields.java +++ b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/VirtualFields.java @@ -10,9 +10,9 @@ import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.bootstrap.executors.PropagatedContext; -public class AkkaVirtualFields { +public class VirtualFields { - private AkkaVirtualFields() {} + private VirtualFields() {} public static final VirtualField ENVELOPE_PROPAGATED_CONTEXT = VirtualField.find(Envelope.class, PropagatedContext.class); diff --git a/instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaForkJoinPoolInstrumentation.java b/instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaForkJoinPoolInstrumentation.java index 2607f990b5ec..40556c79cb3e 100644 --- a/instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaForkJoinPoolInstrumentation.java +++ b/instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaForkJoinPoolInstrumentation.java @@ -10,7 +10,6 @@ import akka.dispatch.forkjoin.ForkJoinTask; import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.bootstrap.Java8BytecodeBridge; import io.opentelemetry.javaagent.bootstrap.executors.ExecutorAdviceHelper; import io.opentelemetry.javaagent.bootstrap.executors.PropagatedContext; @@ -51,9 +50,8 @@ public static class SetAkkaForkJoinStateAdvice { public static PropagatedContext enterJobSubmit(@Advice.Argument(0) ForkJoinTask task) { Context context = Java8BytecodeBridge.currentContext(); if (ExecutorAdviceHelper.shouldPropagateContext(context, task)) { - VirtualField, PropagatedContext> virtualField = - VirtualField.find(ForkJoinTask.class, PropagatedContext.class); - return ExecutorAdviceHelper.attachContextToTask(context, virtualField, task); + return ExecutorAdviceHelper.attachContextToTask( + context, VirtualFields.FORK_JOIN_TASK_PROPAGATED_CONTEXT, task); } return null; } @@ -63,9 +61,8 @@ public static void exitJobSubmit( @Advice.Argument(0) ForkJoinTask task, @Advice.Enter PropagatedContext propagatedContext, @Advice.Thrown Throwable throwable) { - VirtualField, PropagatedContext> virtualField = - VirtualField.find(ForkJoinTask.class, PropagatedContext.class); - ExecutorAdviceHelper.cleanUpAfterSubmit(propagatedContext, throwable, virtualField, task); + ExecutorAdviceHelper.cleanUpAfterSubmit( + propagatedContext, throwable, VirtualFields.FORK_JOIN_TASK_PROPAGATED_CONTEXT, task); } } } diff --git a/instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaForkJoinTaskInstrumentation.java b/instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaForkJoinTaskInstrumentation.java index a13f5de5536c..66fe65df953a 100644 --- a/instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaForkJoinTaskInstrumentation.java +++ b/instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/AkkaForkJoinTaskInstrumentation.java @@ -15,8 +15,6 @@ import akka.dispatch.forkjoin.ForkJoinPool; import akka.dispatch.forkjoin.ForkJoinTask; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.util.VirtualField; -import io.opentelemetry.javaagent.bootstrap.executors.PropagatedContext; import io.opentelemetry.javaagent.bootstrap.executors.TaskAdviceHelper; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; @@ -62,14 +60,13 @@ public static class ForkJoinTaskAdvice { */ @Advice.OnMethodEnter(suppress = Throwable.class) public static Scope enter(@Advice.This ForkJoinTask thiz) { - VirtualField, PropagatedContext> virtualField = - VirtualField.find(ForkJoinTask.class, PropagatedContext.class); - Scope scope = TaskAdviceHelper.makePropagatedContextCurrent(virtualField, thiz); + Scope scope = + TaskAdviceHelper.makePropagatedContextCurrent( + VirtualFields.FORK_JOIN_TASK_PROPAGATED_CONTEXT, thiz); if (thiz instanceof Runnable) { - VirtualField runnableVirtualField = - VirtualField.find(Runnable.class, PropagatedContext.class); Scope newScope = - TaskAdviceHelper.makePropagatedContextCurrent(runnableVirtualField, (Runnable) thiz); + TaskAdviceHelper.makePropagatedContextCurrent( + VirtualFields.RUNNABLE_PROPAGATED_CONTEXT, (Runnable) thiz); if (null != newScope) { if (null != scope) { newScope.close(); @@ -79,10 +76,9 @@ public static Scope enter(@Advice.This ForkJoinTask thiz) { } } if (thiz instanceof Callable) { - VirtualField, PropagatedContext> callableVirtualField = - VirtualField.find(Callable.class, PropagatedContext.class); Scope newScope = - TaskAdviceHelper.makePropagatedContextCurrent(callableVirtualField, (Callable) thiz); + TaskAdviceHelper.makePropagatedContextCurrent( + VirtualFields.CALLABLE_PROPAGATED_CONTEXT, (Callable) thiz); if (null != newScope) { if (null != scope) { newScope.close(); diff --git a/instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/VirtualFields.java b/instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/VirtualFields.java new file mode 100644 index 000000000000..0bec54c43844 --- /dev/null +++ b/instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/VirtualFields.java @@ -0,0 +1,24 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.akkaactor; + +import akka.dispatch.forkjoin.ForkJoinTask; +import io.opentelemetry.instrumentation.api.util.VirtualField; +import io.opentelemetry.javaagent.bootstrap.executors.PropagatedContext; +import java.util.concurrent.Callable; + +public class VirtualFields { + + private VirtualFields() {} + + public static final VirtualField, PropagatedContext> + FORK_JOIN_TASK_PROPAGATED_CONTEXT = + VirtualField.find(ForkJoinTask.class, PropagatedContext.class); + public static final VirtualField RUNNABLE_PROPAGATED_CONTEXT = + VirtualField.find(Runnable.class, PropagatedContext.class); + public static final VirtualField CALLABLE_PROPAGATED_CONTEXT = + VirtualField.find(Callable.class, PropagatedContext.class); +} diff --git a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherInstrumentation.java b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherInstrumentation.java index c0e3ef261c37..a69da039e7ea 100644 --- a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherInstrumentation.java +++ b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherInstrumentation.java @@ -11,7 +11,6 @@ import akka.http.scaladsl.model.Uri; import akka.http.scaladsl.server.PathMatcher; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; @@ -41,7 +40,7 @@ public static void onEnter( @Advice.Argument(0) Uri.Path prefix, @Advice.Return PathMatcher result) { // store the path being matched inside a VirtualField on the given matcher, so it can be used // for constructing the route - VirtualField.find(PathMatcher.class, String.class).set(result, prefix.toString()); + VirtualFields.PATH_MATCHER_ROUTE.set(result, prefix.toString()); } } } diff --git a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherStaticInstrumentation.java b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherStaticInstrumentation.java index 41d952ce177e..245a52372060 100644 --- a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherStaticInstrumentation.java +++ b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherStaticInstrumentation.java @@ -12,7 +12,6 @@ import akka.http.scaladsl.model.Uri; import akka.http.scaladsl.server.PathMatcher; import akka.http.scaladsl.server.PathMatchers; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; @@ -48,7 +47,7 @@ public static void onExit( } // if present use the matched path that was remembered in PathMatcherInstrumentation, // otherwise just use a * - String prefix = VirtualField.find(PathMatcher.class, String.class).get(pathMatcher); + String prefix = VirtualFields.PATH_MATCHER_ROUTE.get(pathMatcher); if (prefix == null) { if (PathMatchers.Slash$.class == pathMatcher.getClass()) { prefix = "/"; diff --git a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/VirtualFields.java b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/VirtualFields.java new file mode 100644 index 000000000000..8e6b500e2927 --- /dev/null +++ b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/VirtualFields.java @@ -0,0 +1,17 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.akkahttp.server.route; + +import akka.http.scaladsl.server.PathMatcher; +import io.opentelemetry.instrumentation.api.util.VirtualField; + +public class VirtualFields { + + private VirtualFields() {} + + public static final VirtualField, String> PATH_MATCHER_ROUTE = + VirtualField.find(PathMatcher.class, String.class); +} From e02de3ad06073eeb6185bb89414c7bd7054ca007 Mon Sep 17 00:00:00 2001 From: Jonas Kunz Date: Thu, 27 Mar 2025 16:40:49 +0100 Subject: [PATCH 4/8] Fix rawtype usage --- .../javaagent/instrumentation/akkaactor/VirtualFields.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/VirtualFields.java b/instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/VirtualFields.java index 0bec54c43844..2ff4df7f029f 100644 --- a/instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/VirtualFields.java +++ b/instrumentation/akka/akka-actor-fork-join-2.5/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/VirtualFields.java @@ -19,6 +19,6 @@ private VirtualFields() {} VirtualField.find(ForkJoinTask.class, PropagatedContext.class); public static final VirtualField RUNNABLE_PROPAGATED_CONTEXT = VirtualField.find(Runnable.class, PropagatedContext.class); - public static final VirtualField CALLABLE_PROPAGATED_CONTEXT = + public static final VirtualField, PropagatedContext> CALLABLE_PROPAGATED_CONTEXT = VirtualField.find(Callable.class, PropagatedContext.class); } From 0f1460d55822368c6e1f25d048ebd57b4fb1b651 Mon Sep 17 00:00:00 2001 From: Jonas Kunz Date: Tue, 1 Apr 2025 11:15:47 +0200 Subject: [PATCH 5/8] Add utility class for grpc authority storage --- .../ArmeriaServerCallInstrumentation.java | 8 ++----- .../grpc/v1_6/GrpcAuthorityStorage.java | 22 +++++++++++++++++++ .../grpc/v1_6/TracingServerInterceptor.java | 6 +---- 3 files changed, 25 insertions(+), 11 deletions(-) create mode 100644 instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAuthorityStorage.java diff --git a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaServerCallInstrumentation.java b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaServerCallInstrumentation.java index 27f157f713e5..0e8b877b579e 100644 --- a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaServerCallInstrumentation.java +++ b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaServerCallInstrumentation.java @@ -11,6 +11,7 @@ import com.linecorp.armeria.server.ServiceRequestContext; import io.grpc.ServerCall; import io.opentelemetry.instrumentation.api.util.VirtualField; +import io.opentelemetry.instrumentation.grpc.v1_6.GrpcAuthorityStorage; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import net.bytebuddy.asm.Advice; @@ -34,11 +35,6 @@ public void transform(TypeTransformer transformer) { @SuppressWarnings("unused") public static class ConstructorAdvice { - public static class VirtualFields { - public static final VirtualField, String> SERVER_CALL_AUTHORITY = - VirtualField.find(ServerCall.class, String.class); - } - @Advice.OnMethodExit(suppress = Throwable.class) public static void onExit( @Advice.This ServerCall serverCall, @@ -48,7 +44,7 @@ public static void onExit( // ArmeriaServerCall does not implement getAuthority. We will store the value for authority // header as virtual field, this field is read in grpc instrumentation in // TracingServerInterceptor - VirtualFields.SERVER_CALL_AUTHORITY.set(serverCall, authority); + GrpcAuthorityStorage.setAuthority(serverCall, authority); } } } diff --git a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAuthorityStorage.java b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAuthorityStorage.java new file mode 100644 index 000000000000..080c99dbf5c9 --- /dev/null +++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAuthorityStorage.java @@ -0,0 +1,22 @@ +package io.opentelemetry.instrumentation.grpc.v1_6; + +import io.grpc.ServerCall; +import io.opentelemetry.instrumentation.api.util.VirtualField; + +/** + * In case a {@link ServerCall} implementation does not implement {@link ServerCall#getAuthority()} like armeria, + * this utility class should be used to provide the authority instead + */ +public class GrpcAuthorityStorage { + + private static final VirtualField, String> AUTHORITY_FIELD = + VirtualField.find(ServerCall.class, String.class); + + public static void setAuthority(ServerCall call, String authority) { + AUTHORITY_FIELD.set(call, authority); + } + + static String getAuthority(ServerCall call) { + return AUTHORITY_FIELD.get(call); + } +} diff --git a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/TracingServerInterceptor.java b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/TracingServerInterceptor.java index caa992f9a997..d52c332ec50a 100644 --- a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/TracingServerInterceptor.java +++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/TracingServerInterceptor.java @@ -20,7 +20,6 @@ import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; -import io.opentelemetry.instrumentation.api.util.VirtualField; import java.util.concurrent.atomic.AtomicLongFieldUpdater; final class TracingServerInterceptor implements ServerInterceptor { @@ -46,9 +45,6 @@ final class TracingServerInterceptor implements ServerInterceptor { private static final AtomicLongFieldUpdater RECEIVED_MESSAGE_ID_UPDATER = AtomicLongFieldUpdater.newUpdater(TracingServerCall.class, "receivedMessageId"); - private static final VirtualField, String> AUTHORITY_FIELD = - VirtualField.find(ServerCall.class, String.class); - private final Instrumenter instrumenter; private final boolean captureExperimentalSpanAttributes; private final boolean emitMessageEvents; @@ -72,7 +68,7 @@ public ServerCall.Listener interceptCall( // Armeria grpc server call does not implement getAuthority(). In // ArmeriaServerCallInstrumentation we store the value for the authority header in a virtual // field. - authority = AUTHORITY_FIELD.get(call); + authority = GrpcAuthorityStorage.getAuthority(call); } GrpcRequest request = new GrpcRequest( From b88b9fee57dcb495f478a68bd320c61f3ec97f08 Mon Sep 17 00:00:00 2001 From: Jonas Kunz Date: Tue, 1 Apr 2025 11:16:33 +0200 Subject: [PATCH 6/8] Revert changes to OtelPrivateConstructorForUtilityClass --- .../OtelPrivateConstructorForUtilityClass.java | 16 +--------------- 1 file changed, 1 insertion(+), 15 deletions(-) diff --git a/custom-checks/src/main/java/io/opentelemetry/javaagent/customchecks/OtelPrivateConstructorForUtilityClass.java b/custom-checks/src/main/java/io/opentelemetry/javaagent/customchecks/OtelPrivateConstructorForUtilityClass.java index eefb62bcefd9..de6586ab36f5 100644 --- a/custom-checks/src/main/java/io/opentelemetry/javaagent/customchecks/OtelPrivateConstructorForUtilityClass.java +++ b/custom-checks/src/main/java/io/opentelemetry/javaagent/customchecks/OtelPrivateConstructorForUtilityClass.java @@ -15,7 +15,6 @@ import com.google.errorprone.bugpatterns.PrivateConstructorForUtilityClass; import com.google.errorprone.matchers.Description; import com.sun.source.tree.ClassTree; -import com.sun.source.tree.Tree; @AutoService(BugChecker.class) @BugPattern( @@ -32,7 +31,7 @@ public class OtelPrivateConstructorForUtilityClass extends BugChecker @Override public Description matchClass(ClassTree tree, VisitorState state) { - if (isAdviceOrAdviceNestedClass(tree, state)) { + if (tree.getSimpleName().toString().endsWith("Advice")) { return NO_MATCH; } Description description = delegate.matchClass(tree, state); @@ -41,17 +40,4 @@ public Description matchClass(ClassTree tree, VisitorState state) { } return describeMatch(tree); } - - private static boolean isAdviceOrAdviceNestedClass(ClassTree tree, VisitorState state) { - if (tree.getSimpleName().toString().endsWith("Advice")) { - return true; - } - for (Tree parent : state.getPath()) { - if (parent instanceof ClassTree - && ((ClassTree) parent).getSimpleName().toString().endsWith("Advice")) { - return true; - } - } - return false; - } } From db122afcebcb7ce25174331b69050ba03c1a6970 Mon Sep 17 00:00:00 2001 From: Jonas Kunz Date: Tue, 1 Apr 2025 11:22:30 +0200 Subject: [PATCH 7/8] Fix compilation warnings and spotless --- .../grpc/v1_14/ArmeriaServerCallInstrumentation.java | 1 - .../grpc/v1_6/GrpcAuthorityStorage.java | 11 +++++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaServerCallInstrumentation.java b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaServerCallInstrumentation.java index 0e8b877b579e..bb14e18b333e 100644 --- a/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaServerCallInstrumentation.java +++ b/instrumentation/armeria/armeria-grpc-1.14/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/armeria/grpc/v1_14/ArmeriaServerCallInstrumentation.java @@ -10,7 +10,6 @@ import com.linecorp.armeria.server.ServiceRequestContext; import io.grpc.ServerCall; -import io.opentelemetry.instrumentation.api.util.VirtualField; import io.opentelemetry.instrumentation.grpc.v1_6.GrpcAuthorityStorage; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; diff --git a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAuthorityStorage.java b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAuthorityStorage.java index 080c99dbf5c9..78fa94727824 100644 --- a/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAuthorityStorage.java +++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAuthorityStorage.java @@ -1,17 +1,24 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + package io.opentelemetry.instrumentation.grpc.v1_6; import io.grpc.ServerCall; import io.opentelemetry.instrumentation.api.util.VirtualField; /** - * In case a {@link ServerCall} implementation does not implement {@link ServerCall#getAuthority()} like armeria, - * this utility class should be used to provide the authority instead + * In case a {@link ServerCall} implementation does not implement {@link ServerCall#getAuthority()} + * like armeria, this utility class should be used to provide the authority instead */ public class GrpcAuthorityStorage { private static final VirtualField, String> AUTHORITY_FIELD = VirtualField.find(ServerCall.class, String.class); + private GrpcAuthorityStorage() {} + public static void setAuthority(ServerCall call, String authority) { AUTHORITY_FIELD.set(call, authority); } From 1c21bf762fcc7fba553f948f115935e207b9af69 Mon Sep 17 00:00:00 2001 From: Lauri Tulmin Date: Tue, 1 Apr 2025 14:07:00 +0300 Subject: [PATCH 8/8] encapsulate virtual field use in util class --- .../route/PathMatcherInstrumentation.java | 2 +- .../PathMatcherStaticInstrumentation.java | 2 +- .../server/route/PathMatcherUtil.java | 25 +++++++++++++++++++ .../akkahttp/server/route/VirtualFields.java | 17 ------------- 4 files changed, 27 insertions(+), 19 deletions(-) create mode 100644 instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherUtil.java delete mode 100644 instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/VirtualFields.java diff --git a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherInstrumentation.java b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherInstrumentation.java index a69da039e7ea..f8dc1172c74b 100644 --- a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherInstrumentation.java +++ b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherInstrumentation.java @@ -40,7 +40,7 @@ public static void onEnter( @Advice.Argument(0) Uri.Path prefix, @Advice.Return PathMatcher result) { // store the path being matched inside a VirtualField on the given matcher, so it can be used // for constructing the route - VirtualFields.PATH_MATCHER_ROUTE.set(result, prefix.toString()); + PathMatcherUtil.setMatched(result, prefix.toString()); } } } diff --git a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherStaticInstrumentation.java b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherStaticInstrumentation.java index 245a52372060..e65640b2ad09 100644 --- a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherStaticInstrumentation.java +++ b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherStaticInstrumentation.java @@ -47,7 +47,7 @@ public static void onExit( } // if present use the matched path that was remembered in PathMatcherInstrumentation, // otherwise just use a * - String prefix = VirtualFields.PATH_MATCHER_ROUTE.get(pathMatcher); + String prefix = PathMatcherUtil.getMatched(pathMatcher); if (prefix == null) { if (PathMatchers.Slash$.class == pathMatcher.getClass()) { prefix = "/"; diff --git a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherUtil.java b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherUtil.java new file mode 100644 index 000000000000..2f320ff499f8 --- /dev/null +++ b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/PathMatcherUtil.java @@ -0,0 +1,25 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.akkahttp.server.route; + +import akka.http.scaladsl.server.PathMatcher; +import io.opentelemetry.instrumentation.api.util.VirtualField; + +public class PathMatcherUtil { + + private static final VirtualField, String> PATH_MATCHER_ROUTE = + VirtualField.find(PathMatcher.class, String.class); + + public static void setMatched(PathMatcher matcher, String route) { + PATH_MATCHER_ROUTE.set(matcher, route); + } + + public static String getMatched(PathMatcher matcher) { + return PATH_MATCHER_ROUTE.get(matcher); + } + + private PathMatcherUtil() {} +} diff --git a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/VirtualFields.java b/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/VirtualFields.java deleted file mode 100644 index 8e6b500e2927..000000000000 --- a/instrumentation/akka/akka-http-10.0/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkahttp/server/route/VirtualFields.java +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.akkahttp.server.route; - -import akka.http.scaladsl.server.PathMatcher; -import io.opentelemetry.instrumentation.api.util.VirtualField; - -public class VirtualFields { - - private VirtualFields() {} - - public static final VirtualField, String> PATH_MATCHER_ROUTE = - VirtualField.find(PathMatcher.class, String.class); -}