From 66c3cdc5aa30ca8d7242c4dd0a19f0b6a8c4f824 Mon Sep 17 00:00:00 2001 From: Bob Reid Date: Thu, 8 Apr 2021 14:58:22 -0400 Subject: [PATCH 1/5] Only capture exception if RQ job has failed --- sentry_sdk/integrations/rq.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sentry_sdk/integrations/rq.py b/sentry_sdk/integrations/rq.py index 1af4b0babd..76b378157b 100644 --- a/sentry_sdk/integrations/rq.py +++ b/sentry_sdk/integrations/rq.py @@ -89,7 +89,10 @@ def sentry_patched_perform_job(self, job, *args, **kwargs): def sentry_patched_handle_exception(self, job, *exc_info, **kwargs): # type: (Worker, Any, *Any, **Any) -> Any - _capture_exception(exc_info) # type: ignore + + if job.is_failed: + _capture_exception(exc_info) # type: ignore + return old_handle_exception(self, job, *exc_info, **kwargs) Worker.handle_exception = sentry_patched_handle_exception From e32ce0e5fa997227a313b4a490c292c5e30c2c2a Mon Sep 17 00:00:00 2001 From: Bob Reid Date: Tue, 13 Apr 2021 17:17:38 -0400 Subject: [PATCH 2/5] Remove lignore logger in RQ integration and add test --- sentry_sdk/integrations/rq.py | 22 +++++++++++----------- tests/integrations/rq/test_rq.py | 18 +++++++++++++++--- 2 files changed, 26 insertions(+), 14 deletions(-) diff --git a/sentry_sdk/integrations/rq.py b/sentry_sdk/integrations/rq.py index 76b378157b..9b3dccc96d 100644 --- a/sentry_sdk/integrations/rq.py +++ b/sentry_sdk/integrations/rq.py @@ -3,30 +3,28 @@ import weakref from sentry_sdk.hub import Hub -from sentry_sdk.integrations import Integration, DidNotEnable +from sentry_sdk.integrations import DidNotEnable, Integration +from sentry_sdk.integrations.logging import ignore_logger from sentry_sdk.tracing import Transaction from sentry_sdk.utils import capture_internal_exceptions, event_from_exception - try: - from rq.version import VERSION as RQ_VERSION + from rq.queue import Queue from rq.timeouts import JobTimeoutException + from rq.version import VERSION as RQ_VERSION from rq.worker import Worker - from rq.queue import Queue except ImportError: raise DidNotEnable("RQ not installed") from sentry_sdk._types import MYPY if MYPY: - from typing import Any - from typing import Dict - from typing import Callable - - from rq.job import Job + from typing import Any, Callable, Dict - from sentry_sdk.utils import ExcInfo from sentry_sdk._types import EventProcessor + from sentry_sdk.utils import ExcInfo + + from rq.job import Job class RqIntegration(Integration): @@ -89,7 +87,6 @@ def sentry_patched_perform_job(self, job, *args, **kwargs): def sentry_patched_handle_exception(self, job, *exc_info, **kwargs): # type: (Worker, Any, *Any, **Any) -> Any - if job.is_failed: _capture_exception(exc_info) # type: ignore @@ -112,6 +109,9 @@ def sentry_patched_enqueue_job(self, job, **kwargs): Queue.enqueue_job = sentry_patched_enqueue_job + ignore_logger("rq.worker") + + def _make_event_processor(weak_job): # type: (Callable[[], Job]) -> EventProcessor def event_processor(event, hint): diff --git a/tests/integrations/rq/test_rq.py b/tests/integrations/rq/test_rq.py index ee3e5f51fa..e3e4b4bc9f 100644 --- a/tests/integrations/rq/test_rq.py +++ b/tests/integrations/rq/test_rq.py @@ -1,8 +1,7 @@ -from sentry_sdk.integrations.rq import RqIntegration - import pytest - from fakeredis import FakeStrictRedis +from sentry_sdk.integrations.rq import RqIntegration + import rq try: @@ -177,3 +176,16 @@ def test_traces_sampler_gets_correct_values_in_sampling_context( } ) ) + +def test_job_with_retries(sentry_init, capture_events): + sentry_init(integrations=[RqIntegration()]) + events = capture_events() + + queue = rq.Queue(connection=FakeStrictRedis()) + worker = rq.SimpleWorker([queue], connection=queue.connection) + + queue.enqueue(crashing_job, foo=42, retry=rq.Retry(max=1)) + worker.work(burst=True) + + assert len(events) == 1 + From 0fff084c905007de54bab9ea8c9bee061907b795 Mon Sep 17 00:00:00 2001 From: Bob Reid Date: Tue, 13 Apr 2021 17:24:48 -0400 Subject: [PATCH 3/5] fix linting errors --- sentry_sdk/integrations/rq.py | 1 - tests/integrations/rq/test_rq.py | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/sentry_sdk/integrations/rq.py b/sentry_sdk/integrations/rq.py index 9b3dccc96d..f4c77d7df2 100644 --- a/sentry_sdk/integrations/rq.py +++ b/sentry_sdk/integrations/rq.py @@ -108,7 +108,6 @@ def sentry_patched_enqueue_job(self, job, **kwargs): Queue.enqueue_job = sentry_patched_enqueue_job - ignore_logger("rq.worker") diff --git a/tests/integrations/rq/test_rq.py b/tests/integrations/rq/test_rq.py index e3e4b4bc9f..b20decb5ff 100644 --- a/tests/integrations/rq/test_rq.py +++ b/tests/integrations/rq/test_rq.py @@ -177,6 +177,7 @@ def test_traces_sampler_gets_correct_values_in_sampling_context( ) ) + def test_job_with_retries(sentry_init, capture_events): sentry_init(integrations=[RqIntegration()]) events = capture_events() @@ -188,4 +189,3 @@ def test_job_with_retries(sentry_init, capture_events): worker.work(burst=True) assert len(events) == 1 - From 26ea63d558d72f742c0d4b4fb6c72887bf74de3c Mon Sep 17 00:00:00 2001 From: Bob Reid Date: Thu, 15 Apr 2021 16:17:45 -0400 Subject: [PATCH 4/5] Skip test if RQ version < 1.5 --- tests/integrations/rq/test_rq.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/integrations/rq/test_rq.py b/tests/integrations/rq/test_rq.py index b20decb5ff..aff81d078c 100644 --- a/tests/integrations/rq/test_rq.py +++ b/tests/integrations/rq/test_rq.py @@ -177,7 +177,9 @@ def test_traces_sampler_gets_correct_values_in_sampling_context( ) ) - +@pytest.mark.skipif( + rq.__version__.split(".") < ["1", "5"], reason="At least rq-1.5 required" +) def test_job_with_retries(sentry_init, capture_events): sentry_init(integrations=[RqIntegration()]) events = capture_events() From 9617917d393a1eb7e98c3f454cd56153c73ef124 Mon Sep 17 00:00:00 2001 From: Bob Reid Date: Thu, 15 Apr 2021 16:19:51 -0400 Subject: [PATCH 5/5] fix linter --- tests/integrations/rq/test_rq.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/integrations/rq/test_rq.py b/tests/integrations/rq/test_rq.py index aff81d078c..651bf22248 100644 --- a/tests/integrations/rq/test_rq.py +++ b/tests/integrations/rq/test_rq.py @@ -177,6 +177,7 @@ def test_traces_sampler_gets_correct_values_in_sampling_context( ) ) + @pytest.mark.skipif( rq.__version__.split(".") < ["1", "5"], reason="At least rq-1.5 required" )