From 16aba0ac7a898160d260e93274ee7539ea200719 Mon Sep 17 00:00:00 2001 From: Guillaume Polaert Date: Tue, 1 Aug 2017 19:36:23 +0200 Subject: [PATCH] [servlet] change the resource name for servlet integration (404 grouping) --- .../main/resources/dd-trace-decorators.yaml | 2 + .../trace/integration/AbstractDecorator.java | 6 +-- .../trace/integration/Status404Decorator.java | 16 ++++++++ .../trace/integration/URLAsResourceName.java | 14 ++++--- .../integration/SpanDecoratorTest.groovy | 41 +++++++++++++++++++ 5 files changed, 71 insertions(+), 8 deletions(-) create mode 100644 dd-trace/src/main/java/com/datadoghq/trace/integration/Status404Decorator.java diff --git a/dd-java-agent/src/main/resources/dd-trace-decorators.yaml b/dd-java-agent/src/main/resources/dd-trace-decorators.yaml index d1c8919301..675e2fc981 100644 --- a/dd-java-agent/src/main/resources/dd-trace-decorators.yaml +++ b/dd-java-agent/src/main/resources/dd-trace-decorators.yaml @@ -11,3 +11,5 @@ decorators: - type: DBTypeDecorator - type: DBStatementAsResourceName - type: OperationDecorator + - type: Status404Decorator + - type: URLAsResourceName diff --git a/dd-trace/src/main/java/com/datadoghq/trace/integration/AbstractDecorator.java b/dd-trace/src/main/java/com/datadoghq/trace/integration/AbstractDecorator.java index c78eefa474..b026326093 100644 --- a/dd-trace/src/main/java/com/datadoghq/trace/integration/AbstractDecorator.java +++ b/dd-trace/src/main/java/com/datadoghq/trace/integration/AbstractDecorator.java @@ -11,7 +11,7 @@ public abstract class AbstractDecorator { private String matchingTag; - private String matchingValue; + private Object matchingValue; private String setTag; @@ -45,11 +45,11 @@ public abstract class AbstractDecorator { this.matchingTag = tag; } - public String getMatchingValue() { + public Object getMatchingValue() { return matchingValue; } - public void setMatchingValue(final String value) { + public void setMatchingValue(final Object value) { this.matchingValue = value; } diff --git a/dd-trace/src/main/java/com/datadoghq/trace/integration/Status404Decorator.java b/dd-trace/src/main/java/com/datadoghq/trace/integration/Status404Decorator.java new file mode 100644 index 0000000000..e0fde29f27 --- /dev/null +++ b/dd-trace/src/main/java/com/datadoghq/trace/integration/Status404Decorator.java @@ -0,0 +1,16 @@ +package com.datadoghq.trace.integration; + +import com.datadoghq.trace.DDTags; +import io.opentracing.tag.Tags; + +/** This span decorator protect against spam on the resource name */ +public class Status404Decorator extends AbstractDecorator { + + public Status404Decorator() { + super(); + this.setMatchingTag(Tags.HTTP_STATUS.getKey()); + this.setMatchingValue(404); + this.setSetTag(DDTags.RESOURCE_NAME); + this.setSetValue("404"); + } +} diff --git a/dd-trace/src/main/java/com/datadoghq/trace/integration/URLAsResourceName.java b/dd-trace/src/main/java/com/datadoghq/trace/integration/URLAsResourceName.java index f6f059f3ad..5cd42209d9 100644 --- a/dd-trace/src/main/java/com/datadoghq/trace/integration/URLAsResourceName.java +++ b/dd-trace/src/main/java/com/datadoghq/trace/integration/URLAsResourceName.java @@ -5,6 +5,7 @@ import com.datadoghq.trace.DDTags; import io.opentracing.tag.Tags; import java.net.MalformedURLException; +/** Decorator for servlet contrib */ public class URLAsResourceName extends AbstractDecorator { public URLAsResourceName() { @@ -16,11 +17,14 @@ public class URLAsResourceName extends AbstractDecorator { @Override public boolean afterSetTag(final DDSpanContext context, final String tag, final Object value) { //Assign resource name - try { - final String path = new java.net.URL(String.valueOf(value)).getPath(); - context.setResourceName(path); - } catch (final MalformedURLException e) { - context.setResourceName(String.valueOf(value)); + if (context.getTags().containsKey(Tags.COMPONENT.getKey()) + && "java-web-servlet".equals(context.getTags().get(Tags.COMPONENT.getKey()))) { + try { + final String path = new java.net.URL(String.valueOf(value)).getPath(); + context.setResourceName(path); + } catch (final MalformedURLException e) { + context.setResourceName(String.valueOf(value)); + } } return true; } diff --git a/dd-trace/src/test/groovy/com/datadoghq/trace/integration/SpanDecoratorTest.groovy b/dd-trace/src/test/groovy/com/datadoghq/trace/integration/SpanDecoratorTest.groovy index 7e370882a5..7ab42fb3c5 100644 --- a/dd-trace/src/test/groovy/com/datadoghq/trace/integration/SpanDecoratorTest.groovy +++ b/dd-trace/src/test/groovy/com/datadoghq/trace/integration/SpanDecoratorTest.groovy @@ -109,4 +109,45 @@ class SpanDecoratorTest extends Specification { where: something = "fake-query" } + + def "set 404 as a resource on a 404 issue"() { + setup: + def tracer = new DDTracer() + def span = SpanFactory.newSpanOf(tracer) + tracer.addDecorator(new Status404Decorator()) + + when: + Tags.HTTP_STATUS.set(span, 404) + + then: + span.getResourceName() == "404" + + } + + def "set url as a resource only for the servlet integration"() { + setup: + def tracer = new DDTracer() + def span = SpanFactory.newSpanOf(tracer) + tracer.addDecorator(new URLAsResourceName()) + + when: + span.setResourceName("change-me") + Tags.COMPONENT.set(span, "java-web-servlet") + Tags.HTTP_URL.set(span, something) + + then: + span.getResourceName() == something + + when: + span.setResourceName("change-me") + Tags.COMPONENT.set(span, "other-contrib") + Tags.HTTP_URL.set(span, something) + + then: + span.getResourceName() == "change-me" + + + where: + something = "fake" + } }