@@ -598,14 +598,22 @@ def _prepare_event(
598598 before_send = self .options ["before_send" ]
599599 if before_send is not None and event is not None :
600600 new_event = None
601+ exception_raised_in_before_send = False
601602 with capture_internal_exceptions ():
602- new_event = before_send (event , hint or {})
603+ try :
604+ new_event = before_send (event , hint or {})
605+ except Exception :
606+ exception_raised_in_before_send = True
607+ raise
603608 if new_event is None :
604609 logger .info ("before send dropped event" )
605610 if self .transport :
606- self .transport .record_lost_event (
607- "before_send" , data_category = "error"
611+ reason = (
612+ "callback_error"
613+ if exception_raised_in_before_send
614+ else "before_send"
608615 )
616+ self .transport .record_lost_event (reason , data_category = "error" )
609617
610618 # If this is an exception, reset the DedupeIntegration. It still
611619 # remembers the dropped exception as the last exception, meaning
@@ -853,15 +861,32 @@ def _capture_telemetry(
853861 exception_raised_in_before_send_func = True
854862 raise
855863
856- if ty in ("log" , "metric" ):
857- # We are ok with dropping metrics and logs when an exception is raised
858- # because we allow users to drop them in their respect before_send_*
859- # functions.
864+ if ty == "log" :
865+ if exception_raised_in_before_send_func :
866+ if self .transport :
867+ self .transport .record_lost_event (
868+ "callback_error" , data_category = "log_item"
869+ )
870+ return
871+ if serialized is None :
872+ if self .transport :
873+ self .transport .record_lost_event (
874+ "before_send" , data_category = "log_item"
875+ )
876+ return
877+
878+ elif ty == "metric" :
860879 if exception_raised_in_before_send_func :
880+ if self .transport :
881+ self .transport .record_lost_event (
882+ "callback_error" , data_category = "trace_metric"
883+ )
861884 return
862- # Logs and metrics can be dropped in their respective
863- # before_send, so if we get None, don't queue them for sending.
864885 if serialized is None :
886+ if self .transport :
887+ self .transport .record_lost_event (
888+ "before_send" , data_category = "trace_metric"
889+ )
865890 return
866891
867892 elif ty == "span" and isinstance (telemetry , Span ):
0 commit comments