Update spring-web to new agent api

This commit is contained in:
Trask Stalnaker 2019-10-19 11:57:48 -07:00
parent 7775c1e132
commit 51fe9f48b9
3 changed files with 33 additions and 33 deletions

View File

@ -1,5 +1,8 @@
package datadog.trace.instrumentation.springweb; package datadog.trace.instrumentation.springweb;
import static datadog.trace.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.instrumentation.api.AgentTracer.activeSpan;
import static datadog.trace.instrumentation.api.AgentTracer.startSpan;
import static datadog.trace.instrumentation.springweb.SpringWebHttpServerDecorator.DECORATE; import static datadog.trace.instrumentation.springweb.SpringWebHttpServerDecorator.DECORATE;
import static datadog.trace.instrumentation.springweb.SpringWebHttpServerDecorator.DECORATE_RENDER; import static datadog.trace.instrumentation.springweb.SpringWebHttpServerDecorator.DECORATE_RENDER;
import static net.bytebuddy.matcher.ElementMatchers.isMethod; import static net.bytebuddy.matcher.ElementMatchers.isMethod;
@ -10,10 +13,8 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
import com.google.auto.service.AutoService; import com.google.auto.service.AutoService;
import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.Instrumenter;
import io.opentracing.Scope; import datadog.trace.instrumentation.api.AgentScope;
import io.opentracing.Span; import datadog.trace.instrumentation.api.AgentSpan;
import io.opentracing.tag.Tags;
import io.opentracing.util.GlobalTracer;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import net.bytebuddy.asm.Advice; import net.bytebuddy.asm.Advice;
@ -66,16 +67,16 @@ public final class DispatcherServletInstrumentation extends Instrumenter.Default
public static class DispatcherAdvice { public static class DispatcherAdvice {
@Advice.OnMethodEnter(suppress = Throwable.class) @Advice.OnMethodEnter(suppress = Throwable.class)
public static Scope startSpan(@Advice.Argument(0) final ModelAndView mv) { public static AgentScope onEnter(@Advice.Argument(0) final ModelAndView mv) {
final Scope scope = GlobalTracer.get().buildSpan("response.render").startActive(true); final AgentSpan span = startSpan("response.render");
DECORATE_RENDER.afterStart(scope); DECORATE_RENDER.afterStart(span);
DECORATE_RENDER.onRender(scope, mv); DECORATE_RENDER.onRender(span, mv);
return scope; return activateSpan(span, true);
} }
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
public static void stopSpan( public static void stopSpan(
@Advice.Enter final Scope scope, @Advice.Thrown final Throwable throwable) { @Advice.Enter final AgentScope scope, @Advice.Thrown final Throwable throwable) {
DECORATE_RENDER.onError(scope, throwable); DECORATE_RENDER.onError(scope, throwable);
DECORATE_RENDER.beforeFinish(scope); DECORATE_RENDER.beforeFinish(scope);
scope.close(); scope.close();
@ -85,13 +86,12 @@ public final class DispatcherServletInstrumentation extends Instrumenter.Default
public static class ErrorHandlerAdvice { public static class ErrorHandlerAdvice {
@Advice.OnMethodEnter(suppress = Throwable.class) @Advice.OnMethodEnter(suppress = Throwable.class)
public static void nameResource(@Advice.Argument(3) final Exception exception) { public static void nameResource(@Advice.Argument(3) final Exception exception) {
final Scope scope = GlobalTracer.get().scopeManager().active(); final AgentSpan span = activeSpan();
if (scope != null && exception != null) { if (span != null && exception != null) {
final Span span = scope.span();
DECORATE.onError(span, exception); DECORATE.onError(span, exception);
// We want to capture the stacktrace, but that doesn't mean it should be an error. // We want to capture the stacktrace, but that doesn't mean it should be an error.
// We rely on a decorator to set the error state based on response code. (5xx -> error) // We rely on a decorator to set the error state based on response code. (5xx -> error)
Tags.ERROR.set(span, false); span.setError(false);
} }
} }
} }

View File

@ -1,6 +1,9 @@
package datadog.trace.instrumentation.springweb; package datadog.trace.instrumentation.springweb;
import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType; import static datadog.trace.agent.tooling.ByteBuddyElementMatchers.safeHasSuperType;
import static datadog.trace.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.instrumentation.api.AgentTracer.activeSpan;
import static datadog.trace.instrumentation.api.AgentTracer.startSpan;
import static datadog.trace.instrumentation.springweb.SpringWebHttpServerDecorator.DECORATE; import static datadog.trace.instrumentation.springweb.SpringWebHttpServerDecorator.DECORATE;
import static java.util.Collections.singletonMap; import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isInterface; import static net.bytebuddy.matcher.ElementMatchers.isInterface;
@ -14,9 +17,8 @@ import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
import com.google.auto.service.AutoService; import com.google.auto.service.AutoService;
import datadog.trace.agent.tooling.Instrumenter; import datadog.trace.agent.tooling.Instrumenter;
import datadog.trace.context.TraceScope; import datadog.trace.instrumentation.api.AgentScope;
import io.opentracing.Scope; import datadog.trace.instrumentation.api.AgentSpan;
import io.opentracing.util.GlobalTracer;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Map; import java.util.Map;
import javax.servlet.Servlet; import javax.servlet.Servlet;
@ -67,14 +69,14 @@ public final class HandlerAdapterInstrumentation extends Instrumenter.Default {
public static class ControllerAdvice { public static class ControllerAdvice {
@Advice.OnMethodEnter(suppress = Throwable.class) @Advice.OnMethodEnter(suppress = Throwable.class)
public static Scope nameResourceAndStartSpan( public static AgentScope nameResourceAndStartSpan(
@Advice.Argument(0) final HttpServletRequest request, @Advice.Argument(0) final HttpServletRequest request,
@Advice.Argument(2) final Object handler) { @Advice.Argument(2) final Object handler) {
// Name the parent span based on the matching pattern // Name the parent span based on the matching pattern
// This is likely the servlet.request span. // This is likely the servlet.request span.
final Scope parentScope = GlobalTracer.get().scopeManager().active(); final AgentSpan parentSpan = activeSpan();
if (parentScope != null) { if (parentSpan != null) {
DECORATE.onRequest(parentScope.span(), request); DECORATE.onRequest(parentSpan, request);
} }
// Now create a span for controller execution. // Now create a span for controller execution.
@ -107,17 +109,17 @@ public final class HandlerAdapterInstrumentation extends Instrumenter.Default {
final String operationName = DECORATE.spanNameForClass(clazz) + "." + methodName; final String operationName = DECORATE.spanNameForClass(clazz) + "." + methodName;
final Scope scope = GlobalTracer.get().buildSpan(operationName).startActive(true); final AgentSpan span = startSpan(operationName);
if (scope instanceof TraceScope) { DECORATE.afterStart(span);
((TraceScope) scope).setAsyncPropagation(true);
} final AgentScope scope = activateSpan(span, true);
DECORATE.afterStart(scope); scope.setAsyncPropagation(true);
return scope; return scope;
} }
@Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class) @Advice.OnMethodExit(onThrowable = Throwable.class, suppress = Throwable.class)
public static void stopSpan( public static void stopSpan(
@Advice.Enter final Scope scope, @Advice.Thrown final Throwable throwable) { @Advice.Enter final AgentScope scope, @Advice.Thrown final Throwable throwable) {
DECORATE.onError(scope, throwable); DECORATE.onError(scope, throwable);
DECORATE.beforeFinish(scope); DECORATE.beforeFinish(scope);
scope.close(); scope.close();

View File

@ -3,8 +3,7 @@ package datadog.trace.instrumentation.springweb;
import datadog.trace.agent.decorator.HttpServerDecorator; import datadog.trace.agent.decorator.HttpServerDecorator;
import datadog.trace.api.DDSpanTypes; import datadog.trace.api.DDSpanTypes;
import datadog.trace.api.DDTags; import datadog.trace.api.DDTags;
import io.opentracing.Scope; import datadog.trace.instrumentation.api.AgentSpan;
import io.opentracing.Span;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -71,7 +70,7 @@ public class SpringWebHttpServerDecorator
} }
@Override @Override
public Span onRequest(final Span span, final HttpServletRequest request) { public AgentSpan onRequest(final AgentSpan span, final HttpServletRequest request) {
super.onRequest(span, request); super.onRequest(span, request);
if (request != null) { if (request != null) {
final String method = request.getMethod(); final String method = request.getMethod();
@ -86,14 +85,13 @@ public class SpringWebHttpServerDecorator
return span; return span;
} }
public Scope onRender(final Scope scope, final ModelAndView mv) { public AgentSpan onRender(final AgentSpan span, final ModelAndView mv) {
final Span span = scope.span();
if (mv.getViewName() != null) { if (mv.getViewName() != null) {
span.setTag("view.name", mv.getViewName()); span.setTag("view.name", mv.getViewName());
} }
if (mv.getView() != null) { if (mv.getView() != null) {
span.setTag("view.type", mv.getView().getClass().getName()); span.setTag("view.type", mv.getView().getClass().getName());
} }
return scope; return span;
} }
} }