From 680fa1b9419190c525cb758d17dc35d819f9d322 Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Wed, 6 Feb 2019 17:13:30 +0100 Subject: [PATCH 1/2] fix: Ignore Celery's retry exceptions --- sentry_sdk/integrations/celery.py | 17 ++++++----- tests/integrations/celery/test_celery.py | 36 ++++++++++++++++++++++++ tox.ini | 5 ++-- 3 files changed, 49 insertions(+), 9 deletions(-) diff --git a/sentry_sdk/integrations/celery.py b/sentry_sdk/integrations/celery.py index ba405df3bf..9db17a40fb 100644 --- a/sentry_sdk/integrations/celery.py +++ b/sentry_sdk/integrations/celery.py @@ -2,7 +2,7 @@ import sys -from celery.exceptions import SoftTimeLimitExceeded +from celery.exceptions import SoftTimeLimitExceeded, Retry from sentry_sdk.hub import Hub from sentry_sdk.utils import capture_internal_exceptions, event_from_exception @@ -82,6 +82,15 @@ def event_processor(event, hint): } if "exc_info" in hint: + with capture_internal_exceptions(): + if isinstance(hint["exc_info"][1], Retry): + return None + + if hasattr(task, "throws") and isinstance( + hint["exc_info"][1], task.throws + ): + return None + with capture_internal_exceptions(): if issubclass(hint["exc_info"][0], SoftTimeLimitExceeded): event["fingerprint"] = [ @@ -90,12 +99,6 @@ def event_processor(event, hint): getattr(task, "name", task), ] - with capture_internal_exceptions(): - if hasattr(task, "throws") and isinstance( - hint["exc_info"][1], task.throws - ): - return None - return event return event_processor diff --git a/tests/integrations/celery/test_celery.py b/tests/integrations/celery/test_celery.py index fd661b1264..1d72e97721 100644 --- a/tests/integrations/celery/test_celery.py +++ b/tests/integrations/celery/test_celery.py @@ -103,3 +103,39 @@ def dummy_task(x, y): assert stack_lengths == [2] else: assert stack_lengths == [2, 2] + + +@pytest.mark.skipif( + VERSION in ((4, 2, 0), (4, 2, 1)), + reason="https://github.com/celery/celery/issues/4661", +) +def test_retry(celery, capture_events): + events = capture_events() + failures = [True, True, False] + runs = [] + + @celery.task(name="dummy_task", bind=True) + def dummy_task(self): + runs.append(1) + try: + if failures.pop(0): + 1 / 0 + except Exception as exc: + self.retry(max_retries=2, exc=exc) + + dummy_task.delay() + + assert len(runs) == 3 + assert not events + + failures = [True, True, True] + runs = [] + + dummy_task.delay() + + assert len(runs) == 3 + event, = events + exceptions = event["exception"]["values"] + + for e in exceptions: + assert e["type"] == "ZeroDivisionError" diff --git a/tox.ini b/tox.ini index ae63e27540..fa2df06e6b 100644 --- a/tox.ini +++ b/tox.ini @@ -22,7 +22,7 @@ envlist = py3.7-sanic-0.8 - {pypy,py2.7,py3.5,py3.6,py3.7,py3.8}-celery-4 + {pypy,py2.7,py3.5,py3.6,py3.7,py3.8}-celery-{4.1,4.2} {pypy,py2.7}-celery-3 {py2.7,py3.7}-requests @@ -65,7 +65,8 @@ deps = sanic: aiohttp celery-3: Celery>=3.1,<4.0 - celery-4: Celery>=4.0,<5.0 + celery-4.1: Celery>=4.1,<4.2 + celery-4.2: Celery>=4.2,<4.3 requests: requests>=2.0 From 9279e60394b06c4e1114e6bdf458e37d0ff4e040 Mon Sep 17 00:00:00 2001 From: Markus Unterwaditzer Date: Wed, 6 Feb 2019 18:24:13 +0100 Subject: [PATCH 2/2] fix: Skipping --- tests/integrations/celery/test_celery.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integrations/celery/test_celery.py b/tests/integrations/celery/test_celery.py index 1d72e97721..7c1df719d9 100644 --- a/tests/integrations/celery/test_celery.py +++ b/tests/integrations/celery/test_celery.py @@ -106,7 +106,7 @@ def dummy_task(x, y): @pytest.mark.skipif( - VERSION in ((4, 2, 0), (4, 2, 1)), + (4, 2, 0) <= VERSION < (4, 2, 2), reason="https://github.com/celery/celery/issues/4661", ) def test_retry(celery, capture_events):