From d751c0670e52fd0c629ec7001f64999fff912ea7 Mon Sep 17 00:00:00 2001 From: "andrew.glaude" Date: Fri, 9 Sep 2022 09:44:22 -0400 Subject: [PATCH 1/3] ddtrace/tracer: Always count dropped p0 traces and spans --- ddtrace/tracer/tracer.go | 2 ++ ddtrace/tracer/tracer_test.go | 5 +++++ 2 files changed, 7 insertions(+) diff --git a/ddtrace/tracer/tracer.go b/ddtrace/tracer/tracer.go index 6b4437d7b0..7204dcd2aa 100644 --- a/ddtrace/tracer/tracer.go +++ b/ddtrace/tracer/tracer.go @@ -335,6 +335,8 @@ func (t *tracer) sampleFinishedTrace(info *finishedTrace) { return } if !t.rulesSampling.HasSpanRules() { + atomic.AddUint64(&t.droppedP0Traces, 1) + atomic.AddUint64(&t.droppedP0Spans, uint64(len(info.spans))) info.spans = nil return } diff --git a/ddtrace/tracer/tracer_test.go b/ddtrace/tracer/tracer_test.go index 04e42a7a26..ce18675490 100644 --- a/ddtrace/tracer/tracer_test.go +++ b/ddtrace/tracer/tracer_test.go @@ -351,6 +351,11 @@ func TestSamplingDecision(t *testing.T) { t.Run("client_dropped", func(t *testing.T) { tracer, _, _, stop := startTestTracer(t) + defer func() { + // Must check these after tracer is stopped to avoid flakiness + assert.Equal(t, uint64(1), tracer.droppedP0Traces) + assert.Equal(t, uint64(2), tracer.droppedP0Spans) + }() defer stop() tracer.config.agent.DropP0s = true tracer.config.sampler = NewRateSampler(0) From 7543cf04872f73dccfdadb2bf957460d4f67705b Mon Sep 17 00:00:00 2001 From: "andrew.glaude" Date: Fri, 9 Sep 2022 09:53:40 -0400 Subject: [PATCH 2/3] Have to update version --- internal/version/version.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/version/version.go b/internal/version/version.go index 1796280576..892cc91b94 100644 --- a/internal/version/version.go +++ b/internal/version/version.go @@ -8,4 +8,4 @@ package version // Tag specifies the current release tag. It needs to be manually // updated. A test checks that the value of Tag never points to a // git tag that is older than HEAD. -const Tag = "v1.41.0" +const Tag = "v1.41.1" From 42b5cbacb286fbb2af38b761371a00866ad48a36 Mon Sep 17 00:00:00 2001 From: "andrew.glaude" Date: Fri, 9 Sep 2022 15:17:30 -0400 Subject: [PATCH 3/3] Refactor to reduce duplication / make logic more clear, Thanks Katie --- ddtrace/tracer/tracer.go | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/ddtrace/tracer/tracer.go b/ddtrace/tracer/tracer.go index 7204dcd2aa..cb29718e5b 100644 --- a/ddtrace/tracer/tracer.go +++ b/ddtrace/tracer/tracer.go @@ -334,27 +334,24 @@ func (t *tracer) sampleFinishedTrace(info *finishedTrace) { if info.decision == decisionKeep { return } - if !t.rulesSampling.HasSpanRules() { - atomic.AddUint64(&t.droppedP0Traces, 1) - atomic.AddUint64(&t.droppedP0Spans, uint64(len(info.spans))) - info.spans = nil - return - } - // if trace sampling decision is drop, we still want to send single spans - // unless there are no single span sampling rules defined var kept []*span - for _, span := range info.spans { - if t.rulesSampling.SampleSpan(span) { - kept = append(kept, span) + if t.rulesSampling.HasSpanRules() { + // Apply sampling rules to individual spans in the trace. + for _, span := range info.spans { + if t.rulesSampling.SampleSpan(span) { + kept = append(kept, span) + } + } + if len(kept) > 0 && len(kept) < len(info.spans) { + // Some spans in the trace were kept, so a partial trace will be sent. + atomic.AddUint64(&t.partialTraces, 1) } } - atomic.AddUint64(&t.droppedP0Spans, uint64(len(info.spans)-len(kept))) - info.spans = kept if len(kept) == 0 { atomic.AddUint64(&t.droppedP0Traces, 1) - return // no spans matched the rules and were sampled } - atomic.AddUint64(&t.partialTraces, 1) + atomic.AddUint64(&t.droppedP0Spans, uint64(len(info.spans)-len(kept))) + info.spans = kept } func (t *tracer) pushTrace(trace *finishedTrace) {