From 4691396d11f70454d3ad324dd0db0be0d70ac0c7 Mon Sep 17 00:00:00 2001 From: Trask Stalnaker Date: Sat, 19 Oct 2019 11:57:46 -0700 Subject: [PATCH] Update play-2.4 to new agent api --- .../instrumentation/play24/PlayAdvice.java | 53 ++++++++----------- .../instrumentation/play24/PlayHeaders.java | 37 ++++++------- .../play24/PlayHttpServerDecorator.java | 8 +-- .../play24/RequestCompleteCallback.java | 13 ++--- 4 files changed, 48 insertions(+), 63 deletions(-) diff --git a/dd-java-agent/instrumentation/play-2.4/src/main/java8/datadog/trace/instrumentation/play24/PlayAdvice.java b/dd-java-agent/instrumentation/play-2.4/src/main/java8/datadog/trace/instrumentation/play24/PlayAdvice.java index ca5ca34d24..678dcbf6ad 100644 --- a/dd-java-agent/instrumentation/play-2.4/src/main/java8/datadog/trace/instrumentation/play24/PlayAdvice.java +++ b/dd-java-agent/instrumentation/play-2.4/src/main/java8/datadog/trace/instrumentation/play24/PlayAdvice.java @@ -1,14 +1,16 @@ package datadog.trace.instrumentation.play24; +import static datadog.trace.instrumentation.api.AgentTracer.activateSpan; +import static datadog.trace.instrumentation.api.AgentTracer.activeSpan; +import static datadog.trace.instrumentation.api.AgentTracer.propagate; +import static datadog.trace.instrumentation.api.AgentTracer.startSpan; +import static datadog.trace.instrumentation.play24.PlayHeaders.GETTER; import static datadog.trace.instrumentation.play24.PlayHttpServerDecorator.DECORATE; -import datadog.trace.context.TraceScope; -import io.opentracing.Scope; -import io.opentracing.Span; -import io.opentracing.SpanContext; -import io.opentracing.propagation.Format; +import datadog.trace.instrumentation.api.AgentScope; +import datadog.trace.instrumentation.api.AgentSpan; +import datadog.trace.instrumentation.api.AgentSpan.Context; import io.opentracing.tag.Tags; -import io.opentracing.util.GlobalTracer; import net.bytebuddy.asm.Advice; import play.api.mvc.Action; import play.api.mvc.Request; @@ -17,43 +19,32 @@ import scala.concurrent.Future; public class PlayAdvice { @Advice.OnMethodEnter(suppress = Throwable.class) - public static Scope startSpan(@Advice.Argument(0) final Request req) { - final Scope scope; - if (GlobalTracer.get().activeSpan() == null) { - final SpanContext extractedContext; - if (GlobalTracer.get().scopeManager().active() == null) { - extractedContext = - GlobalTracer.get().extract(Format.Builtin.HTTP_HEADERS, new PlayHeaders(req)); - } else { - extractedContext = null; - } - scope = - GlobalTracer.get() - .buildSpan("play.request") - .asChildOf(extractedContext) - .startActive(false); + public static AgentScope onEnter(@Advice.Argument(0) final Request req) { + final AgentSpan span; + if (activeSpan() == null) { + final Context extractedContext = propagate().extract(req, GETTER); + span = startSpan("play.request", extractedContext); } else { // An upstream framework (e.g. akka-http, netty) has already started the span. // Do not extract the context. - scope = GlobalTracer.get().buildSpan("play.request").startActive(false); + span = startSpan("play.request"); } - DECORATE.afterStart(scope); - DECORATE.onConnection(scope.span(), req); + DECORATE.afterStart(span); + DECORATE.onConnection(span, req); - if (GlobalTracer.get().scopeManager().active() instanceof TraceScope) { - ((TraceScope) GlobalTracer.get().scopeManager().active()).setAsyncPropagation(true); - } + final AgentScope scope = activateSpan(span, false); + scope.setAsyncPropagation(true); return scope; } @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) public static void stopTraceOnResponse( - @Advice.Enter final Scope playControllerScope, + @Advice.Enter final AgentScope playControllerScope, @Advice.This final Object thisAction, @Advice.Thrown final Throwable throwable, @Advice.Argument(0) final Request req, @Advice.Return(readOnly = false) final Future responseFuture) { - final Span playControllerSpan = playControllerScope.span(); + final AgentSpan playControllerSpan = playControllerScope.span(); // Call onRequest on return after tags are populated. DECORATE.onRequest(playControllerSpan, req); @@ -64,13 +55,13 @@ public class PlayAdvice { ((Action) thisAction).executionContext()); } else { DECORATE.onError(playControllerSpan, throwable); - Tags.HTTP_STATUS.set(playControllerSpan, 500); + playControllerSpan.setTag(Tags.HTTP_STATUS.getKey(), 500); DECORATE.beforeFinish(playControllerSpan); playControllerSpan.finish(); } playControllerScope.close(); - final Span rootSpan = GlobalTracer.get().activeSpan(); + final AgentSpan rootSpan = activeSpan(); // set the resource name on the upstream akka/netty span DECORATE.onRequest(rootSpan, req); } diff --git a/dd-java-agent/instrumentation/play-2.4/src/main/java8/datadog/trace/instrumentation/play24/PlayHeaders.java b/dd-java-agent/instrumentation/play-2.4/src/main/java8/datadog/trace/instrumentation/play24/PlayHeaders.java index 5c20eeb2c9..028fabd74f 100644 --- a/dd-java-agent/instrumentation/play-2.4/src/main/java8/datadog/trace/instrumentation/play24/PlayHeaders.java +++ b/dd-java-agent/instrumentation/play-2.4/src/main/java8/datadog/trace/instrumentation/play24/PlayHeaders.java @@ -1,33 +1,26 @@ package datadog.trace.instrumentation.play24; -import io.opentracing.propagation.TextMap; -import java.util.HashMap; -import java.util.Iterator; -import java.util.Map; +import datadog.trace.instrumentation.api.AgentPropagation; import play.api.mvc.Request; -import scala.Tuple2; +import scala.Option; +import scala.collection.JavaConversions; -public class PlayHeaders implements TextMap { - private final Request request; +public class PlayHeaders implements AgentPropagation.Getter { - public PlayHeaders(final Request request) { - this.request = request; + public static final PlayHeaders GETTER = new PlayHeaders(); + + @Override + public Iterable keys(final Request carrier) { + return JavaConversions.asJavaIterable(carrier.headers().keys()); } @Override - public Iterator> iterator() { - final scala.collection.Map scalaMap = request.headers().toSimpleMap(); - final Map javaMap = new HashMap<>(scalaMap.size()); - final scala.collection.Iterator> scalaIterator = scalaMap.iterator(); - while (scalaIterator.hasNext()) { - final Tuple2 tuple = scalaIterator.next(); - javaMap.put(tuple._1(), tuple._2()); + public String get(final Request carrier, final String key) { + final Option option = carrier.headers().get(key); + if (option.isDefined()) { + return option.get(); + } else { + return null; } - return javaMap.entrySet().iterator(); - } - - @Override - public void put(final String s, final String s1) { - throw new IllegalStateException("play headers can only be extracted"); } } diff --git a/dd-java-agent/instrumentation/play-2.4/src/main/java8/datadog/trace/instrumentation/play24/PlayHttpServerDecorator.java b/dd-java-agent/instrumentation/play-2.4/src/main/java8/datadog/trace/instrumentation/play24/PlayHttpServerDecorator.java index a13eeafb07..5278bc75ba 100644 --- a/dd-java-agent/instrumentation/play-2.4/src/main/java8/datadog/trace/instrumentation/play24/PlayHttpServerDecorator.java +++ b/dd-java-agent/instrumentation/play-2.4/src/main/java8/datadog/trace/instrumentation/play24/PlayHttpServerDecorator.java @@ -2,7 +2,7 @@ package datadog.trace.instrumentation.play24; import datadog.trace.agent.decorator.HttpServerDecorator; import datadog.trace.api.DDTags; -import io.opentracing.Span; +import datadog.trace.instrumentation.api.AgentSpan; import io.opentracing.tag.Tags; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.UndeclaredThrowableException; @@ -58,7 +58,7 @@ public class PlayHttpServerDecorator extends HttpServerDecorator, Object> { - private final Span span; + private final AgentSpan span; - public RequestCompleteCallback(final Span span) { + public RequestCompleteCallback(final AgentSpan span) { this.span = span; } @@ -26,8 +26,9 @@ public class RequestCompleteCallback extends scala.runtime.AbstractFunction1