@@ -38,6 +38,47 @@ class PropagationContext
3838 # @return [Float, nil]
3939 attr_reader :sample_rand
4040
41+ # Extract the trace_id, parent_span_id and parent_sampled values from a sentry-trace header.
42+ #
43+ # @param sentry_trace [String] the sentry-trace header value from the previous transaction.
44+ # @return [Array, nil]
45+ def self . extract_sentry_trace ( sentry_trace )
46+ match = SENTRY_TRACE_REGEXP . match ( sentry_trace )
47+ return if match . nil?
48+
49+ trace_id , parent_span_id , sampled_flag = match [ 1 ..3 ]
50+ parent_sampled = sampled_flag . nil? ? nil : sampled_flag != "0"
51+
52+ [ trace_id , parent_span_id , parent_sampled ]
53+ end
54+
55+ def self . extract_sample_rand_from_baggage ( baggage , trace_id = nil )
56+ return unless baggage &.items
57+
58+ sample_rand_str = baggage . items [ "sample_rand" ]
59+ return unless sample_rand_str
60+
61+ generator = Utils ::SampleRand . new ( trace_id : trace_id )
62+ generator . generate_from_value ( sample_rand_str )
63+ end
64+
65+ def self . generate_sample_rand ( baggage , trace_id , parent_sampled )
66+ generator = Utils ::SampleRand . new ( trace_id : trace_id )
67+
68+ if baggage &.items && !parent_sampled . nil?
69+ sample_rate_str = baggage . items [ "sample_rate" ]
70+ sample_rate = sample_rate_str &.to_f
71+
72+ if sample_rate && !parent_sampled . nil?
73+ generator . generate_from_sampling_decision ( parent_sampled , sample_rate )
74+ else
75+ generator . generate_from_trace_id
76+ end
77+ else
78+ generator . generate_from_trace_id
79+ end
80+ end
81+
4182 def initialize ( scope , env = nil )
4283 @scope = scope
4384 @parent_span_id = nil
@@ -66,7 +107,8 @@ def initialize(scope, env = nil)
66107 Baggage . new ( { } )
67108 end
68109
69- @sample_rand = extract_sample_rand_from_baggage ( @baggage )
110+ @sample_rand = self . class . extract_sample_rand_from_baggage ( @baggage , @trace_id ) ||
111+
70112 @baggage . freeze!
71113 @incoming_trace = true
72114 end
@@ -75,21 +117,7 @@ def initialize(scope, env = nil)
75117
76118 @trace_id ||= Utils . uuid
77119 @span_id = Utils . uuid . slice ( 0 , 16 )
78- @sample_rand ||= generate_sample_rand
79- end
80-
81- # Extract the trace_id, parent_span_id and parent_sampled values from a sentry-trace header.
82- #
83- # @param sentry_trace [String] the sentry-trace header value from the previous transaction.
84- # @return [Array, nil]
85- def self . extract_sentry_trace ( sentry_trace )
86- match = SENTRY_TRACE_REGEXP . match ( sentry_trace )
87- return if match . nil?
88-
89- trace_id , parent_span_id , sampled_flag = match [ 1 ..3 ]
90- parent_sampled = sampled_flag . nil? ? nil : sampled_flag != "0"
91-
92- [ trace_id , parent_span_id , parent_sampled ]
120+ @sample_rand ||= self . class . generate_sample_rand ( @baggage , @trace_id , @parent_sampled )
93121 end
94122
95123 # Returns the trace context that can be used to embed in an Event.
@@ -139,32 +167,5 @@ def populate_head_baggage
139167 items . compact!
140168 @baggage = Baggage . new ( items , mutable : false )
141169 end
142-
143- def extract_sample_rand_from_baggage ( baggage )
144- return unless baggage &.items
145-
146- sample_rand_str = baggage . items [ "sample_rand" ]
147- return unless sample_rand_str
148-
149- generator = Utils ::SampleRand . new ( trace_id : @trace_id )
150- generator . generate_from_value ( sample_rand_str )
151- end
152-
153- def generate_sample_rand
154- generator = Utils ::SampleRand . new ( trace_id : @trace_id )
155-
156- if @incoming_trace && !@parent_sampled . nil? && @baggage
157- sample_rate_str = @baggage . items [ "sample_rate" ]
158- sample_rate = sample_rate_str &.to_f
159-
160- if sample_rate && !@parent_sampled . nil?
161- generator . generate_from_sampling_decision ( @parent_sampled , sample_rate )
162- else
163- generator . generate_from_trace_id
164- end
165- else
166- generator . generate_from_trace_id
167- end
168- end
169170 end
170171end
0 commit comments