2014-12-18 42 views
11

Obecnie pracuję z zadań Celery w projekcie opartym na Django. Mamy kruka skonfigurowanego do wysyłania wszystkich niezatrzonych wyjątków i logowania wiadomości do Sentry, jak opisano w documentation.Zadania selekcji niezatrzonowane wyjątki nie są wysyłane do Sentry

Wszystko działa całkiem nieźle, z wyjątkiem nieprzechwyconych wyjątków wewnątrz zadań związanych z selerem. Na przykład, jeśli mogę uruchomić tego zadania:

@app.task 
def test_logging(): 
    log.error('Testing logging inside a task') 
    raise IndexError('Testing exception inside a task') 

widzę tylko w Sentry z log.error(...) ale nie IndexError przechwycony wyjątek. Próbowałem używać bloku try-except wokół wyjątku z log.exception(...) wewnątrz i działało, ale myślę, że nie jest skalowalne, aby wychwycić wszystkie wyjątki w ten sposób.

Problem dotyczy tylko niezatartych wyjątków, które w jakiś sposób nie są obsługiwane prawidłowo.

Są to moje aktualne wersje pakietów:

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

Pomożesz mi poruszać się w jakimś kierunku?

Dziękujemy za poświęcony czas!

+0

Czy próbowałeś już http://raven.readthedocs.org/en/latest/integrations/celery.html i http://docs.celeryproject.org/en/latest/configuration.html#celeryd-hijack-root -logger? – DRC

+1

Dzięki DRC, w końcu rozwiązanie działające za pomocą 'register_signal (client)' zadziałało, a teraz widzimy niezatłoczone wyjątki logowane poprawnie w Sentry. Twoje zdrowie! –

+0

cieszę się, że pomogło. – DRC

Odpowiedz

15

Jak opisał DRK w komentarzu tam, w końcu dostał się do roztworu za pomocą tej metody: https://docs.getsentry.com/hosted/clients/python/integrations/celery/

Zasadniczo to robi:

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) 

Dziękuję za poświęcony czas.

+0

W jakim pliku piszesz tę konfigurację dla selera, aby ją przeczytać? – jperelli

+1

Mam dedykowany moduł 'celery.py', w którym znajduje się cała konfiguracja selera. Następnie ta konfiguracja jest importowana do innego modułu 'tasks.py', gdzie mam zdefiniowane wszystkie zadania. –