sentry - Using raven with celery in django -
i'm trying setup raven log sentry asynchronously using celery. think i've set things correctly, but send_raw functions in celeryclient not being called (and nothing being picked in sentry or celery). things work if don't change sentry_client setting below (the logs appear in sentry). setting are:
sentry_client = 'raven.contrib.django.celery.celeryclient'
installed apps:
'raven.contrib.django', # sentry.client.celery should replaced raven.contrib.django.celery in installed_apps. 'raven.contrib.django.celery',
logging:
logging = { 'version': 1, 'disable_existing_loggers': true, 'root': { 'level': 'warning', # warning or above go sentry... 'handlers': ['sentry'], # taras sends errors sentry }, 'formatters': { 'verbose': { 'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s' }, }, 'handlers': { 'sentry': { 'level': 'error', 'class': 'raven.contrib.django.handlers.sentryhandler', # communicates sentry }, 'console': { 'level': 'debug', 'class': 'logging.streamhandler', 'formatter': 'verbose' } }, 'loggers': { 'django.db.backends': { 'level': 'error', 'handlers': ['console'], 'propagate': false, }, 'raven': { 'level': 'debug', # class logging.streamhandler(stream=none) # returns new instance of streamhandler class. if stream specified, instance use logging output; otherwise, sys.stderr used. 'handlers': ['sentry'], # sentry hits sentry configuration above, console default according above definition of streamhandler hits stderr 'propagate': false, }, 'sentry.errors': { 'level': 'debug', 'handlers': ['console'], 'propagate': false, }, }, }
i have modified celeryclient to
class celeryclient(celerymixin, djangoclient): def send_integrated(self, kwargs): self.send_raw_integrated.delay(kwargs) print "yo" @task(routing_key='sentry') def send_raw_integrated(self, kwargs): super(celeryclient, self).send_integrated(kwargs) print "yo2"
and traces don't come out
the celery client in raven uses routing key on task:
class celerymixin(object): def send_encoded(self, *args, **kwargs): "errors through celery" self.send_raw.delay(*args, **kwargs) @task(routing_key='sentry') def send_raw(self, *args, **kwargs): return super(celerymixin, self).send_encoded(*args, **kwargs)
django default uses direct exchange type:
http://docs.celeryproject.org/en/latest/userguide/routing.html
which means (i believe) messages produced celery not routed queue (and never picked up).
you can define this, example:
celery_queues = { "default": { "exchange": "default", "binding_key": "default"}, "sentry": { "exchange": "default", "binding_key": "sentry"}, }
Comments
Post a Comment