2014-12-18 15 views
11

Attualmente sto lavorando con le attività di Celery in un progetto basato su Django. Abbiamo il corvo configurato per inviare tutte le eccezioni non rilevate e registrare i messaggi su Sentry, come descritto nello documentation.Le attività di Celery non vengono inviate a Sentry con le eccezioni

Tutto funziona piuttosto bene, ad eccezione delle eccezioni non rilevate all'interno dei compiti di sedano. Per esempio, se ho eseguito questo compito:

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

vedo solo nel Sentry la log.error(...) ma non il IndexError eccezione non rilevata. Ho provato a utilizzare un blocco try-except attorno all'eccezione con un log.exception(...) interno e ha funzionato, ma penso che non sia scalabile per catturare tutte le eccezioni come questa.

Quindi, il problema sono solo eccezioni non rilevate che in qualche modo non vengono gestite correttamente.

Queste sono le mie versioni dei pacchetti attuali:

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

Vuoi aiutarmi a muoversi in una certa direzione?

Grazie per il vostro tempo!

+0

hai già provato http://raven.readthedocs.org/en/latest/integrations/celery.html e http://docs.celeryproject.org/en/latest/configuration.html#celeryd-hijack-root -logger? – DRC

+1

Grazie a DRC, finalmente la soluzione utilizzando 'register_signal (client)' ha funzionato, e ora vediamo le eccezioni non rilevate registrate correttamente in Sentry. Saluti! –

+0

contento che abbia aiutato. – DRC

risposta

15

Come descritto dalla RDC nel commento lassù, finalmente siamo arrivati ​​alla soluzione utilizzando questo approccio: https://docs.getsentry.com/hosted/clients/python/integrations/celery/

Fondamentalmente questo modo:

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) 

Grazie per il vostro tempo.

+0

In quale file si scrive questa configurazione per il sedano per leggerlo? – jperelli

+1

Ho un modulo 'celery.py' dedicato in cui si trova tutta la configurazione del sedano. Quindi quella configurazione viene importata nell'altro modulo 'tasks.py' dove ho definito tutte le attività. –