Skip to content

Commit ff10b77

Browse files
feat: Send Celery retry count
Send the retry count of a Celery task as a span data attribute on the "queue.process" span. Also, add tests for this feature. Ref #2961
1 parent 72ac630 commit ff10b77

File tree

3 files changed

+41
-0
lines changed

3 files changed

+41
-0
lines changed

sentry_sdk/consts.py

+5
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,11 @@ class SPANDATA:
270270
e.g. the queue name or topic.
271271
"""
272272

273+
MESSAGING_MESSAGE_RETRY_COUNT = "messaging.message.retry.count"
274+
"""
275+
Number of retries/attempts to process a message.
276+
"""
277+
273278
SERVER_ADDRESS = "server.address"
274279
"""
275280
Name of the database host.

sentry_sdk/integrations/celery/__init__.py

+5
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,11 @@ def _inner(*args, **kwargs):
356356
op=OP.QUEUE_PROCESS, description=task.name
357357
) as span:
358358
_set_messaging_destination_name(task, span)
359+
with capture_internal_exceptions():
360+
span.set_data(
361+
SPANDATA.MESSAGING_MESSAGE_RETRY_COUNT, task.request.retries
362+
)
363+
359364
return f(*args, **kwargs)
360365
except Exception:
361366
exc_info = sys.exc_info()

tests/integrations/celery/test_celery.py

+31
Original file line numberDiff line numberDiff line change
@@ -659,3 +659,34 @@ def task(): ...
659659
(event,) = events
660660
(span,) = event["spans"]
661661
assert "messaging.destination.name" not in span["data"]
662+
663+
664+
def test_retry_count_zero(init_celery, capture_events):
665+
celery = init_celery(enable_tracing=True)
666+
events = capture_events()
667+
668+
@celery.task()
669+
def task(): ...
670+
671+
task.apply_async()
672+
673+
(event,) = events
674+
(span,) = event["spans"]
675+
assert span["data"]["messaging.message.retry.count"] == 0
676+
677+
678+
@mock.patch("celery.app.task.Task.request")
679+
def test_retry_count_nonzero(mock_request, init_celery, capture_events):
680+
mock_request.retries = 3
681+
682+
celery = init_celery(enable_tracing=True)
683+
events = capture_events()
684+
685+
@celery.task()
686+
def task(): ...
687+
688+
task.apply_async()
689+
690+
(event,) = events
691+
(span,) = event["spans"]
692+
assert span["data"]["messaging.message.retry.count"] == 3

0 commit comments

Comments
 (0)