Django Raven非常缓慢

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毫秒。这是可以预料的吗?我本以为消息会异步发送到另一个线程,所以主要代码不会被延迟。此外,我的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,
        },
    }
}    

=== 编辑 ===

感谢 Filip Dupanović 指出关于 threading+ 协议。不幸的是,在 gunicorn 中它们不能运行,因为在线程启动时会复制线程。我通过在 gunicorn 配置文件中添加 post_fork hook 来解决了这个问题,具体如下:

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.")

显然,这是一种黑客方式,虽然它对我有效,但我不知道它是否会在其他地方起作用。

1个回答

1
如果您正在使用托管的 Sentry 服务,您可能会从切换到 Raven 完全支持的“threaded+http”传输中受益。请查看 Raven 文档 以了解如何正确配置服务名称中的传输方式。
您也可以尝试切换到其他专业并发传输或 UDP 协议。虽然您无法将 ICMP 请求延迟与 TCP 进行比较,但是额外的开销确实很可怕,并且可以通过解决方法来解决,因此不要担心!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接