2012-07-01 5 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" 

에 그리고 흔적이 나오지 않습니다

(내가 믿는) 메시지 즉

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

:

는 기본적으로
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) 

장고 직접 교환 형식을 사용합니다 :

답변

2

는 까마귀의 셀러리 클라이언트는 작업에 라우팅 키를 사용하여 셀러리가 생산 한 음식물은 대기열로 보내지지 않습니다.

당신은 예를 들어,이 정의 할 수 있습니다 :이 내용은 타 라스의 CELERY_QUEUES의 설정에서 "셀러리"와 "기본"의 모든 인스턴스를 교체 한 후 나를 위해 일한

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

. 장고에있는 디폴트 큐의 이름이라고 생각합니다. 그래서 "default"가 어디에서 왔는지 확신 할 수 없습니다. – Shane

+0

@Shane : Taras의 답변을 반영 할 수 있습니까? – Tadeck