From 657bba35b3cfb3750125fbbcc388179852217885 Mon Sep 17 00:00:00 2001 From: Marcin Grzejszczak Date: Mon, 9 May 2016 18:01:01 +0200 Subject: [PATCH] Sampling child span when parent is null, the created child span will be sampled fixes #271 --- .../cloud/sleuth/trace/DefaultTracer.java | 16 +++++++++++----- .../cloud/sleuth/trace/DefaultTracerTests.java | 11 +++++++++++ 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/DefaultTracer.java b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/DefaultTracer.java index fefcdc5e0..454956c3a 100644 --- a/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/DefaultTracer.java +++ b/spring-cloud-sleuth-core/src/main/java/org/springframework/cloud/sleuth/trace/DefaultTracer.java @@ -82,11 +82,7 @@ public class DefaultTracer implements Tracer { if (sampler==null) { sampler = this.defaultSampler; } - if (!sampler.isSampled(span)) { - // Non-exportable so we keep the trace but not other data - span = Span.builder().begin(span.getBegin()).name(name).traceId(id) - .spanId(id).exportable(false).build(); - } + span = sampledSpan(name, id, span, sampler); this.spanLogger.logStartedSpan(null, span); } return continueSpan(span); @@ -147,6 +143,7 @@ public class DefaultTracer implements Tracer { if (parent == null) { Span span = Span.builder().begin(System.currentTimeMillis()).name(name) .traceId(id).spanId(id).build(); + span = sampledSpan(name, id, span, this.defaultSampler); this.spanLogger.logStartedSpan(null, span); return span; } @@ -163,6 +160,15 @@ public class DefaultTracer implements Tracer { } } + private Span sampledSpan(String name, long id, Span span, Sampler sampler) { + if (!sampler.isSampled(span)) { + // Non-exportable so we keep the trace but not other data + return Span.builder().begin(span.getBegin()).name(name).traceId(id) + .spanId(id).exportable(false).build(); + } + return span; + } + private long createId() { return this.random.nextLong(); } diff --git a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/trace/DefaultTracerTests.java b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/trace/DefaultTracerTests.java index f365cd601..49448a939 100644 --- a/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/trace/DefaultTracerTests.java +++ b/spring-cloud-sleuth-core/src/test/java/org/springframework/cloud/sleuth/trace/DefaultTracerTests.java @@ -30,6 +30,7 @@ import org.springframework.cloud.sleuth.Span; import org.springframework.cloud.sleuth.SpanNamer; import org.springframework.cloud.sleuth.SpanReporter; import org.springframework.cloud.sleuth.Tracer; +import org.springframework.cloud.sleuth.assertions.SleuthAssertions; import org.springframework.cloud.sleuth.log.SpanLogger; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; import org.springframework.cloud.sleuth.sampler.NeverSampler; @@ -161,6 +162,16 @@ public class DefaultTracerTests { assertThat(tracer.getCurrentSpan(), is(equalTo(grandParent))); } + @Test + public void samplingIsRanAgainstChildSpanWhenThereIsNoParent() { + DefaultTracer tracer = new DefaultTracer(new NeverSampler(), new Random(), + this.spanNamer, this.spanLogger, this.spanReporter); + + Span span = tracer.createChild(null, "childName"); + + SleuthAssertions.assertThat(span.isExportable()).isFalse(); + } + @Test public void shouldUpdateLogsInSpanWhenItGetsContinued() { DefaultTracer tracer = new DefaultTracer(new AlwaysSampler(), new Random(),