From bb69666e9f9ed410135d6f9a1b4d49771d75bcf7 Mon Sep 17 00:00:00 2001 From: Andrew Kent Date: Wed, 18 Apr 2018 12:32:20 -0700 Subject: [PATCH] Handle spans registered after trace is written Decrement the pending trace count when spans are registered after a trace writes. Log certain pending trace messages at debug. --- .../java/datadog/opentracing/PendingTrace.java | 6 +++--- .../datadog/opentracing/PendingTraceTest.groovy | 16 ++++++++++++++++ 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/dd-trace-ot/src/main/java/datadog/opentracing/PendingTrace.java b/dd-trace-ot/src/main/java/datadog/opentracing/PendingTrace.java index 2bdfbdcf26..f96eea0fb8 100644 --- a/dd-trace-ot/src/main/java/datadog/opentracing/PendingTrace.java +++ b/dd-trace-ot/src/main/java/datadog/opentracing/PendingTrace.java @@ -75,7 +75,7 @@ public class PendingTrace extends ConcurrentLinkedDeque { public void addSpan(final DDSpan span) { if (span.getDurationNano() == 0) { - log.warn("{} - added to trace, but not complete.", span); + log.debug("{} - added to trace, but not complete.", span); return; } if (traceId != span.getTraceId()) { @@ -85,10 +85,10 @@ public class PendingTrace extends ConcurrentLinkedDeque { if (!isWritten.get()) { addFirst(span); - expireSpan(span); } else { - log.warn("{} - finished after trace reported.", span); + log.debug("{} - finished after trace reported.", span); } + expireSpan(span); } /** diff --git a/dd-trace-ot/src/test/groovy/datadog/opentracing/PendingTraceTest.groovy b/dd-trace-ot/src/test/groovy/datadog/opentracing/PendingTraceTest.groovy index 2f653e1018..f298a7be82 100644 --- a/dd-trace-ot/src/test/groovy/datadog/opentracing/PendingTraceTest.groovy +++ b/dd-trace-ot/src/test/groovy/datadog/opentracing/PendingTraceTest.groovy @@ -142,4 +142,20 @@ class PendingTraceTest extends Specification { otherTrace.weakReferences.size() == 0 otherTrace.asList() == [] } + + + def "child spans created after trace written" () { + setup: + rootSpan.finish() + // this shouldn't happen, but it's possible users of the api + // may incorrectly add spans after the trace is reported. + // in those cases we should still decrement the pending trace count + DDSpan childSpan = tracer.buildSpan("child").asChildOf(rootSpan).start() + childSpan.finish() + + expect: + trace.pendingReferenceCount.get() == 0 + trace.asList() == [rootSpan] + writer == [[rootSpan]] + } }