2012-07-01 74 views
2

我試圖設置烏鴉來異步使用芹菜登錄到哨兵。我想我已經正確設置了一些東西,但是CeleryClient中的send_raw函數沒有被調用(並且沒有任何東西正在哨兵或芹菜中被拾取)。如果我不更改下面的SENTRY_CLIENT設置(日誌顯示在哨兵中),情況會起作用。我的設置是:在django中使用烏鴉與芹菜

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" 

而且痕跡不出來

回答

2

在烏鴉的芹菜客戶端使用的任務一個路由項:

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"}, 
} 
+0

這隻有在塔拉斯的CELERY_QUEUES配置與「芹菜」代替「默認」的每個實例後,爲我工作。我相信這是Django默認隊列的名稱,所以我不確定「default」來自哪裏。 – Shane

+0

@Shane:你能編輯Taras的答案來反映這一點嗎? – Tadeck