Skip to content

Commit 8bfaffa

Browse files
authored
fix: consistently pass tracestate (#1453)
1 parent 1ad4a21 commit 8bfaffa

File tree

3 files changed

+15
-30
lines changed

3 files changed

+15
-30
lines changed

sdk_experimental/lib/opentelemetry/sdk/trace/samplers/consistent_probability_based.rb

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,27 +42,16 @@ def ==(other)
4242
def should_sample?(trace_id:, parent_context:, links:, name:, kind:, attributes:)
4343
parent_span_context = OpenTelemetry::Trace.current_span(parent_context).context
4444
p = probabilistic_p
45-
if parent_span_context.valid?
46-
tracestate = parent_span_context.tracestate
47-
parse_ot_vendor_tag(tracestate) do |_, in_r, rest|
48-
r = if in_r.nil? || in_r > 62
49-
OpenTelemetry.logger.debug("ConsistentProbabilitySampler: potentially inconsistent trace detected - r: #{in_r.inspect}")
50-
generate_r(trace_id)
51-
else
52-
in_r
53-
end
54-
if p <= r
55-
Result.new(decision: Decision::RECORD_AND_SAMPLE, tracestate: update_tracestate(tracestate, p, r, rest))
56-
else
57-
Result.new(decision: Decision::DROP, tracestate: update_tracestate(tracestate, nil, r, rest))
58-
end
45+
tracestate = parent_span_context.tracestate
46+
parse_ot_vendor_tag(tracestate) do |_, r, rest|
47+
if r.nil? || r > 62
48+
OpenTelemetry.logger.debug("ConsistentProbabilitySampler: potentially inconsistent trace detected - r: #{r.inspect}") if parent_span_context.valid?
49+
r = generate_r(trace_id)
5950
end
60-
else
61-
r = generate_r(trace_id)
6251
if p <= r
63-
Result.new(decision: Decision::RECORD_AND_SAMPLE, tracestate: new_tracestate(p: p, r: r))
52+
Result.new(decision: Decision::RECORD_AND_SAMPLE, tracestate: update_tracestate(tracestate, p, r, rest))
6453
else
65-
Result.new(decision: Decision::DROP, tracestate: new_tracestate(r: r))
54+
Result.new(decision: Decision::DROP, tracestate: update_tracestate(tracestate, nil, r, rest))
6655
end
6756
end
6857
end

sdk_experimental/lib/opentelemetry/sdk/trace/samplers/consistent_probability_tracestate.rb

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -88,18 +88,6 @@ def update_tracestate(tracestate, p, r, rest) # rubocop:disable Naming/Uncommuni
8888
end
8989
end
9090

91-
def new_tracestate(p: nil, r: nil) # rubocop:disable Naming/UncommunicativeMethodParamName
92-
if p.nil? && r.nil?
93-
OpenTelemetry::Trace::Tracestate::DEFAULT
94-
elsif p.nil?
95-
OpenTelemetry::Trace::Tracestate.from_hash('ot' => "r:#{r}")
96-
elsif r.nil?
97-
OpenTelemetry::Trace::Tracestate.from_hash('ot' => "p:#{p}")
98-
else
99-
OpenTelemetry::Trace::Tracestate.from_hash('ot' => "p:#{p};r:#{r}")
100-
end
101-
end
102-
10391
def invariant(p, r, sampled) # rubocop:disable Naming/UncommunicativeMethodParamName
10492
((p <= r) == sampled) || (sampled && (p == 63))
10593
end

sdk_experimental/test/opentelemetry/sdk/trace/samplers/consistent_probability_based_test.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,14 @@
2828
_(result).wont_be :sampled?
2929
end
3030

31+
it 'passes through tracestate even if the parent span is invalid' do
32+
tracestate = OpenTelemetry::Trace::Tracestate.from_hash({ 'foo' => 'bar' })
33+
parent_span_context = OpenTelemetry::Trace::SpanContext.new(tracestate: tracestate)
34+
parent_context = OpenTelemetry::Trace.context_with_span(OpenTelemetry::Trace::Span.new(span_context: parent_span_context))
35+
result = call_sampler(subject, trace_id: trace_id(1), parent_context: parent_context)
36+
_(result.tracestate['foo']).must_equal('bar')
37+
end
38+
3139
it 'populates tracestate with the parent r for a sampled child span' do
3240
tid = trace_id(1)
3341
ctx = parent_context(trace_id: tid, ot: 'p:1;r:1')

0 commit comments

Comments
 (0)