Open alexpersin opened 2 years ago
@alexpersin thx for the report, since you already identified the problem, PR's are always welcome!
My initial fix was slightly wrong, it should be
from celery.canvas import Signature
import celery
from sentry_sdk.integrations.celery import _wrap_apply_async
celery.group.apply_async = _wrap_apply_async(celery.group.apply_async)
celery.chunks.apply_async = _wrap_apply_async(celery.chunks.apply_async)
celery.canvas._chain.apply_async = _wrap_apply_async(celery.canvas._chain.apply_async)
celery.canvas._chord.apply_async = _wrap_apply_async(celery.canvas._chord.apply_async)
Signature.apply_async = _wrap_apply_async(Signature.apply_async)
Confirmed that this works for groups within chains within groups. Chained tasks show up as child transactions, and it works for retried tasks too.
How do you use Sentry?
Sentry Saas (sentry.io)
Version
1.5.10
Steps to Reproduce
The python sentry_sdk celery integration uses
_wrap_apply_async
to wrap thecelery.Task.apply_async
method. However it does not wrap celery Signatures as these have their ownapply_async
method defined in the celery package incelery/canvas.py
. This means that tasks defined using signatures are not traced.To reproduce:
This does not produce traces. Alternatively,
Running the following fixes the issue:
Expected Result
Transactions visible in the UI.
Actual Result
No transaction visible. Stepping through the code with a debugger, the function created with _wrap_apply_async is not called as the
Signature.apply_async
method is not wrapped.