From 227a8b47ab5dd5fd75b4c933ff0dde3e959830e1 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Mon, 23 Feb 2026 10:13:10 +0100 Subject: [PATCH 1/2] fix(rq): Support rq 2.7.0+ where SimpleWorker inherits from BaseWorker In rq 2.7.0, SimpleWorker was changed to inherit directly from BaseWorker instead of Worker. This meant our monkey-patches on Worker.perform_job and Worker.handle_exception were bypassed for SimpleWorker, causing no Sentry events to be captured. Patch BaseWorker when available (rq >= 1.7.0) to cover both Worker and SimpleWorker. Fall back to patching Worker for older versions. Co-Authored-By: Claude Opus 4.6 --- sentry_sdk/integrations/rq.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/sentry_sdk/integrations/rq.py b/sentry_sdk/integrations/rq.py index 8caf46b171..4c79e5bb4c 100644 --- a/sentry_sdk/integrations/rq.py +++ b/sentry_sdk/integrations/rq.py @@ -43,7 +43,18 @@ def setup_once() -> None: version = parse_version(RQ_VERSION) _check_minimum_version(RqIntegration, version) - old_perform_job = Worker.perform_job + # In rq 2.7.0+, SimpleWorker inherits from BaseWorker directly + # instead of Worker, so we need to patch BaseWorker to cover both. + # For older versions where BaseWorker doesn't exist or doesn't have + # perform_job, we patch Worker. + try: + from rq.worker import BaseWorker + + worker_cls = BaseWorker if hasattr(BaseWorker, "perform_job") else Worker + except ImportError: + worker_cls = Worker + + old_perform_job = worker_cls.perform_job @ensure_integration_enabled(RqIntegration, old_perform_job) def sentry_patched_perform_job( @@ -78,9 +89,9 @@ def sentry_patched_perform_job( return rv - Worker.perform_job = sentry_patched_perform_job + worker_cls.perform_job = sentry_patched_perform_job - old_handle_exception = Worker.handle_exception + old_handle_exception = worker_cls.handle_exception def sentry_patched_handle_exception( self: "Worker", job: "Any", *exc_info: "Any", **kwargs: "Any" @@ -96,7 +107,7 @@ def sentry_patched_handle_exception( return old_handle_exception(self, job, *exc_info, **kwargs) - Worker.handle_exception = sentry_patched_handle_exception + worker_cls.handle_exception = sentry_patched_handle_exception old_enqueue_job = Queue.enqueue_job From 0595731a27f2fb9c8ad136a97be151ed33178391 Mon Sep 17 00:00:00 2001 From: Ivana Kellyer Date: Mon, 23 Feb 2026 10:35:29 +0100 Subject: [PATCH 2/2] fix(rq): Move BaseWorker import back to module level Co-Authored-By: Claude Opus 4.6 --- sentry_sdk/integrations/rq.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/sentry_sdk/integrations/rq.py b/sentry_sdk/integrations/rq.py index 4c79e5bb4c..5f5299add3 100644 --- a/sentry_sdk/integrations/rq.py +++ b/sentry_sdk/integrations/rq.py @@ -23,6 +23,14 @@ except ImportError: raise DidNotEnable("RQ not installed") +try: + from rq.worker import BaseWorker + + if not hasattr(BaseWorker, "perform_job"): + BaseWorker = None +except ImportError: + BaseWorker = None + from typing import TYPE_CHECKING if TYPE_CHECKING: @@ -47,12 +55,7 @@ def setup_once() -> None: # instead of Worker, so we need to patch BaseWorker to cover both. # For older versions where BaseWorker doesn't exist or doesn't have # perform_job, we patch Worker. - try: - from rq.worker import BaseWorker - - worker_cls = BaseWorker if hasattr(BaseWorker, "perform_job") else Worker - except ImportError: - worker_cls = Worker + worker_cls = BaseWorker if BaseWorker is not None else Worker old_perform_job = worker_cls.perform_job