11import os
22import uuid
33import random
4- import atexit
54from datetime import datetime
65
76from ._compat import string_types
1110 convert_types ,
1211 handle_in_app ,
1312 get_type_name ,
13+ logger ,
1414)
1515from .transport import make_transport
1616from .consts import DEFAULT_OPTIONS , SDK_INFO
@@ -42,7 +42,7 @@ def get_options(*args, **kwargs):
4242class Client (object ):
4343 def __init__ (self , * args , ** kwargs ):
4444 self .options = options = get_options (* args , ** kwargs )
45- self ._transport = make_transport (options )
45+ self .transport = make_transport (options )
4646
4747 request_bodies = ("always" , "never" , "small" , "medium" )
4848 if options ["request_bodies" ] not in request_bodies :
@@ -52,9 +52,6 @@ def __init__(self, *args, **kwargs):
5252 )
5353 )
5454
55- # XXX: we should probably only do this for the init()ed client
56- atexit .register (self .close )
57-
5855 @property
5956 def dsn (self ):
6057 """Returns the configured dsn."""
@@ -84,7 +81,10 @@ def _prepare_event(self, event, hint, scope):
8481
8582 before_send = self .options ["before_send" ]
8683 if before_send is not None :
87- event = before_send (event )
84+ new_event = before_send (event )
85+ if new_event is None :
86+ logger .info ("before send dropped event (%s)" , event )
87+ event = new_event
8888
8989 # Postprocess the event in the very end so that annotated types do
9090 # generally not surface in before_send
@@ -129,24 +129,28 @@ def _should_capture(self, event, hint=None, scope=None):
129129
130130 def capture_event (self , event , hint = None , scope = None ):
131131 """Captures an event."""
132- if self ._transport is None :
132+ if self .transport is None :
133133 return
134134 rv = event .get ("event_id" )
135135 if rv is None :
136136 event ["event_id" ] = rv = uuid .uuid4 ().hex
137137 if self ._should_capture (event , hint , scope ):
138138 event = self ._prepare_event (event , hint , scope )
139139 if event is not None :
140- self ._transport .capture_event (event )
140+ self .transport .capture_event (event )
141141 return rv
142142
143- def drain_events (self , timeout = None ):
144- if timeout is None :
145- timeout = self .options ["shutdown_timeout" ]
146- if self ._transport is not None :
147- self ._transport .drain_events (timeout )
143+ def close (self , timeout = None , shutdown_callback = None ):
144+ """Closes the client which shuts down the transport in an
145+ orderly manner.
146+ """
147+ if self .transport is not None :
148+ if timeout is None :
149+ timeout = self .options ["shutdown_timeout" ]
150+ self .transport .shutdown (timeout = timeout , callback = shutdown_callback )
151+
152+ def __enter__ (self ):
153+ return self
148154
149- def close (self ):
150- self .drain_events ()
151- if self ._transport is not None :
152- self ._transport .close ()
155+ def __exit__ (self , exc_type , exc_value , tb ):
156+ self .close ()
0 commit comments