7
7
import time
8
8
9
9
from datetime import datetime , timedelta
10
+ from collections import defaultdict
10
11
11
12
from sentry_sdk .utils import Dsn , logger , capture_internal_exceptions , json_dumps
12
13
from sentry_sdk .worker import BackgroundWorker
23
24
from typing import Tuple
24
25
from typing import Type
25
26
from typing import Union
27
+ from typing import DefaultDict
26
28
27
29
from urllib3 .poolmanager import PoolManager # type: ignore
28
30
from urllib3 .poolmanager import ProxyManager
@@ -93,12 +95,16 @@ def kill(self):
93
95
"""Forcefully kills the transport."""
94
96
pass
95
97
96
- def record_lost_event (self , reason , data_category = "default" ):
98
+ def record_lost_event (
99
+ self ,
100
+ reason , # type: str
101
+ data_category = "default" , # type: str
102
+ ):
103
+ # type: (...) -> None
97
104
"""This increments a counter for event loss by reason and
98
105
data category.
99
106
"""
100
- # type: (...) -> None
101
- pass
107
+ return None
102
108
103
109
def __del__ (self ):
104
110
# type: () -> None
@@ -139,8 +145,10 @@ def __init__(
139
145
self ._auth = self .parsed_dsn .to_auth ("sentry.python/%s" % VERSION )
140
146
self ._disabled_until = {} # type: Dict[DataCategory, datetime]
141
147
self ._retry = urllib3 .util .Retry ()
142
- self ._discarded_events = {}
143
- self ._last_event_loss_sent = None
148
+ self ._discarded_events = defaultdict (
149
+ int
150
+ ) # type: DefaultDict[Tuple[str, str], int]
151
+ self ._last_event_loss_sent = None # type: Optional[float]
144
152
145
153
self ._pool = self ._make_pool (
146
154
self .parsed_dsn ,
@@ -153,10 +161,13 @@ def __init__(
153
161
154
162
self .hub_cls = Hub
155
163
156
- def record_lost_event (self , reason , data_category = "default" ):
157
- # This is not locked because we are okay with small mismeasuring.
158
- key = (data_category , reason )
159
- self ._discarded_events [key ] = self ._discarded_events .get (key , 0 ) + 1
164
+ def record_lost_event (
165
+ self ,
166
+ reason , # type: str
167
+ data_category = "default" , # type: str
168
+ ):
169
+ # type: (...) -> None
170
+ self ._discarded_events [data_category , reason ] += 1
160
171
161
172
def _update_rate_limits (self , response ):
162
173
# type: (urllib3.HTTPResponse) -> None
@@ -184,14 +195,16 @@ def _send_request(
184
195
endpoint_type = "store" , # type: EndpointType
185
196
envelope = None , # type: Optional[Envelope]
186
197
):
198
+ # type: (...) -> None
199
+
187
200
def record_loss (reason ):
201
+ # type: (str) -> None
188
202
if envelope is None :
189
203
self .record_lost_event (reason , "error" )
190
204
else :
191
205
for item in envelope .items :
192
206
self .record_lost_event (reason , item .data_category )
193
207
194
- # type: (...) -> None
195
208
headers .update (
196
209
{
197
210
"User-Agent" : str (self ._auth .client ),
@@ -237,6 +250,7 @@ def on_dropped_event(self, reason):
237
250
return None
238
251
239
252
def _flush_stats (self , force = False ):
253
+ # type: (bool) -> None
240
254
discarded_events = self ._discarded_events
241
255
242
256
if not (
@@ -247,7 +261,7 @@ def _flush_stats(self, force=False):
247
261
):
248
262
return
249
263
250
- self ._discarded_events = {}
264
+ self ._discarded_events = defaultdict ( int )
251
265
self ._last_event_loss_sent = time .time ()
252
266
253
267
client_report = Item (
0 commit comments