2013-09-25 4 views
4

raven과 getsentry를 사용하여 django에서 메시지를 로깅하지만 로깅이 코드 실행을 지연시키는 것 같습니다. 예를 들어Django Raven Very Slow

# ...view code 
tic = datetime.datetime.now() 
logging.warning('foo warning') 
toc = datetime.datetime.now() 
print "log time %s, %s, %s" % (tic, toc, (toc - tic).total_seconds()) 
# more view code... 

출력을 제공한다 :

가이 600ms의 경우에 의한 코드의 실행을 지연시키는 것, 즉
log time 2013-09-25 12:03:56.541091, 2013-09-25 12:03:57.139420, 0.598329 

. 이게 뭔가 기대 되는가? 메인 코드가 지연되지 않도록 메시지가 별도의 스레드에서 비동기로 보내 졌을 것이라고 생각했을 것입니다. 또한 app.getsentry.com에 대한 핑 시간은 125ms이므로 메시지가 동기화 되어도 600ms가 여전히 이상하게 보입니다. 일을 더 빨리하기 위해 변경할 수있는 설정이 있습니까?

설정 파일 :

LOGGING = { 
    'version': 1, 
    'disable_existing_loggers': True, 
    'handlers': { 
     'sentry': { 
      'level': 'INFO', 
      'class': 'raven.contrib.django.raven_compat.handlers.SentryHandler', 
     }, 
    }, 
    'loggers': { 
     '': { 
      'handlers': ['sentry'], 
      'level': 'INFO', 
      'propagate': True, 
     }, 
    } 
}  

=== 편집 ===

감사 필립 Dupanović에 스레딩 + 프로토콜을 지적. 슬프게도, 그들은 부팅 노동자 동안 복사되는 스레드 때문에 gunicorn에서 나를 위해 일하지 않았다.

import logging 
from raven.contrib.django.handlers import SentryHandler 
from raven.transport.threaded import ThreadedHTTPTransport 


def post_fork(server, worker): 
    LOG = logging.getLogger() 
    for handler in LOG.handlers: 
     if isinstance(handler, SentryHandler): 
      for url, transport in handler.client._registry._transports.items(): 
       if isinstance(transport, ThreadedHTTPTransport): 
        if hasattr(transport, '_worker'): 
         server.log.info("deleting sentry thread worker attribute") 
         delattr(transport, '_worker') 
        else: 
         server.log.info("sentry thread worker not present, nothing to do.") 

OBV이 해킹이며 나를 위해 작동하는 동안은 다른 곳에서도 작동하는지 나는 아무 생각이 다음과 같이 나는 gunicorn 설정 파일에 post_fork 후크를 추가하여 해결했습니다.

답변

1

호스트 된 Sentry 서비스를 사용하는 경우 Raven이 완전히 지원하는 threaded+http 전송으로 전환하면 도움이됩니다. 서비스 이름에 전송을 올바르게 구성하는 방법에 대해서는 Raven's documentation을보십시오.

다른 특수한 동시성 전송이나 UDP 프로토콜로 전환 할 수도 있습니다. ICMP 요청 대기 시간을 TCP와 비교할 수는 없지만 추가 된 오버 헤드는 단순히 끔찍한 것으로 해결 될 수 있으므로 두려워하지 마십시오!