在django使用乌鸦与芹菜

时间:2012-07-01 05:44:03

标签: django-celery sentry raven

我正在尝试使用芹菜设置raven以异步方式登录哨兵。我认为我已经正确设置了,但是CeleryClient中的send_raw函数没有被调用(并且没有任何东西在哨兵或芹菜中被拾取)。如果我不更改下面的SENTRY_CLIENT设置(日志显示在哨兵中),事情就有效。我的设置是:

SENTRY_CLIENT = 'raven.contrib.django.celery.CeleryClient'

已安装的应用:

'raven.contrib.django',    
# sentry.client.celery should be replaced with raven.contrib.django.celery in INSTALLED_APPS.    
'raven.contrib.django.celery',    

日志记录:

LOGGING = {
    'version': 1,
    'disable_existing_loggers': True,
    'root': {
        'level': 'WARNING', # anything warning or above will go to sentry...
        'handlers': ['sentry'], # TARAS this is what sends all errors to 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', # this is what communicates to 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 a new instance of the StreamHandler class. If stream is specified, the instance will use it for logging output; otherwise, sys.stderr will be used.            
            'handlers': ['sentry'], # sentry hits sentry configuration above, console by default according to the above definition of streamhandler hits stderr
            'propagate': False,
        },
        'sentry.errors': {
            'level': 'DEBUG',
            'handlers': ['console'],
            'propagate': False,
        },
    },
}

我已将CeleryClient修改为

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"

并且痕迹没有出来

1 个答案:

答案 0 :(得分:2)

raven中的芹菜客户端在任务上使用路由键:

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默认使用直接交换类型:

http://docs.celeryproject.org/en/latest/userguide/routing.html

这意味着(我相信)芹菜生成的消息不会被路由到队列中(因此永远不会被拾取)。

您可以定义它,例如:

CELERY_QUEUES = {
    "default": {
        "exchange": "default",
        "binding_key": "default"},
    "sentry": {
        "exchange": "default",
        "binding_key": "sentry"},
}