From 0b0d75bcf2fdb35e4e7b88d9b088d3491d39b19f Mon Sep 17 00:00:00 2001 From: Luca Abbati Date: Fri, 30 Aug 2019 19:28:55 +0200 Subject: [PATCH] Jax-rs user METHOD PATH as resource only when root span --- .../jaxrs/JaxRsAnnotationsDecorator.java | 30 +++++++++++++++---- .../JaxRsAnnotationsInstrumentation.java | 3 +- ...JaxRsAnnotationsInstrumentationTest.groovy | 6 ++-- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/dd-java-agent/instrumentation/jax-rs-annotations/src/main/java/datadog/trace/instrumentation/jaxrs/JaxRsAnnotationsDecorator.java b/dd-java-agent/instrumentation/jax-rs-annotations/src/main/java/datadog/trace/instrumentation/jaxrs/JaxRsAnnotationsDecorator.java index 653a3f0220..b83bc7a023 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations/src/main/java/datadog/trace/instrumentation/jaxrs/JaxRsAnnotationsDecorator.java +++ b/dd-java-agent/instrumentation/jax-rs-annotations/src/main/java/datadog/trace/instrumentation/jaxrs/JaxRsAnnotationsDecorator.java @@ -37,25 +37,43 @@ public class JaxRsAnnotationsDecorator extends BaseDecorator { return "jax-rs-controller"; } - public void updateParent(final Scope scope, final Method method) { + public void updateScope(final Scope scope, final Scope parent, final Method method) { + String resourceName = getResourceName(method); + updateParent(parent, resourceName); + + final Span span = scope.span(); + span.setTag(DDTags.SPAN_TYPE, DDSpanTypes.HTTP_SERVER); + + // When jax-rs is the root scope, then we + boolean isRootScope = parent == null; + if (isRootScope && !resourceName.isEmpty()) { + span.setTag(DDTags.RESOURCE_NAME, resourceName); + } else { + span.setTag(DDTags.RESOURCE_NAME, DECORATE.spanNameForMethod(method)); + } + } + + private void updateParent(final Scope scope, final String resourceName) { if (scope == null) { return; } final Span span = scope.span(); Tags.COMPONENT.set(span, "jax-rs"); - String resourceName = getResourceName(method); if (!resourceName.isEmpty()) { span.setTag(DDTags.RESOURCE_NAME, resourceName); } } - public void updateCurrentScope(final Scope scope, final Method method) { + public void updateCurrentScope(final Scope scope, final Method method, boolean isRootScope) { final Span span = scope.span(); span.setTag(DDTags.SPAN_TYPE, DDSpanTypes.HTTP_SERVER); - String resourceName = getResourceName(method); - if (!resourceName.isEmpty()) { - span.setTag(DDTags.RESOURCE_NAME, resourceName); + + if (isRootScope) { + String resourceName = getResourceName(method); + if (!resourceName.isEmpty()) { + span.setTag(DDTags.RESOURCE_NAME, resourceName); + } } } diff --git a/dd-java-agent/instrumentation/jax-rs-annotations/src/main/java/datadog/trace/instrumentation/jaxrs/JaxRsAnnotationsInstrumentation.java b/dd-java-agent/instrumentation/jax-rs-annotations/src/main/java/datadog/trace/instrumentation/jaxrs/JaxRsAnnotationsInstrumentation.java index 5cfde85b5b..220092185e 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations/src/main/java/datadog/trace/instrumentation/jaxrs/JaxRsAnnotationsInstrumentation.java +++ b/dd-java-agent/instrumentation/jax-rs-annotations/src/main/java/datadog/trace/instrumentation/jaxrs/JaxRsAnnotationsInstrumentation.java @@ -64,8 +64,7 @@ public final class JaxRsAnnotationsInstrumentation extends Instrumenter.Default // Rename the parent span according to the path represented by these annotations. final Scope parent = tracer.scopeManager().active(); Scope scope = tracer.buildSpan(JAX_ENDPOINT_OPERATION_NAME).startActive(true); - DECORATE.updateParent(parent, method); - DECORATE.updateCurrentScope(scope, method); + DECORATE.updateScope(scope, parent, method); return DECORATE.afterStart(scope); } diff --git a/dd-java-agent/instrumentation/jax-rs-annotations/src/test/groovy/JaxRsAnnotationsInstrumentationTest.groovy b/dd-java-agent/instrumentation/jax-rs-annotations/src/test/groovy/JaxRsAnnotationsInstrumentationTest.groovy index 6c475c2310..53a33d0980 100644 --- a/dd-java-agent/instrumentation/jax-rs-annotations/src/test/groovy/JaxRsAnnotationsInstrumentationTest.groovy +++ b/dd-java-agent/instrumentation/jax-rs-annotations/src/test/groovy/JaxRsAnnotationsInstrumentationTest.groovy @@ -14,7 +14,7 @@ import static datadog.trace.instrumentation.jaxrs.JaxRsAnnotationsDecorator.DECO class JaxRsAnnotationsInstrumentationTest extends AgentTestRunner { - def "instrumentation can be used as root span and relevant tags are set"() { + def "instrumentation can be used as root span and resource is set to METHOD PATH"() { setup: new Jax() { @POST @@ -38,7 +38,7 @@ class JaxRsAnnotationsInstrumentationTest extends AgentTestRunner { } } - def "span named '#name' from annotations on class"() { + def "span named '#name' from annotations on class when is not root span"() { setup: def startingCacheSize = DECORATE.resourceNames.size() runUnderTrace("test") { @@ -59,7 +59,7 @@ class JaxRsAnnotationsInstrumentationTest extends AgentTestRunner { } span(1) { operationName "jax-rs.request" - resourceName name + resourceName "${className}.call" spanType "web" childOf span(0) tags {