From b74bc1098b8ce443cc9ea94938fe484160d62bcc Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Wed, 8 Jul 2026 10:38:31 +0200 Subject: [PATCH 1/3] feat(rq): Add messaging.destination.name attribute to consumer spans --- sentry_sdk/integrations/rq.py | 12 +++++++++++- tests/integrations/rq/test_rq.py | 5 +++++ uv.lock | 3 --- 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/sentry_sdk/integrations/rq.py b/sentry_sdk/integrations/rq.py index edd48a9f67..c05cf1de3f 100644 --- a/sentry_sdk/integrations/rq.py +++ b/sentry_sdk/integrations/rq.py @@ -99,6 +99,11 @@ def sentry_patched_perform_job( if func_name is not None: span.set_attribute(SPANDATA.CODE_FUNCTION_NAME, func_name) + if args: + span.set_attribute( + SPANDATA.MESSAGING_DESTINATION_NAME, args[0].name + ) + rv = old_perform_job(self, job, *args, **kwargs) else: transaction = continue_trace( @@ -115,7 +120,12 @@ def sentry_patched_perform_job( with sentry_sdk.start_transaction( transaction, custom_sampling_context={"rq_job": job}, - ): + ) as span: + if args: + span.set_data( + SPANDATA.MESSAGING_DESTINATION_NAME, args[0].name + ) + rv = old_perform_job(self, job, *args, **kwargs) if self.is_horse: diff --git a/tests/integrations/rq/test_rq.py b/tests/integrations/rq/test_rq.py index 48e0854d32..c72dc4ce64 100644 --- a/tests/integrations/rq/test_rq.py +++ b/tests/integrations/rq/test_rq.py @@ -416,6 +416,7 @@ def test_transaction_no_error( assert span["attributes"]["sentry.op"] == "queue.task.rq" assert span["name"] == "tests.integrations.rq.test_rq.do_trick" + assert span["attributes"][SPANDATA.MESSAGING_DESTINATION_NAME] == queue.name else: events = capture_events() @@ -427,6 +428,10 @@ def test_transaction_no_error( assert envelope["type"] == "transaction" assert envelope["contexts"]["trace"]["op"] == "queue.task.rq" assert envelope["transaction"] == "tests.integrations.rq.test_rq.do_trick" + assert ( + envelope["contexts"]["trace"]["data"][SPANDATA.MESSAGING_DESTINATION_NAME] + == queue.name + ) assert envelope["extra"]["rq-job"] == DictionaryContaining( { "args": ["Maisey"] if send_default_pii else SENSITIVE_DATA_SUBSTITUTE, diff --git a/uv.lock b/uv.lock index 855c128ef8..fb1818bba8 100644 --- a/uv.lock +++ b/uv.lock @@ -6,9 +6,6 @@ resolution-markers = [ "python_full_version < '3.15'", ] -[options] -prerelease-mode = "allow" - [manifest] [manifest.dependency-groups] From 866fcd5fb104110a6b600543d42219db4ae04779 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Wed, 8 Jul 2026 10:55:09 +0200 Subject: [PATCH 2/3] . --- sentry_sdk/integrations/rq.py | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/sentry_sdk/integrations/rq.py b/sentry_sdk/integrations/rq.py index c05cf1de3f..fd679d1039 100644 --- a/sentry_sdk/integrations/rq.py +++ b/sentry_sdk/integrations/rq.py @@ -65,11 +65,11 @@ def setup_once() -> None: @functools.wraps(old_perform_job) def sentry_patched_perform_job( - self: "Any", job: "Job", *args: "Queue", **kwargs: "Any" + self: "Any", job: "Job", queue: "Queue", *args: "Any", **kwargs: "Any" ) -> bool: client = sentry_sdk.get_client() if client.get_integration(RqIntegration) is None: - return old_perform_job(self, job, *args, **kwargs) + return old_perform_job(self, job, queue, *args, **kwargs) with sentry_sdk.new_scope() as scope: scope.clear_breadcrumbs() @@ -93,18 +93,14 @@ def sentry_patched_perform_job( "sentry.origin": RqIntegration.origin, "sentry.span.source": SegmentSource.TASK, SPANDATA.MESSAGING_MESSAGE_ID: job.id, + SPANDATA.MESSAGING_DESTINATION_NAME: queue.name, }, parent_span=None, ) as span: if func_name is not None: span.set_attribute(SPANDATA.CODE_FUNCTION_NAME, func_name) - if args: - span.set_attribute( - SPANDATA.MESSAGING_DESTINATION_NAME, args[0].name - ) - - rv = old_perform_job(self, job, *args, **kwargs) + rv = old_perform_job(self, job, queue, *args, **kwargs) else: transaction = continue_trace( job.meta.get("_sentry_trace_headers") or {}, @@ -121,12 +117,9 @@ def sentry_patched_perform_job( transaction, custom_sampling_context={"rq_job": job}, ) as span: - if args: - span.set_data( - SPANDATA.MESSAGING_DESTINATION_NAME, args[0].name - ) + span.set_data(SPANDATA.MESSAGING_DESTINATION_NAME, queue.name) - rv = old_perform_job(self, job, *args, **kwargs) + rv = old_perform_job(self, job, queue, *args, **kwargs) if self.is_horse: # We're inside of a forked process and RQ is From 56de49498671a9b3f2e7ea678623df3f20d49f17 Mon Sep 17 00:00:00 2001 From: Alexander Alderman Webb Date: Wed, 8 Jul 2026 10:55:54 +0200 Subject: [PATCH 3/3] . --- uv.lock | 3 +++ 1 file changed, 3 insertions(+) diff --git a/uv.lock b/uv.lock index fb1818bba8..855c128ef8 100644 --- a/uv.lock +++ b/uv.lock @@ -6,6 +6,9 @@ resolution-markers = [ "python_full_version < '3.15'", ] +[options] +prerelease-mode = "allow" + [manifest] [manifest.dependency-groups]