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 配置 djangocelery

首先将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:]:无法识别的选择器已发送到实例