Skip to content

Commit 82869ea

Browse files
authored
fix: Set r in Parent CPS (#1455)
1 parent 1fabd31 commit 82869ea

File tree

3 files changed

+21
-5
lines changed

3 files changed

+21
-5
lines changed

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

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,14 @@ module ConsistentProbabilityTraceState
2323
# tracestate sanitized according to the Context invariants defined in the
2424
# tracestate probability sampling spec.
2525
#
26+
# If r is nil after the sanitization, it is generated from the trace_id.
27+
#
28+
# This method assumes the parent span context is valid.
29+
#
30+
# @param trace_id [OpenTelemetry::Trace::TraceId] the trace id
2631
# @param span_context [OpenTelemetry::Trace::SpanContext] the parent span context
2732
# @return [OpenTelemetry::Trace::Tracestate] the sanitized tracestate
28-
def sanitized_tracestate(span_context)
33+
def sanitized_tracestate(trace_id, span_context)
2934
sampled = span_context.trace_flags.sampled?
3035
tracestate = span_context.tracestate
3136
parse_ot_vendor_tag(tracestate) do |p, r, rest|
@@ -35,9 +40,13 @@ def sanitized_tracestate(span_context)
3540
p = nil
3641
elsif !p.nil? && !r.nil? && !invariant(p, r, sampled)
3742
p = nil
38-
else
43+
elsif !r.nil?
3944
return tracestate
4045
end
46+
if r.nil?
47+
OpenTelemetry.logger.debug("ConsistentProbabilitySampler: potentially inconsistent trace detected - r: #{r.inspect}")
48+
r = generate_r(trace_id)
49+
end
4150
update_tracestate(tracestate, p, r, rest)
4251
end
4352
end

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ def should_sample?(trace_id:, parent_context:, links:, name:, kind:, attributes:
4343
if !parent_span_context.valid?
4444
@root.should_sample?(trace_id: trace_id, parent_context: parent_context, links: links, name: name, kind: kind, attributes: attributes)
4545
else
46-
tracestate = sanitized_tracestate(parent_span_context)
46+
tracestate = sanitized_tracestate(trace_id, parent_span_context)
4747
if parent_span_context.trace_flags.sampled?
4848
Result.new(decision: Decision::RECORD_AND_SAMPLE, tracestate: tracestate)
4949
else

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,15 @@
3131
_(call_sampler(subject, parent_context: parent_context(sampled: false, ot: 'p:2;r:1')).tracestate['ot']).must_equal('p:2;r:1')
3232
_(call_sampler(subject, parent_context: parent_context(sampled: true, ot: 'p:2;r:1')).tracestate['ot']).must_equal('r:1')
3333
_(call_sampler(subject, parent_context: parent_context(sampled: true, ot: 'p:63;r:1')).tracestate['ot']).must_equal('p:63;r:1')
34-
_(call_sampler(subject, parent_context: parent_context(ot: 'p:1;r:63')).tracestate['ot']).must_be_nil
35-
_(call_sampler(subject, parent_context: parent_context(ot: 'p:1;r:63;junk')).tracestate['ot']).must_equal('junk')
34+
_(call_sampler(subject, trace_id: trace_id(-1), parent_context: parent_context(ot: 'p:1;r:63')).tracestate['ot']).must_equal('r:0')
35+
_(call_sampler(subject, trace_id: trace_id(-1), parent_context: parent_context(ot: 'p:1;r:63;junk')).tracestate['ot']).must_equal('r:0;junk')
36+
end
37+
38+
it 'sets r based on the trace_id if missing or invalid' do
39+
_(call_sampler(subject, trace_id: trace_id(-1), parent_context: parent_context(sampled: true)).tracestate['ot']).must_equal('r:0')
40+
_(call_sampler(subject, trace_id: trace_id(-1), parent_context: parent_context(sampled: false)).tracestate['ot']).must_equal('r:0')
41+
_(call_sampler(subject, trace_id: trace_id(-1), parent_context: parent_context(ot: 'r:63', sampled: true)).tracestate['ot']).must_equal('r:0')
42+
_(call_sampler(subject, trace_id: trace_id(-1), parent_context: parent_context(ot: 'r:63', sampled: false)).tracestate['ot']).must_equal('r:0')
3643
end
3744

3845
it 'respects parent sampling decision' do

0 commit comments

Comments
 (0)