5

raven と getsentry を使用して 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 ミリ秒遅らせます。これは予想されることですか?メッセージは別のスレッドで非同期に送信されると思っていたので、メイン コードが遅れることはありません。また、app.getsentry.com への ping 時間は 125 ミリ秒であるため、メッセージが同期で送信されたとしても、600 ミリ秒は依然として奇妙に大きいように見えます。物事をより速くするために変更できる設定はありますか?

設定ファイル:

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,
        },
    }
}    

=== 編集 ===

threading+ プロトコルを指摘してくれた Filip Dupanović に感謝します。悲しいことに、ワーカーの起動中にスレッドがコピーされるため、gunicorn では機能しませんでした。次のように、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.")

明らかにこれはハックであり、私にとっては機能しますが、他の場所で機能するかどうかはわかりません.

4

1 に答える 1