Skip to content

Commit 663c755

Browse files
committed
feat: ignore_errors option
1 parent c6a9a7f commit 663c755

File tree

4 files changed

+45
-9
lines changed

4 files changed

+45
-9
lines changed

sentry_sdk/client.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import os
22
import uuid
33
import random
4+
import inspect
45

56
from .utils import Dsn, SkipEvent, ContextVar
67
from .transport import Transport
@@ -67,11 +68,6 @@ def _prepare_event(self, event, scope):
6768
if event.get("event_id") is None:
6869
event["event_id"] = uuid.uuid4().hex
6970

70-
if event._exc_value is not None:
71-
if _most_recent_exception.get(None) is event._exc_value:
72-
raise SkipEvent()
73-
_most_recent_exception.set(event._exc_value)
74-
7571
if scope is not None:
7672
scope.apply_to_event(event)
7773

@@ -84,21 +80,34 @@ def _prepare_event(self, event, scope):
8480
if event.get("platform") is None:
8581
event["platform"] = "python"
8682

83+
event = strip_event(event)
84+
event = flatten_metadata(event)
85+
return event
86+
87+
def _check_should_capture(self, event):
8788
if (
8889
self.options["sample_rate"] < 1.0
8990
and random.random() >= self.options["sample_rate"]
9091
):
9192
raise SkipEvent()
9293

93-
event = strip_event(event)
94-
event = flatten_metadata(event)
95-
return event
94+
if event._exc_value is not None:
95+
exclusions = self.options["ignore_errors"]
96+
exc_type = type(event._exc_value)
97+
98+
if any(inspect.isclass(e) and issubclass(exc_type, e) for e in exclusions):
99+
raise SkipEvent()
100+
101+
if _most_recent_exception.get(None) is event._exc_value:
102+
raise SkipEvent()
103+
_most_recent_exception.set(event._exc_value)
96104

97105
def capture_event(self, event, scope=None):
98106
"""Captures an event."""
99107
if self._transport is None:
100108
return
101109
try:
110+
self._check_should_capture(event)
102111
event = self._prepare_event(event, scope)
103112
except SkipEvent:
104113
return

sentry_sdk/consts.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
"send_default_pii": False,
2020
"http_proxy": os.environ.get("http_proxy"),
2121
"https_proxy": os.environ.get("https_proxy"),
22+
"ignore_errors": (),
2223
}
2324

2425
SDK_INFO = {"name": "sentry-python", "version": VERSION}

sentry_sdk/transport.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ def thread():
8989

9090

9191
class Transport(object):
92-
def __init__(self, dsn, http_proxy, https_proxy):
92+
def __init__(self, dsn, http_proxy=None, https_proxy=None):
9393
self.dsn = dsn
9494
self._queue = None
9595
self._done = False

tests/test_client.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import pytest
22
from sentry_sdk import Client
3+
from sentry_sdk.utils import Event
34
from sentry_sdk.transport import Transport
45

56

@@ -16,3 +17,28 @@ def test_transport_option(monkeypatch):
1617

1718
monkeypatch.setenv("SENTRY_DSN", dsn)
1819
assert str(Client(transport=Transport(dsn2)).dsn) == dsn2
20+
21+
22+
def test_ignore_errors():
23+
def e(exc_type):
24+
rv = Event()
25+
rv._exc_value = exc_type()
26+
return rv
27+
28+
class EventCaptured(Exception):
29+
pass
30+
31+
class TestTransport(Transport):
32+
def __init__(self, *a, **kw):
33+
pass
34+
35+
def start(self):
36+
pass
37+
38+
def capture_event(self, event):
39+
raise EventCaptured()
40+
41+
c = Client(ignore_errors=[Exception], transport=TestTransport())
42+
c.capture_event(e(Exception))
43+
c.capture_event(e(ValueError))
44+
pytest.raises(EventCaptured, lambda: c.capture_event(e(BaseException)))

0 commit comments

Comments
 (0)