From a4947bc3dccae429c37eca87d27d6d7eeff09323 Mon Sep 17 00:00:00 2001 From: Mateusz Rzeszutek Date: Tue, 26 Oct 2021 15:50:50 +0200 Subject: [PATCH] Migrate Finatra instrumentation to Instrumenter API (#4495) --- .../finatra/FinatraResponseListener.java | 18 +++++------ .../finatra/FinatraRouteInstrumentation.java | 26 +++++++-------- .../finatra/FinatraSingletons.java | 32 +++++++++++++++++++ .../finatra/FinatraTracer.java | 28 ---------------- 4 files changed, 53 insertions(+), 51 deletions(-) create mode 100644 instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraSingletons.java delete mode 100644 instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraTracer.java diff --git a/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraResponseListener.java b/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraResponseListener.java index e615337a53..21affbb72d 100644 --- a/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraResponseListener.java +++ b/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraResponseListener.java @@ -5,31 +5,29 @@ package io.opentelemetry.javaagent.instrumentation.finatra; -import static io.opentelemetry.javaagent.instrumentation.finatra.FinatraTracer.tracer; +import static io.opentelemetry.javaagent.instrumentation.finatra.FinatraSingletons.instrumenter; import com.twitter.finagle.http.Response; import com.twitter.util.FutureEventListener; import io.opentelemetry.context.Context; -import io.opentelemetry.context.Scope; -public class FinatraResponseListener implements FutureEventListener { +public final class FinatraResponseListener implements FutureEventListener { + private final Context context; - private final Scope scope; + private final Class request; - public FinatraResponseListener(Context context, Scope scope) { + public FinatraResponseListener(Context context, Class request) { this.context = context; - this.scope = scope; + this.request = request; } @Override public void onSuccess(Response response) { - scope.close(); - tracer().end(context); + instrumenter().end(context, request, null, null); } @Override public void onFailure(Throwable cause) { - scope.close(); - tracer().endExceptionally(context, cause); + instrumenter().end(context, request, null, cause); } } diff --git a/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraRouteInstrumentation.java b/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraRouteInstrumentation.java index a801aca0bb..52f9bb8e81 100644 --- a/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraRouteInstrumentation.java +++ b/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraRouteInstrumentation.java @@ -7,7 +7,8 @@ package io.opentelemetry.javaagent.instrumentation.finatra; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.extendsClass; import static io.opentelemetry.javaagent.extension.matcher.AgentElementMatchers.hasClassesNamed; -import static io.opentelemetry.javaagent.instrumentation.finatra.FinatraTracer.tracer; +import static io.opentelemetry.javaagent.instrumentation.finatra.FinatraSingletons.instrumenter; +import static io.opentelemetry.javaagent.instrumentation.finatra.FinatraSingletons.updateServerSpanName; import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.nameStartsWith; import static net.bytebuddy.matcher.ElementMatchers.named; @@ -17,10 +18,8 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments; import com.twitter.finagle.http.Response; import com.twitter.finatra.http.contexts.RouteInfo; import com.twitter.util.Future; -import io.opentelemetry.api.trace.Span; import io.opentelemetry.context.Context; import io.opentelemetry.context.Scope; -import io.opentelemetry.instrumentation.api.tracer.ServerSpan; import io.opentelemetry.javaagent.extension.instrumentation.TypeInstrumentation; import io.opentelemetry.javaagent.extension.instrumentation.TypeTransformer; import io.opentelemetry.javaagent.instrumentation.api.Java8BytecodeBridge; @@ -57,17 +56,18 @@ public class FinatraRouteInstrumentation implements TypeInstrumentation { @Advice.OnMethodEnter(suppress = Throwable.class) public static void nameSpan( @Advice.FieldValue("routeInfo") RouteInfo routeInfo, - @Advice.FieldValue("clazz") Class clazz, + @Advice.FieldValue("clazz") Class request, @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { Context parentContext = Java8BytecodeBridge.currentContext(); - Span serverSpan = ServerSpan.fromContextOrNull(parentContext); - if (serverSpan != null) { - serverSpan.updateName(routeInfo.path()); + updateServerSpanName(parentContext, routeInfo); + + if (!instrumenter().shouldStart(parentContext, request)) { + return; } - context = tracer().startSpan(parentContext, clazz); + context = instrumenter().start(parentContext, request); scope = context.makeCurrent(); } @@ -75,20 +75,20 @@ public class FinatraRouteInstrumentation implements TypeInstrumentation { public static void setupCallback( @Advice.Thrown Throwable throwable, @Advice.Return Some> responseOption, + @Advice.FieldValue("clazz") Class request, @Advice.Local("otelContext") Context context, @Advice.Local("otelScope") Scope scope) { if (scope == null) { return; } + scope.close(); if (throwable != null) { - scope.close(); - tracer().endExceptionally(context, throwable); - return; + instrumenter().end(context, request, null, throwable); + } else { + responseOption.get().addEventListener(new FinatraResponseListener(context, request)); } - - responseOption.get().addEventListener(new FinatraResponseListener(context, scope)); } } } diff --git a/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraSingletons.java b/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraSingletons.java new file mode 100644 index 0000000000..a1ca87898f --- /dev/null +++ b/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraSingletons.java @@ -0,0 +1,32 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.javaagent.instrumentation.finatra; + +import com.twitter.finatra.http.contexts.RouteInfo; +import io.opentelemetry.api.GlobalOpenTelemetry; +import io.opentelemetry.context.Context; +import io.opentelemetry.instrumentation.api.instrumenter.Instrumenter; +import io.opentelemetry.instrumentation.api.servlet.ServerSpanNaming; +import io.opentelemetry.instrumentation.api.tracer.ClassNames; + +public final class FinatraSingletons { + + private static final Instrumenter, Void> INSTRUMENTER = + Instrumenter., Void>builder( + GlobalOpenTelemetry.get(), "io.opentelemetry.finatra-2.9", ClassNames::simpleName) + .newInstrumenter(); + + public static Instrumenter, Void> instrumenter() { + return INSTRUMENTER; + } + + public static void updateServerSpanName(Context context, RouteInfo routeInfo) { + ServerSpanNaming.updateServerSpanName( + context, ServerSpanNaming.Source.CONTROLLER, (c, route) -> route.path(), routeInfo); + } + + private FinatraSingletons() {} +} diff --git a/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraTracer.java b/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraTracer.java deleted file mode 100644 index 568c0c724c..0000000000 --- a/instrumentation/finatra-2.9/javaagent/src/main/java/io/opentelemetry/javaagent/instrumentation/finatra/FinatraTracer.java +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright The OpenTelemetry Authors - * SPDX-License-Identifier: Apache-2.0 - */ - -package io.opentelemetry.javaagent.instrumentation.finatra; - -import io.opentelemetry.api.trace.SpanKind; -import io.opentelemetry.context.Context; -import io.opentelemetry.instrumentation.api.tracer.BaseTracer; -import io.opentelemetry.instrumentation.api.tracer.ClassNames; - -public class FinatraTracer extends BaseTracer { - private static final FinatraTracer TRACER = new FinatraTracer(); - - public static FinatraTracer tracer() { - return TRACER; - } - - @Override - protected String getInstrumentationName() { - return "io.opentelemetry.finatra-2.9"; - } - - public Context startSpan(Context parentContext, Class clazz) { - return super.startSpan(parentContext, ClassNames.simpleName(clazz), SpanKind.INTERNAL); - } -}