Skip to content

Commit 4b4ffc0

Browse files
authored
fix(transport): Unified hook for capturing metric about dropped events (#1100)
1 parent fe5055f commit 4b4ffc0

File tree

2 files changed

+26
-14
lines changed

2 files changed

+26
-14
lines changed

sentry_sdk/transport.py

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -150,12 +150,14 @@ def _update_rate_limits(self, response):
150150
# no matter of the status code to update our internal rate limits.
151151
header = response.headers.get("x-sentry-rate-limits")
152152
if header:
153+
logger.warning("Rate-limited via x-sentry-rate-limits")
153154
self._disabled_until.update(_parse_rate_limits(header))
154155

155156
# old sentries only communicate global rate limit hits via the
156157
# retry-after header on 429. This header can also be emitted on new
157158
# sentries if a proxy in front wants to globally slow things down.
158159
elif response.status == 429:
160+
logger.warning("Rate-limited via 429")
159161
self._disabled_until[None] = datetime.utcnow() + timedelta(
160162
seconds=self._retry.get_retry_after(response) or 60
161163
)
@@ -173,19 +175,24 @@ def _send_request(
173175
"X-Sentry-Auth": str(self._auth.to_header()),
174176
}
175177
)
176-
response = self._pool.request(
177-
"POST",
178-
str(self._auth.get_api_url(endpoint_type)),
179-
body=body,
180-
headers=headers,
181-
)
178+
try:
179+
response = self._pool.request(
180+
"POST",
181+
str(self._auth.get_api_url(endpoint_type)),
182+
body=body,
183+
headers=headers,
184+
)
185+
except Exception:
186+
self.on_dropped_event("network")
187+
raise
182188

183189
try:
184190
self._update_rate_limits(response)
185191

186192
if response.status == 429:
187193
# if we hit a 429. Something was rate limited but we already
188194
# acted on this in `self._update_rate_limits`.
195+
self.on_dropped_event("status_429")
189196
pass
190197

191198
elif response.status >= 300 or response.status < 200:
@@ -194,9 +201,14 @@ def _send_request(
194201
response.status,
195202
response.data,
196203
)
204+
self.on_dropped_event("status_{}".format(response.status))
197205
finally:
198206
response.close()
199207

208+
def on_dropped_event(self, reason):
209+
# type: (str) -> None
210+
pass
211+
200212
def _check_disabled(self, category):
201213
# type: (str) -> bool
202214
def _disabled(bucket):
@@ -212,6 +224,7 @@ def _send_event(
212224
# type: (...) -> None
213225

214226
if self._check_disabled("error"):
227+
self.on_dropped_event("self_rate_limits")
215228
return None
216229

217230
body = io.BytesIO()
@@ -325,7 +338,8 @@ def send_event_wrapper():
325338
with capture_internal_exceptions():
326339
self._send_event(event)
327340

328-
self._worker.submit(send_event_wrapper)
341+
if not self._worker.submit(send_event_wrapper):
342+
self.on_dropped_event("full_queue")
329343

330344
def capture_envelope(
331345
self, envelope # type: Envelope
@@ -339,7 +353,8 @@ def send_envelope_wrapper():
339353
with capture_internal_exceptions():
340354
self._send_envelope(envelope)
341355

342-
self._worker.submit(send_envelope_wrapper)
356+
if not self._worker.submit(send_envelope_wrapper):
357+
self.on_dropped_event("full_queue")
343358

344359
def flush(
345360
self,

sentry_sdk/worker.py

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -109,16 +109,13 @@ def _wait_flush(self, timeout, callback):
109109
logger.error("flush timed out, dropped %s events", pending)
110110

111111
def submit(self, callback):
112-
# type: (Callable[[], None]) -> None
112+
# type: (Callable[[], None]) -> bool
113113
self._ensure_thread()
114114
try:
115115
self._queue.put_nowait(callback)
116+
return True
116117
except Full:
117-
self.on_full_queue(callback)
118-
119-
def on_full_queue(self, callback):
120-
# type: (Optional[Any]) -> None
121-
logger.error("background worker queue full, dropping event")
118+
return False
122119

123120
def _target(self):
124121
# type: () -> None

0 commit comments

Comments
 (0)