Skip to content

Commit 699283b

Browse files
committed
Reduce duplication between Transaction/PropagationContext
1 parent 04fe927 commit 699283b

2 files changed

Lines changed: 46 additions & 63 deletions

File tree

sentry-ruby/lib/sentry/propagation_context.rb

Lines changed: 44 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -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
170171
end

sentry-ruby/lib/sentry/transaction.rb

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -155,26 +155,8 @@ def self.extract_sentry_trace(sentry_trace)
155155
end
156156

157157
def self.extract_sample_rand_from_baggage(baggage, trace_id, parent_sampled)
158-
generator = Utils::SampleRand.new(trace_id: trace_id)
159-
160-
unless baggage&.items
161-
return generator.generate_from_trace_id
162-
end
163-
164-
sample_rand_str = baggage.items["sample_rand"]
165-
166-
if sample_rand_str
167-
return generator.generate_from_value(sample_rand_str)
168-
end
169-
170-
sample_rate_str = baggage.items["sample_rate"]
171-
sample_rate = sample_rate_str&.to_f
172-
173-
if sample_rate && parent_sampled != nil
174-
generator.generate_from_sampling_decision(parent_sampled, sample_rate)
175-
else
176-
generator.generate_from_trace_id
177-
end
158+
PropagationContext.extract_sample_rand_from_baggage(baggage, trace_id) ||
159+
PropagationContext.generate_sample_rand(baggage, trace_id, parent_sampled)
178160
end
179161

180162
# @return [Hash]

0 commit comments

Comments
 (0)