问题 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')

我只在哨兵看到了 log.error(...) 但不是 IndexError 未捕获的异常。 我试过用过 try-except 使用a阻止异常 log.exception(...) 在内部,它确实有效,但我认为捕捉所有这样的例外并不可扩展。

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

这些是我目前的包版本:

celery (3.1.17)
raven (5.1.1)
Django (1.7.1)

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

谢谢你的时间!


2705
2017-12-18 16:09


起源

你已经试过了吗 raven.readthedocs.org/en/latest/integrations/celery.html  和 docs.celeryproject.org/en/latest/... ? - DRC
感谢DRC,最后使用了解决方案 register_signal(client) 工作,现在我们在Sentry中看到未正确记录的未捕获异常。干杯! - Martin Zugnoni
很高兴有所帮助。 - DRC


答案:


正如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)

谢谢你的时间。


15
2017-12-23 12:34



你在哪个文件中写这个配置供芹菜阅读? - jperelli
我有一个专注 celery.py 所有芹菜配置所在的模块。然后在其他模块中导入该配置 tasks.py 我在那里定义了所有任务。 - Martin Zugnoni