Celery任务未被发送到Sentry的未被捕获的例外情况

Mar*_*oni 11 django logging exception celery sentry

我目前正在基于Django的项目中处理Celery任务.我们将raven配置为将所有未捕获的异常和日志消息发送到Sentry,如文档中所述.

一切都很好,除了芹菜任务中未被捕获的异常.例如,如果我运行此任务:

@app.task
def test_logging():
    log.error('Testing logging inside a task')
    raise IndexError('Testing exception inside a task')
Run Code Online (Sandbox Code Playgroud)

我只在Sentry中看到log.error(...)但未被IndexError捕获的异常.我尝试try-exceptlog.exception(...)内部使用一个块来处理异常并且它确实有效,但我认为它不可扩展来捕获这样的所有异常.

所以,问题只是未被捕获的异常,以某种方式处理不当.

这些是我目前的包版本:

celery (3.1.17)
raven (5.1.1)
Django (1.7.1)
Run Code Online (Sandbox Code Playgroud)

你能帮助我朝某个方向前进吗?

谢谢你的时间!

Mar*_*oni 15

正如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)
Run Code Online (Sandbox Code Playgroud)

谢谢你的时间.

  • 他们的新“sentry-sdk” API 有什么替代方案? (3认同)

gui*_*val 9

所选择的答案是正确的,因为raven正在使用问题状态。然而 raven 已被弃用,取而代之的是哨兵 SDK。

要配置djangocelery使用哨兵 SDK:

首先添加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
)
Run Code Online (Sandbox Code Playgroud)

资料来源: