From 9e8f523d756cc3867a1497fdbfce7deb9713fd9b Mon Sep 17 00:00:00 2001 From: David Ashpole Date: Mon, 28 Jun 2021 12:17:12 -0400 Subject: [PATCH] when using WithNewRoot, don't use the parent context for sampling (#2032) Co-authored-by: Tyler Yahn --- CHANGELOG.md | 2 ++ sdk/trace/span.go | 4 +++- sdk/trace/trace_test.go | 24 ++++++++++++++++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7f48318f7..84a508a7a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,8 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm ### Fixed +- When using WithNewRoot, don't use the parent context for making sampling decisions. (#2032) + ### Security ## [1.0.0-RC1] / 0.21.0 - 2021-06-18 diff --git a/sdk/trace/span.go b/sdk/trace/span.go index 4ecd8e8e9..da18e62c0 100644 --- a/sdk/trace/span.go +++ b/sdk/trace/span.go @@ -559,7 +559,9 @@ func startSpanInternal(ctx context.Context, tr *tracer, name string, o *trace.Sp // If told explicitly to make this a new root use a zero value SpanContext // as a parent which contains an invalid trace ID and is not remote. var psc trace.SpanContext - if !o.NewRoot() { + if o.NewRoot() { + ctx = trace.ContextWithSpanContext(ctx, psc) + } else { psc = trace.SpanContextFromContext(ctx) } diff --git a/sdk/trace/trace_test.go b/sdk/trace/trace_test.go index b6348e89a..4bf111610 100644 --- a/sdk/trace/trace_test.go +++ b/sdk/trace/trace_test.go @@ -376,6 +376,30 @@ func TestStartSpanWithParent(t *testing.T) { } } +func TestStartSpanNewRootNotSampled(t *testing.T) { + alwaysSampleTp := NewTracerProvider() + sampledTr := alwaysSampleTp.Tracer("AlwaysSampled") + neverSampleTp := NewTracerProvider(WithSampler(ParentBased(NeverSample()))) + neverSampledTr := neverSampleTp.Tracer("ParentBasedNeverSample") + ctx := context.Background() + + ctx, s1 := sampledTr.Start(trace.ContextWithRemoteSpanContext(ctx, sc), "span1-sampled") + if err := checkChild(t, sc, s1); err != nil { + t.Error(err) + } + + _, s2 := neverSampledTr.Start(ctx, "span2-no-newroot") + if !s2.SpanContext().IsSampled() { + t.Error(fmt.Errorf("got child span is not sampled, want child span with sampler: ParentBased(NeverSample()) to be sampled")) + } + + // Adding WithNewRoot causes child spans to not sample based on parent context + _, s3 := neverSampledTr.Start(ctx, "span3-newroot", trace.WithNewRoot()) + if s3.SpanContext().IsSampled() { + t.Error(fmt.Errorf("got child span is sampled, want child span WithNewRoot() and with sampler: ParentBased(NeverSample()) to not be sampled")) + } +} + func TestSetSpanAttributesOnStart(t *testing.T) { te := NewTestExporter() tp := NewTracerProvider(WithSyncer(te), WithResource(resource.Empty()))