1
1
import os
2
2
import uuid
3
3
import random
4
- import atexit
5
4
from datetime import datetime
6
5
7
6
from ._compat import string_types
11
10
convert_types ,
12
11
handle_in_app ,
13
12
get_type_name ,
13
+ logger ,
14
14
)
15
15
from .transport import make_transport
16
16
from .consts import DEFAULT_OPTIONS , SDK_INFO
@@ -42,7 +42,7 @@ def get_options(*args, **kwargs):
42
42
class Client (object ):
43
43
def __init__ (self , * args , ** kwargs ):
44
44
self .options = options = get_options (* args , ** kwargs )
45
- self ._transport = make_transport (options )
45
+ self .transport = make_transport (options )
46
46
47
47
request_bodies = ("always" , "never" , "small" , "medium" )
48
48
if options ["request_bodies" ] not in request_bodies :
@@ -52,9 +52,6 @@ def __init__(self, *args, **kwargs):
52
52
)
53
53
)
54
54
55
- # XXX: we should probably only do this for the init()ed client
56
- atexit .register (self .close )
57
-
58
55
@property
59
56
def dsn (self ):
60
57
"""Returns the configured dsn."""
@@ -84,7 +81,10 @@ def _prepare_event(self, event, hint, scope):
84
81
85
82
before_send = self .options ["before_send" ]
86
83
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
88
88
89
89
# Postprocess the event in the very end so that annotated types do
90
90
# generally not surface in before_send
@@ -129,24 +129,28 @@ def _should_capture(self, event, hint=None, scope=None):
129
129
130
130
def capture_event (self , event , hint = None , scope = None ):
131
131
"""Captures an event."""
132
- if self ._transport is None :
132
+ if self .transport is None :
133
133
return
134
134
rv = event .get ("event_id" )
135
135
if rv is None :
136
136
event ["event_id" ] = rv = uuid .uuid4 ().hex
137
137
if self ._should_capture (event , hint , scope ):
138
138
event = self ._prepare_event (event , hint , scope )
139
139
if event is not None :
140
- self ._transport .capture_event (event )
140
+ self .transport .capture_event (event )
141
141
return rv
142
142
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
148
154
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