Merge pull request #1300 from DataDog/tyler/servlet-forward

Stop creating a "top level" servlet span when in a forward/include situation
This commit is contained in:
Tyler Benson 2020-03-06 11:46:27 -08:00 committed by GitHub
commit aca4b9ece9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 10 additions and 11 deletions

View File

@ -2,7 +2,6 @@ package datadog.trace.instrumentation.servlet2;
import static datadog.trace.agent.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
import static datadog.trace.instrumentation.servlet2.HttpServletRequestExtractAdapter.GETTER;
@ -29,11 +28,11 @@ public class Servlet2Advice {
@Advice.Argument(0) final ServletRequest request,
@Advice.Argument(value = 1, readOnly = false, typing = Assigner.Typing.DYNAMIC)
ServletResponse response) {
final boolean hasActiveTrace = activeSpan() != null;
final boolean hasServletTrace = request.getAttribute(DD_SPAN_ATTRIBUTE) instanceof AgentSpan;
final boolean invalidRequest = !(request instanceof HttpServletRequest);
if (invalidRequest || (hasActiveTrace && hasServletTrace)) {
// Tracing might already be applied by the FilterChain. If so ignore this.
if (invalidRequest || hasServletTrace) {
// Tracing might already be applied by the FilterChain or a parent request (forward/include).
return null;
}

View File

@ -2,7 +2,6 @@ package datadog.trace.instrumentation.servlet3;
import static datadog.trace.agent.decorator.HttpServerDecorator.DD_SPAN_ATTRIBUTE;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activateSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.activeSpan;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.propagate;
import static datadog.trace.bootstrap.instrumentation.api.AgentTracer.startSpan;
import static datadog.trace.instrumentation.servlet3.HttpServletRequestExtractAdapter.GETTER;
@ -29,11 +28,10 @@ public class Servlet3Advice {
@Advice.Argument(0) final ServletRequest request,
@Advice.Argument(1) final ServletResponse response) {
final boolean hasActiveTrace = activeSpan() != null;
final boolean hasServletTrace = request.getAttribute(DD_SPAN_ATTRIBUTE) instanceof AgentSpan;
final boolean invalidRequest = !(request instanceof HttpServletRequest);
if (invalidRequest || (hasActiveTrace && hasServletTrace)) {
// Tracing might already be applied by the FilterChain. If so ignore this.
if (invalidRequest || hasServletTrace) {
// Tracing might already be applied by the FilterChain or a parent request (forward/include).
return null;
}

View File

@ -13,6 +13,7 @@ import static java.util.Collections.singletonMap;
import static net.bytebuddy.matcher.ElementMatchers.isPublic;
import static net.bytebuddy.matcher.ElementMatchers.named;
import static net.bytebuddy.matcher.ElementMatchers.takesArgument;
import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
import com.google.auto.service.AutoService;
import datadog.trace.agent.tooling.Instrumenter;
@ -64,10 +65,11 @@ public final class RequestDispatcherInstrumentation extends Instrumenter.Default
return singletonMap(
named("forward")
.or(named("include"))
.and(takesArguments(2))
.and(takesArgument(0, named("javax.servlet.ServletRequest")))
.and(takesArgument(1, named("javax.servlet.ServletResponse")))
.and(isPublic()),
RequestDispatcherAdvice.class.getName());
getClass().getName() + "$RequestDispatcherAdvice");
}
public static class RequestDispatcherAdvice {

View File

@ -60,7 +60,7 @@ public final class FilterInstrumentation extends Instrumenter.Default {
.and(takesArgument(0, named("javax.servlet.ServletRequest")))
.and(takesArgument(1, named("javax.servlet.ServletResponse")))
.and(isPublic()),
FilterAdvice.class.getName());
getClass().getName() + "$FilterAdvice");
}
public static class FilterAdvice {

View File

@ -66,7 +66,7 @@ public final class HttpServletInstrumentation extends Instrumenter.Default {
.and(takesArgument(0, named("javax.servlet.http.HttpServletRequest")))
.and(takesArgument(1, named("javax.servlet.http.HttpServletResponse")))
.and(isProtected().or(isPublic())),
HttpServletAdvice.class.getName());
getClass().getName() + "$HttpServletAdvice");
}
public static class HttpServletAdvice {