From 18155581b2163ae928d8f3a0606d973b9eb316bf Mon Sep 17 00:00:00 2001 From: Jonas Kunz Date: Tue, 1 Apr 2025 14:35:08 +0200 Subject: [PATCH] Move Akka and Armeria virtual fields to helpers (#13604) Co-authored-by: Lauri Tulmin --- .../AkkaActorCellInstrumentation.java | 12 +++----- ...aultSystemMessageQueueInstrumentation.java | 13 ++++----- .../AkkaDispatcherInstrumentation.java | 11 +++---- .../akkaactor/VirtualFields.java | 22 ++++++++++++++ .../AkkaForkJoinPoolInstrumentation.java | 11 +++---- .../AkkaForkJoinTaskInstrumentation.java | 18 +++++------- .../akkaactor/VirtualFields.java | 24 +++++++++++++++ .../route/PathMatcherInstrumentation.java | 3 +- .../PathMatcherStaticInstrumentation.java | 3 +- .../server/route/PathMatcherUtil.java | 25 ++++++++++++++++ .../ArmeriaServerCallInstrumentation.java | 4 +-- .../grpc/v1_6/GrpcAuthorityStorage.java | 29 +++++++++++++++++++ .../grpc/v1_6/TracingServerInterceptor.java | 6 +--- 13 files changed, 130 insertions(+), 51 deletions(-) create mode 100644 instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/VirtualFields.java 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/PathMatcherUtil.java create mode 100644 instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAuthorityStorage.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 161cc80a69..f99a4e694f 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 static net.bytebuddy.matcher.ElementMatchers.takesArgument; 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 class AkkaActorCellInstrumentation implements TypeInstrumentation { @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( + VirtualFields.ENVELOPE_PROPAGATED_CONTEXT, envelope); } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) @@ -60,9 +57,8 @@ public class AkkaActorCellInstrumentation implements TypeInstrumentation { @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( + 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 8d6ba25fcc..5a23c0577d 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 static net.bytebuddy.matcher.ElementMatchers.takesArgument; 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 class AkkaDefaultSystemMessageQueueInstrumentation implements TypeInstrum 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, VirtualFields.SYSTEM_MESSAGE_PROPAGATED_CONTEXT, systemMessage); } return null; } @@ -61,10 +59,11 @@ public class AkkaDefaultSystemMessageQueueInstrumentation implements TypeInstrum @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, + 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 66567fb204..be1773a4ea 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 static net.bytebuddy.matcher.ElementMatchers.takesArgument; 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 class AkkaDispatcherInstrumentation implements TypeInstrumentation { 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, VirtualFields.ENVELOPE_PROPAGATED_CONTEXT, envelope); } return null; } @@ -55,9 +53,8 @@ public class AkkaDispatcherInstrumentation implements TypeInstrumentation { @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, VirtualFields.ENVELOPE_PROPAGATED_CONTEXT, envelope); } } } diff --git a/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/VirtualFields.java b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/VirtualFields.java new file mode 100644 index 0000000000..e9772a59b3 --- /dev/null +++ b/instrumentation/akka/akka-actor-2.3/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/akkaactor/VirtualFields.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 VirtualFields { + + private VirtualFields() {} + + 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); +} 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 2607f990b5..40556c79cb 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 static net.bytebuddy.matcher.ElementMatchers.takesArgument; 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 class AkkaForkJoinPoolInstrumentation implements TypeInstrumentation { 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 class AkkaForkJoinPoolInstrumentation implements TypeInstrumentation { @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 a13f5de553..66fe65df95 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 static net.bytebuddy.matcher.ElementMatchers.takesArguments; 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 class AkkaForkJoinTaskInstrumentation implements TypeInstrumentation { */ @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 class AkkaForkJoinTaskInstrumentation implements TypeInstrumentation { } } 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 0000000000..2ff4df7f02 --- /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, PropagatedContext> 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 c0e3ef261c..f8dc1172c7 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 static net.bytebuddy.matcher.ElementMatchers.takesArgument; 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 class PathMatcherInstrumentation implements TypeInstrumentation { @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()); + 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 41d952ce17..e65640b2ad 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 static net.bytebuddy.matcher.ElementMatchers.takesArgument; 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 class PathMatcherStaticInstrumentation implements TypeInstrumentation { } // 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 = 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 0000000000..2f320ff499 --- /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/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 7371894856..bb14e18b33 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,7 @@ import static net.bytebuddy.matcher.ElementMatchers.namedOneOf; 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; @@ -43,7 +43,7 @@ public class ArmeriaServerCallInstrumentation implements TypeInstrumentation { // 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); + 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 0000000000..78fa947278 --- /dev/null +++ b/instrumentation/grpc-1.6/library/src/main/java/io/opentelemetry/instrumentation/grpc/v1_6/GrpcAuthorityStorage.java @@ -0,0 +1,29 @@ +/* + * 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 + */ +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); + } + + 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 caa992f9a9..d52c332ec5 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.api.trace.Span; 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 @@ final class TracingServerInterceptor implements ServerInterceptor { // 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(