6
6
7
7
import sentry_sdk
8
8
from sentry_sdk import start_span , start_transaction , capture_exception
9
- from sentry_sdk .tracing import Transaction
10
9
from sentry_sdk .utils import logger
11
10
12
11
13
- def test_sampling_decided_only_for_transactions (sentry_init , capture_events ):
12
+ def test_sampling_decided_only_for_root_spans (sentry_init ):
14
13
sentry_init (traces_sample_rate = 0.5 )
15
14
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
18
17
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
21
20
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
24
23
25
24
26
25
@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 ):
28
27
sentry_init (traces_sample_rate = 1.0 )
29
28
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
37
36
38
37
39
38
def test_no_double_sampling (sentry_init , capture_events ):
@@ -147,10 +146,17 @@ def test_ignores_inherited_sample_decision_when_traces_sampler_defined(
147
146
traces_sampler = mock .Mock (return_value = not parent_sampling_decision )
148
147
sentry_init (traces_sampler = traces_sampler )
149
148
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
+ )
152
153
)
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
154
160
155
161
156
162
@pytest .mark .parametrize ("explicit_decision" , [True , False ])
@@ -176,39 +182,38 @@ def test_inherits_parent_sampling_decision_when_traces_sampler_undefined(
176
182
sentry_init (traces_sample_rate = 0.5 )
177
183
mock_random_value = 0.25 if parent_sampling_decision is False else 0.75
178
184
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 )
182
188
)
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
184
196
185
197
186
198
@pytest .mark .parametrize ("parent_sampling_decision" , [True , False ])
187
199
def test_passes_parent_sampling_decision_in_sampling_context (
188
200
sentry_init , parent_sampling_decision
189
201
):
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 )
191
207
192
208
sentry_trace_header = (
193
209
"12312012123120121231201212312012-1121201211212012-{sampled}" .format (
194
210
sampled = int (parent_sampling_decision )
195
211
)
196
212
)
197
213
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
212
217
213
218
214
219
def test_passes_attributes_from_start_span_to_traces_sampler (
0 commit comments