99from pyramid .response import Response
1010from werkzeug .test import Client
1111
12+ import sentry_sdk
1213from sentry_sdk import add_breadcrumb , capture_message
1314from sentry_sdk .integrations .pyramid import PyramidIntegration
1415from sentry_sdk .serializer import MAX_DATABAG_BREADTH
16+ from sentry_sdk .traces import SpanStatus
1517from tests .conftest import unpack_werkzeug_response
1618
1719try :
@@ -126,6 +128,7 @@ def hi2(request):
126128 assert event ["transaction" ] == "hi2"
127129
128130
131+ @pytest .mark .parametrize ("span_streaming" , [True , False ])
129132@pytest .mark .parametrize (
130133 "url,transaction_style,expected_transaction,expected_source" ,
131134 [
@@ -139,20 +142,38 @@ def test_transaction_style(
139142 sentry_init ,
140143 get_client ,
141144 capture_events ,
145+ capture_items ,
142146 url ,
143147 transaction_style ,
144148 expected_transaction ,
145149 expected_source ,
150+ span_streaming ,
146151):
147- sentry_init (integrations = [PyramidIntegration (transaction_style = transaction_style )])
152+ sentry_init (
153+ integrations = [PyramidIntegration (transaction_style = transaction_style )],
154+ traces_sample_rate = 1.0 ,
155+ _experiments = {"trace_lifecycle" : "stream" if span_streaming else "static" },
156+ )
157+
158+ if span_streaming :
159+ items = capture_items ("event" , "span" )
160+ else :
161+ events = capture_events ()
148162
149- events = capture_events ()
150163 client = get_client ()
151164 client .get (url )
152165
153- (event ,) = events
154- assert event ["transaction" ] == expected_transaction
155- assert event ["transaction_info" ] == {"source" : expected_source }
166+ if span_streaming :
167+ sentry_sdk .flush ()
168+ spans = [i .payload for i in items if i .type == "span" ]
169+ assert len (spans ) == 1
170+ (segment ,) = spans
171+ assert segment ["name" ] == expected_transaction
172+ assert segment ["attributes" ]["sentry.span.source" ] == expected_source
173+ else :
174+ (_ , transaction_event ) = events
175+ assert transaction_event ["transaction" ] == expected_transaction
176+ assert transaction_event ["transaction_info" ] == {"source" : expected_source }
156177
157178
158179@pytest .mark .parametrize ("max_value_length" , [1024 , None ])
@@ -453,16 +474,79 @@ def index(request):
453474 assert not errors
454475
455476
456- def test_span_origin (sentry_init , capture_events , get_client ):
477+ @pytest .mark .parametrize ("span_streaming" , [True , False ])
478+ def test_tracing_error (
479+ sentry_init , capture_events , capture_items , route , get_client , span_streaming
480+ ):
457481 sentry_init (
458482 integrations = [PyramidIntegration ()],
459483 traces_sample_rate = 1.0 ,
484+ _experiments = {"trace_lifecycle" : "stream" if span_streaming else "static" },
460485 )
461- events = capture_events ()
486+
487+ if span_streaming :
488+ items = capture_items ("event" , "span" )
489+ else :
490+ events = capture_events ()
491+
492+ @route ("/tracing-error" )
493+ def tracing_error (request ):
494+ 1 / 0
462495
463496 client = get_client ()
464- client .get ("/message" )
497+ with pytest .raises (ZeroDivisionError ):
498+ client .get ("/tracing-error" )
499+
500+ if span_streaming :
501+ sentry_sdk .flush ()
502+ spans = [i .payload for i in items if i .type == "span" ]
503+ error_events = [i .payload for i in items if i .type == "event" ]
504+
505+ assert len (spans ) == 1
506+ assert len (error_events ) == 1
465507
466- (_ , event ) = events
508+ (segment ,) = spans
509+ (error_event ,) = error_events
467510
468- assert event ["contexts" ]["trace" ]["origin" ] == "auto.http.pyramid"
511+ assert segment ["name" ] == "tracing_error"
512+ assert segment ["status" ] == SpanStatus .ERROR
513+ assert segment ["attributes" ]["sentry.origin" ] == "auto.http.pyramid"
514+
515+ assert error_event ["exception" ]["values" ][- 1 ]["type" ] == "ZeroDivisionError"
516+ assert error_event ["exception" ]["values" ][- 1 ]["mechanism" ]["type" ] == "pyramid"
517+ else :
518+ error_event , transaction_event = events
519+
520+ assert transaction_event ["type" ] == "transaction"
521+ assert transaction_event ["transaction" ] == "tracing_error"
522+ assert transaction_event ["contexts" ]["trace" ]["status" ] == "internal_error"
523+
524+ assert error_event ["exception" ]["values" ][- 1 ]["type" ] == "ZeroDivisionError"
525+ assert error_event ["exception" ]["values" ][- 1 ]["mechanism" ]["type" ] == "pyramid"
526+
527+
528+ @pytest .mark .parametrize ("span_streaming" , [True , False ])
529+ def test_span_origin (sentry_init , capture_events , capture_items , get_client , span_streaming ):
530+ sentry_init (
531+ integrations = [PyramidIntegration ()],
532+ traces_sample_rate = 1.0 ,
533+ _experiments = {"trace_lifecycle" : "stream" if span_streaming else "static" },
534+ )
535+
536+ if span_streaming :
537+ items = capture_items ("event" , "span" )
538+ else :
539+ events = capture_events ()
540+
541+ client = get_client ()
542+ client .get ("/message" )
543+
544+ if span_streaming :
545+ sentry_sdk .flush ()
546+ spans = [i .payload for i in items if i .type == "span" ]
547+ assert len (spans ) == 1
548+ (segment ,) = spans
549+ assert segment ["attributes" ]["sentry.origin" ] == "auto.http.pyramid"
550+ else :
551+ (_ , event ) = events
552+ assert event ["contexts" ]["trace" ]["origin" ] == "auto.http.pyramid"
0 commit comments