66
77import sentry_sdk
88from sentry_sdk import start_span , start_transaction , capture_exception
9- from sentry_sdk .tracing import Transaction
109from sentry_sdk .utils import logger
1110
1211
13- def test_sampling_decided_only_for_transactions (sentry_init , capture_events ):
12+ def test_sampling_decided_only_for_root_spans (sentry_init ):
1413 sentry_init (traces_sample_rate = 0.5 )
1514
16- with start_transaction (name = "hi " ) as transaction :
17- assert transaction .sampled is not None
15+ with start_span (name = "outer1 " ) as root_span1 :
16+ assert root_span1 .sampled is not None
1817
19- with start_span () as span :
20- assert span .sampled == transaction .sampled
18+ with start_span (name = "inner" ) as span :
19+ assert span .sampled == root_span1 .sampled
2120
22- with start_span () as span :
23- assert span .sampled is None
21+ with start_span (name = "outer2" ) as root_span2 :
22+ assert root_span2 .sampled is not None
2423
2524
2625@pytest .mark .parametrize ("sampled" , [True , False ])
27- def test_nested_transaction_sampling_override (sentry_init , sampled ):
26+ def test_nested_span_sampling_override (sentry_init , sampled ):
2827 sentry_init (traces_sample_rate = 1.0 )
2928
30- with start_transaction (name = "outer" , sampled = sampled ) as outer_transaction :
31- assert outer_transaction .sampled is sampled
32- with start_transaction (
33- name = "inner" , sampled = ( not sampled )
34- ) as inner_transaction :
35- assert inner_transaction .sampled is not sampled
36- assert outer_transaction .sampled is sampled
29+ with start_span (name = "outer" , sampled = sampled ) as outer_span :
30+ assert outer_span .sampled is sampled
31+ with start_span ( name = "inner" , sampled = ( not sampled )) as inner_span :
32+ # won't work because the child span inherits the sampling decision
33+ # from the parent
34+ assert inner_span .sampled is sampled
35+ assert outer_span .sampled is sampled
3736
3837
3938def test_no_double_sampling (sentry_init , capture_events ):
@@ -147,10 +146,17 @@ def test_ignores_inherited_sample_decision_when_traces_sampler_defined(
147146 traces_sampler = mock .Mock (return_value = not parent_sampling_decision )
148147 sentry_init (traces_sampler = traces_sampler )
149148
150- transaction = start_transaction (
151- name = "dogpark" , parent_sampled = parent_sampling_decision
149+ sentry_trace_header = (
150+ "12312012123120121231201212312012-1121201211212012-{sampled}" .format (
151+ sampled = int (parent_sampling_decision )
152+ )
152153 )
153- assert transaction .sampled is not parent_sampling_decision
154+
155+ with sentry_sdk .continue_trace ({"sentry-trace" : sentry_trace_header }):
156+ with sentry_sdk .start_span (name = "dogpark" ) as span :
157+ pass
158+
159+ assert span .sampled is not parent_sampling_decision
154160
155161
156162@pytest .mark .parametrize ("explicit_decision" , [True , False ])
@@ -176,39 +182,38 @@ def test_inherits_parent_sampling_decision_when_traces_sampler_undefined(
176182 sentry_init (traces_sample_rate = 0.5 )
177183 mock_random_value = 0.25 if parent_sampling_decision is False else 0.75
178184
179- with mock . patch . object ( random , "random" , return_value = mock_random_value ):
180- transaction = start_transaction (
181- name = "dogpark" , parent_sampled = parent_sampling_decision
185+ sentry_trace_header = (
186+ "12312012123120121231201212312012-1121201211212012-{sampled}" . format (
187+ sampled = int ( parent_sampling_decision )
182188 )
183- assert transaction .sampled is parent_sampling_decision
189+ )
190+ with mock .patch .object (random , "random" , return_value = mock_random_value ):
191+ with sentry_sdk .continue_trace ({"sentry-trace" : sentry_trace_header }):
192+ with start_span (name = "dogpark" ) as span :
193+ pass
194+
195+ assert span .sampled is parent_sampling_decision
184196
185197
186198@pytest .mark .parametrize ("parent_sampling_decision" , [True , False ])
187199def test_passes_parent_sampling_decision_in_sampling_context (
188200 sentry_init , parent_sampling_decision
189201):
190- sentry_init (traces_sample_rate = 1.0 )
202+ def dummy_traces_sampler (sampling_context ):
203+ assert sampling_context ["parent_sampled" ] is parent_sampling_decision
204+ return 1.0
205+
206+ sentry_init (traces_sample_rate = 1.0 , traces_sampler = dummy_traces_sampler )
191207
192208 sentry_trace_header = (
193209 "12312012123120121231201212312012-1121201211212012-{sampled}" .format (
194210 sampled = int (parent_sampling_decision )
195211 )
196212 )
197213
198- transaction = Transaction .continue_from_headers (
199- headers = {"sentry-trace" : sentry_trace_header }, name = "dogpark"
200- )
201- spy = mock .Mock (wraps = transaction )
202- start_transaction (transaction = spy )
203-
204- # there's only one call (so index at 0) and kwargs are always last in a call
205- # tuple (so index at -1)
206- sampling_context = spy ._set_initial_sampling_decision .mock_calls [0 ][- 1 ][
207- "sampling_context"
208- ]
209- assert "parent_sampled" in sampling_context
210- # because we passed in a spy, attribute access requires unwrapping
211- assert sampling_context ["parent_sampled" ]._mock_wraps is parent_sampling_decision
214+ with sentry_sdk .continue_trace ({"sentry-trace" : sentry_trace_header }):
215+ with sentry_sdk .start_span (name = "dogpark" ):
216+ pass
212217
213218
214219def test_passes_attributes_from_start_span_to_traces_sampler (
0 commit comments