2014-12-18 6 views
11

В настоящее время я работаю над задачами Celery в проекте на основе Django. У нас ворон настроен на отправку всех исключенных исключений и сообщений журнала в Sentry, как описано в documentation.Задачи сельдерея Неперехваченные исключения не отправляются в Sentry

Все работает очень хорошо, за исключением исключенных исключений внутри задач сельдерея. Например, если я выполнить эту задачу:

@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) 

ли вы помочь мне двигаться в каком-то направлении?

Спасибо за ваше время!

+0

Вы уже пробовали http://raven.readthedocs.org/ru/latest/integrations/celery.html и http://docs.celeryproject.org/en/latest/configuration.html#celeryd-hijack-root -logger? – DRC

+1

Спасибо DRC, наконец, решение, использующее 'register_signal (client)', работало, и теперь мы видим, что в Sentry корректно регистрируются исключенные исключения. Ура! –

+0

рад, что это помогло. – DRC

ответ

15

Как описано ДСБ в комментарии там, мы, наконец, добрались до решения с использованием этого подхода: 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) 

Спасибо за ваше время.

+0

В каком файле вы пишете эту конфигурацию для сельдерея, чтобы прочитать ее? – jperelli

+1

У меня есть специальный модуль 'celery.py', в котором находится вся конфигурация сельдерея. Затем эта конфигурация импортируется в другой модуль 'tasks.py', где у меня есть все заданные задачи. –

Смежные вопросы