Celery 任务未捕获的异常未发送到 Sentry
Posted
技术标签:
【中文标题】Celery 任务未捕获的异常未发送到 Sentry【英文标题】:Celery tasks uncaught exceptions not being sent to Sentry 【发布时间】:2015-02-17 11:54:39 【问题描述】:我目前正在一个基于 Django 的项目中处理 Celery 任务。我们已将 raven 配置为将所有未捕获的异常和日志消息发送到 Sentry,如 documentation 中所述。
一切都很好,除了 celery 任务中未捕获的异常。例如,如果我运行这个任务:
@app.task
def test_logging():
log.error('Testing logging inside a task')
raise IndexError('Testing exception inside a task')
我只在 Sentry 中看到 log.error(...)
而不是 IndexError
未捕获的异常。
我尝试在异常周围使用try-except
块,内部带有log.exception(...)
,它确实有效,但我认为捕获所有此类异常是不可扩展的。
所以,问题只是未捕获的异常,在某种程度上没有正确处理。
这些是我当前的软件包版本:
celery (3.1.17)
raven (5.1.1)
Django (1.7.1)
你能帮我朝某个方向前进吗?
感谢您的宝贵时间!
【问题讨论】:
你试过raven.readthedocs.org/en/latest/integrations/celery.html和docs.celeryproject.org/en/latest/…吗? 感谢 DRC,终于使用register_signal(client)
的解决方案奏效了,现在我们看到 Sentry 中正确记录了未捕获的异常。干杯!
【参考方案1】:
正如 DRC 在上面的评论中所描述的,我们最终使用这种方法找到了解决方案: https://docs.getsentry.com/hosted/clients/python/integrations/celery/
基本上是这样做的:
import celery
class Celery(celery.Celery):
def on_configure(self):
if hasattr(settings, 'RAVEN_CONFIG') and settings.RAVEN_CONFIG['dsn']:
import raven
from raven.contrib.celery import (register_signal,
register_logger_signal)
client = raven.Client(settings.RAVEN_CONFIG['dsn'])
register_logger_signal(client)
register_signal(client)
app = Celery('myapp')
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
感谢您的宝贵时间。
【讨论】:
这个配置写在哪个文件里供 celery 读取? 我有一个专用的celery.py
模块,所有 celery 配置都位于其中。然后将该配置导入到其他模块 tasks.py
我已经定义了所有任务。
他们新的sentry-sdk
API 的替代方案是什么?【参考方案2】:
选择的答案是正确的,因为问题状态 raven
正在使用中。
但是 raven 已被弃用,取而代之的是 sentry SDK。
使用 sentry SDK 配置 django
和 celery
:
首先将sentry-sdk
添加到您的需求文件中。
然后,在您的 django 设置文件中:
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration
from sentry_sdk.integrations.celery import CeleryIntegration
sentry_sdk.init(
dsn="your_sentry_DSN",
integrations=[DjangoIntegration(), CeleryIntegration()],
send_default_pii=True
)
来源:
获取您的 DSN:https://docs.sentry.io/clients/java/config/#setting-the-dsn Sentry Django 集成:https://docs.sentry.io/platforms/python/django/ Sentry Celery 集成:https://docs.sentry.io/platforms/python/celery/【讨论】:
嗨,我已将这些更改添加到我的代码中,但它没有捕获 celery 任务错误。代码库中是否需要任何其他更改。你能帮忙吗?@guival @Anjitha 不,应该是这样。是否正确捕获其他错误? 是的,它正在跟踪所有与 celery 无关的错误。 celery 配置文件中是否有额外的设置? @Anjitha 现在什么都想不出来,也许你应该打开你自己的问题。 @gdvalderrama 我建议为sentry-sdk
(和self-answering 在这里回答你的答案)提出一个新问题。选择的答案是在遗留 raven 包的上下文中构建的,并且有一个适合该问题的答案。它们是不同的包。以上是关于Celery 任务未捕获的异常未发送到 Sentry的主要内容,如果未能解决你的问题,请参考以下文章
int 值未通过,无法识别的选择器发送到实例 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序
未执行的任务(Django + Heroku + Celery + RabbitMQ)
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序。无法识别的选择器发送到实例
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'-[__NSArrayM itemName]:无法识别的选择器发送到实例
Swift:由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:无法识别的选择器发送到实例 0x7fb179f12260'
由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[NSCFString objectForKey:]:无法识别的选择器已发送到实例