3131 add_breadcrumb ,
3232 capture_message ,
3333 isolation_scope ,
34- new_scope ,
3534)
3635from sentry_sdk ._compat import PY37 , PY38
3736from sentry_sdk .envelope import Envelope , Item , PayloadRef , parse_json
@@ -514,40 +513,45 @@ def record_lost_event(reason, data_category=None, item=None):
514513
515514 capturing_server .respond_with (
516515 code = response_code ,
517- headers = {"X-Sentry-Rate-Limits" : "4711:attachment :organization" },
516+ headers = {"X-Sentry-Rate-Limits" : "4711:session :organization" },
518517 )
519518
520- with new_scope () as scope :
521- scope .add_attachment (bytes = b"Hello" , filename = "hello.txt" )
522- client .capture_event ({"type" : "error" }, scope = scope )
519+ session_envelope = Envelope ()
520+ session_envelope .add_item (
521+ Item (payload = PayloadRef (json = {"sid" : "123" }), type = "session" )
522+ )
523+ client .transport .capture_envelope (session_envelope )
523524 client .flush ()
524525
525526 assert len (capturing_server .captured ) == 1
526527 assert capturing_server .captured [0 ].path == "/api/132/envelope/"
527528 capturing_server .clear_captured ()
528529
529- assert set (client .transport ._disabled_until ) == set (["attachment " ])
530+ assert set (client .transport ._disabled_until ) == set (["session " ])
530531
531- with new_scope () as scope :
532- scope .add_attachment (bytes = b"Hello" , filename = "hello.txt" )
533- client .capture_event ({"type" : "error" }, scope = scope )
534- with new_scope () as scope :
535- scope .add_attachment (bytes = b"Hello" , filename = "hello.txt" )
536- client .capture_event ({"type" : "error" }, scope = scope )
532+ session_envelope = Envelope ()
533+ session_envelope .add_item (
534+ Item (payload = PayloadRef (json = {"sid" : "456" }), type = "session" )
535+ )
536+ client .transport .capture_envelope (session_envelope )
537+ session_envelope = Envelope ()
538+ session_envelope .add_item (
539+ Item (payload = PayloadRef (json = {"sid" : "789" }), type = "session" )
540+ )
541+ client .transport .capture_envelope (session_envelope )
537542 client .flush ()
538543
539- # events go through but attachments are dropped
540- assert len (capturing_server .captured ) == 2
544+ assert not capturing_server .captured
541545
542- client .capture_event ({"type" : "error " })
546+ client .capture_event ({"type" : "event " })
543547 client .flush ()
544548
545- assert len (capturing_server .captured ) == 3
546- assert capturing_server .captured [2 ].path == "/api/132/envelope/"
549+ assert len (capturing_server .captured ) == 1
550+ assert capturing_server .captured [0 ].path == "/api/132/envelope/"
547551
548552 assert captured_outcomes == [
549- ("ratelimit_backoff" , "attachment " ),
550- ("ratelimit_backoff" , "attachment " ),
553+ ("ratelimit_backoff" , "session " ),
554+ ("ratelimit_backoff" , "session " ),
551555 ]
552556
553557
@@ -560,7 +564,7 @@ def test_data_category_limits_reporting(
560564 capturing_server .respond_with (
561565 code = response_code ,
562566 headers = {
563- "X-Sentry-Rate-Limits" : "4711:error :organization, 4711:attachment:organization"
567+ "X-Sentry-Rate-Limits" : "4711:session :organization, 4711:attachment:organization"
564568 },
565569 )
566570
@@ -577,69 +581,89 @@ def intercepting_fetch(*args, **kwargs):
577581 # get rid of threading making things hard to track
578582 monkeypatch .setattr (client .transport ._worker , "submit" , lambda x : x () or True )
579583
580- with new_scope () as scope :
581- scope .add_attachment (bytes = b"Hello World" , filename = "hello.txt" )
582- client .capture_event ({"type" : "error" }, scope = scope )
584+ session_envelope = Envelope ()
585+ session_envelope .add_item (
586+ Item (payload = PayloadRef (json = {"sid" : "123" }), type = "session" )
587+ )
588+ client .transport .capture_envelope (session_envelope )
583589 client .flush ()
584590
585591 assert len (capturing_server .captured ) == 1
586592 assert capturing_server .captured [0 ].path == "/api/132/envelope/"
587593 capturing_server .clear_captured ()
588594
589- assert set (client .transport ._disabled_until ) == set (["attachment" , "error " ])
595+ assert set (client .transport ._disabled_until ) == set (["attachment" , "session " ])
590596
591- with new_scope () as scope :
592- scope .add_attachment (bytes = b"Hello World" , filename = "hello.txt" )
593- client .capture_event ({"type" : "error" }, scope = scope )
594- with new_scope () as scope :
595- scope .add_attachment (bytes = b"Hello World" , filename = "hello.txt" )
596- client .capture_event ({"type" : "error" }, scope = scope )
597+ session_envelope = Envelope ()
598+ session_envelope .add_item (
599+ Item (payload = PayloadRef (json = {"sid" : "456" }), type = "session" )
600+ )
601+ client .transport .capture_envelope (session_envelope )
602+ session_envelope = Envelope ()
603+ session_envelope .add_item (
604+ Item (payload = PayloadRef (json = {"sid" : "789" }), type = "session" )
605+ )
606+ client .transport .capture_envelope (session_envelope )
597607 capturing_server .clear_captured ()
598608
599609 # flush out the events but don't flush the client reports
600610 client .flush ()
601611 client .transport ._last_client_report_sent = 0
602612 outcomes_enabled = True
603613
604- client .capture_event ({"type" : "error" })
614+ with isolation_scope () as scope :
615+ scope .add_attachment (bytes = b"Hello World" , filename = "hello.txt" )
616+ client .capture_event ({"type" : "error" }, scope = scope )
605617 client .flush ()
606618
607- # the client report is flushed alongside the event (which is also dropped
608- # because error is rate-limited)
619+ # the error goes through (not rate-limited), attachment is dropped;
620+ # the client report piggybacks on the error envelope
609621 assert len (capturing_server .captured ) == 1
610622 envelope = capturing_server .captured [0 ].envelope
611- assert envelope .items [0 ].type == "client_report"
612- report = parse_json (envelope .items [0 ].get_bytes ())
623+ assert envelope .items [0 ].type == "event"
624+ assert envelope .items [1 ].type == "client_report"
625+ report = parse_json (envelope .items [1 ].get_bytes ())
613626
614627 discarded_events = report ["discarded_events" ]
615628
616629 assert len (discarded_events ) == 2
617630 assert {
618- "category" : "error " ,
631+ "category" : "session " ,
619632 "reason" : "ratelimit_backoff" ,
620- "quantity" : 3 ,
633+ "quantity" : 2 ,
621634 } in discarded_events
622635 assert {
623636 "category" : "attachment" ,
624637 "reason" : "ratelimit_backoff" ,
625- "quantity" : 22 ,
638+ "quantity" : 11 ,
626639 } in discarded_events
627640
628641 capturing_server .clear_captured ()
629642
630- # send more events (error is still rate-limited)
631- client .capture_event ({"type" : "error" })
643+ # send a session (dropped) and a normal error (goes through)
644+ session_envelope = Envelope ()
645+ session_envelope .add_item (
646+ Item (payload = PayloadRef (json = {"sid" : "000" }), type = "session" )
647+ )
648+ client .transport .capture_envelope (session_envelope )
649+ client .capture_event ({"type" : "error" , "release" : "foo" })
632650 client .flush ()
633651
634- assert len (capturing_server .captured ) == 1
635- envelope = capturing_server .captured [0 ].envelope
652+ assert len (capturing_server .captured ) == 2
653+
654+ assert len (capturing_server .captured [0 ].envelope .items ) == 1
655+ event = capturing_server .captured [0 ].envelope .items [0 ].get_event ()
656+ assert event ["type" ] == "error"
657+ assert event ["release" ] == "foo"
658+
659+ envelope = capturing_server .captured [1 ].envelope
636660 assert envelope .items [0 ].type == "client_report"
637661 report = parse_json (envelope .items [0 ].get_bytes ())
638662
639663 discarded_events = report ["discarded_events" ]
640664 assert len (discarded_events ) == 1
641665 assert {
642- "category" : "error " ,
666+ "category" : "session " ,
643667 "reason" : "ratelimit_backoff" ,
644668 "quantity" : 1 ,
645669 } in discarded_events
0 commit comments