getsentry / getsentry/sentry-python

Tracing of Celery tasks does not work with Signatures

未关闭
#1,416 3 条评论 1 个 reaction 已指派 1 人 已被 @alexander-alderman-webb 认领 在 GitHub 查看
Improvement Integration: Celery Python Traces
主要语言
Python
星标
2.2k
派生
669
平均合并
1 天 1 小时
30 天内合并 PR
213

描述

### 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 the `celery.Task.apply_async` method. However it does not wrap celery Signatures as these have their own `apply_async` method defined in the celery package in `celery/canvas.py`. This means that tasks defined using signatures are not traced.

To reproduce:
```
import sentry_sdk
import os
from sentry_sdk.integrations.celery import CeleryIntegration

sentry_sdk.init(os.getenv('SENTRY_DSN'), integrations=[CeleryIntegration()], traces_sample_rate=1.0, debug=True)

group_result = celery.group([
celery.signature('foo', kwargs=kwargs),
celery.signature('bar', kwargs=kwargs)
]).apply_async()
```
This does not produce traces. Alternatively,
```
import sentry_sdk
import os
from sentry_sdk.integrations.celery import CeleryIntegration
from celery.app.task import Task

sentry_sdk.init(os.getenv('SENTRY_DSN'), integrations=[CeleryIntegration()], traces_sample_rate=1.0, debug=True)

# Not wrapped by sentry sdk
print(celery.group.apply_async.__code__)

# Wrapped by sentry sdk
print(Task.apply_async.__code__)
```

Running the following fixes the issue:
```
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.chain.apply_async = _wrap_apply_async(celery.chain.apply_async)
celery.chord.apply_async = _wrap_apply_async(celery.chord.apply_async)
Signature.apply_async = _wrap_apply_async(Signature.apply_async)
```

### 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.

贡献指南

打开贡献指南

评估

这个 Issue 还没有评估数据。

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。