Skip to content

Commit d9b5998

Browse files
committed
.
1 parent 8a94824 commit d9b5998

File tree

2 files changed

+25
-10
lines changed

2 files changed

+25
-10
lines changed

sentry_sdk/integrations/opentelemetry/sampler.py

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,19 @@ def get_parent_sampled(parent_context, trace_id):
5050
return None
5151

5252

53+
def get_parent_sample_rate(parent_context, trace_id):
54+
# type: (Optional[SpanContext], int) -> Optional[bool]
55+
if parent_context is None:
56+
return None
57+
58+
is_span_context_valid = parent_context is not None and parent_context.is_valid
59+
60+
if is_span_context_valid and parent_context.trace_id == trace_id:
61+
return parent_context.trace_state.get(TRACESTATE_SAMPLE_RATE_KEY)
62+
63+
return None
64+
65+
5366
def _update_sample_rate(sample_rate: float, trace_state: TraceState) -> TraceState:
5467
if TRACESTATE_SAMPLE_RATE_KEY in trace_state:
5568
trace_state = trace_state.update(TRACESTATE_SAMPLE_RATE_KEY, str(sample_rate))
@@ -168,22 +181,26 @@ def should_sample(
168181
# Check if there is a traces_sampler
169182
# Traces_sampler is responsible to check parent sampled to have full transactions.
170183
has_traces_sampler = callable(client.options.get("traces_sampler"))
171-
inherited_parent_sampled = False
184+
185+
sample_rate_to_propagate = None
172186

173187
if is_root_span and has_traces_sampler:
174188
sampling_context = create_sampling_context(
175189
name, attributes, parent_span_context, trace_id
176190
)
177191
sample_rate = client.options["traces_sampler"](sampling_context)
192+
sample_rate_to_propagate = sample_rate
178193
else:
179194
# Check if there is a parent with a sampling decision
180195
parent_sampled = get_parent_sampled(parent_span_context, trace_id)
196+
parent_sample_rate = get_parent_sample_rate(parent_span_context, trace_id)
181197
if parent_sampled is not None:
182-
sample_rate = parent_sampled
183-
inherited_parent_sampled = True
198+
sample_rate = bool(parent_sampled)
199+
sample_rate_to_propagate = parent_sample_rate
184200
else:
185201
# Check if there is a traces_sample_rate
186202
sample_rate = client.options.get("traces_sample_rate")
203+
sample_rate_to_propagate = sample_rate
187204

188205
# If the sample rate is invalid, drop the span
189206
if not is_valid_sample_rate(sample_rate, source=self.__class__.__name__):
@@ -195,22 +212,20 @@ def should_sample(
195212
# Down-sample in case of back pressure monitor says so
196213
if is_root_span and client.monitor:
197214
sample_rate /= 2**client.monitor.downsample_factor
215+
if client.monitor.downsample_factor > 0:
216+
sample_rate_to_propagate = sample_rate
198217

199218
# Roll the dice on sample rate
200219
sample_rate = float(cast("Union[bool, float, int]", sample_rate))
201220
sampled = random.random() < sample_rate
202221

203222
if sampled:
204223
return sampled_result(
205-
parent_span_context,
206-
attributes,
207-
sample_rate=sample_rate if not inherited_parent_sampled else None,
224+
parent_span_context, attributes, sample_rate=sample_rate_to_propagate
208225
)
209226
else:
210227
return dropped_result(
211-
parent_span_context,
212-
attributes,
213-
sample_rate=sample_rate if not inherited_parent_sampled else None,
228+
parent_span_context, attributes, sample_rate=sample_rate_to_propagate
214229
)
215230

216231
def get_description(self) -> str:

tests/test_dsc.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ def test_dsc_continuation_of_trace(sentry_init, capture_envelopes):
118118

119119
assert "sample_rate" in envelope_trace_header
120120
assert type(envelope_trace_header["sample_rate"]) == str
121-
assert envelope_trace_header["sample_rate"] == "1.0"
121+
assert envelope_trace_header["sample_rate"] == "0.01337"
122122

123123
assert "sampled" in envelope_trace_header
124124
assert type(envelope_trace_header["sampled"]) == str

0 commit comments

Comments
 (0)