2013-09-25 61 views
4

我登錄使用烏鴉和getsentry Django的消息,但日誌似乎延遲代碼的執行。例如:Django的烏鴉非常慢

# ...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... 

給出的輸出:

log time 2013-09-25 12:03:56.541091, 2013-09-25 12:03:57.139420, 0.598329 

即它在這種情況下延遲所述代碼的執行由600毫秒。這是可以預料的嗎?我原以爲這個消息會在一個單獨的線程中發送異步,所以主代碼不會被延遲。另外我的ping時間爲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配置文件中添加post_fork鉤如下:

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,這是一個黑客,而我的作品,我不知道是否會工作其他地方。

回答

1

如果您使用託管服務哨兵,你可以通過切換到threaded+http運輸,這烏鴉完全支持中受益。請查看Raven's documentation關於如何正確配置服務名稱中的傳輸。

您也可能想嘗試切換到其他一些專門的併發傳輸或UDP協議。儘管無法比較ICMP請求延遲與TCP,但是增加的開銷非常可怕並且可以解決,所以不要害怕!