Python 涡轮齿轮和反冲:如何为Raven添加额外的、按请求的上下文,以获得更多信息的哨兵报告?

Python 涡轮齿轮和反冲:如何为Raven添加额外的、按请求的上下文,以获得更多信息的哨兵报告?,python,sentry,turbogears2,turbogears,raven,Python,Sentry,Turbogears2,Turbogears,Raven,通过,支持向via报告错误。启用错误报告非常简单,只需在.ini配置文件中添加适当的设置,例如: [DEFAULT] debug = false trace_errors.sentry_dsn = https://[…] trace_slowreqs.enable = true trace_slowreqs.sentry_dsn = https://[…] set debug = false 根据Raven的说法,为报告内容添加更多上下文应该非常简单 def handle_request(r

通过,支持向via报告错误。启用错误报告非常简单,只需在
.ini
配置文件中添加适当的设置,例如:

[DEFAULT]
debug = false
trace_errors.sentry_dsn = https://[…]
trace_slowreqs.enable = true
trace_slowreqs.sentry_dsn = https://[…]

set debug = false
根据Raven的说法,为报告内容添加更多上下文应该非常简单

def handle_request(request):  # In TurboGears, this would be a controller instead.
    client.context.merge({'user': {
        'email': request.user.email
    }})
    try:
        ...
    finally:
        client.context.clear()

但是,现在我想知道,获取
客户机
实例的最简单或最正确的方法是什么,该
实例将用于报告?我想添加每个请求的信息,通常来自请求处理程序或
Controller
方法。

编辑raven上下文目前相当困难,因为错误报告程序没有在任何地方注册,所以您不能说“嘿,给我错误报告程序”,然后在该列表中查找哨兵

目前唯一的方法是在_config
hook之后注册
,在配置过程中收集Raven客户端并将其存储在可访问的位置

更换媒体中间软件以将记者存放在可访问的地方应该相当容易(例如环境),但目前还不可用

顺便说一句,这里是一个简短的
after_config
解决方案示例,该解决方案应使客户机作为
tg.app\u globals.sentry_客户机提供
,将其复制到您的
app\u cfg.py
中,并且它应该做您期望的事情(没有时间尝试,如果您发现错误,很抱歉),然后,您可以随时从客户端获取上下文:

def gather_sentry_client(app):
    from backlash import TraceErrorsMiddleware, TraceSlowRequestsMiddleware

    try:
        trace_errors_app = app.app.application
    except:
        return app

    if not isinstance(trace_errors_app, TraceErrorsMiddleware):
        return app

    trace_errors_client = None
    for reporter in trace_errors_app.reporters:
        if hasattr(reporter, 'client'):
            trace_errors_client = reporter.client

    slow_reqs_app = trace_errors_app.app
    slow_reqs_client = None
    if isinstance(slow_reqs_app, TraceSlowRequestsMiddleware):
        for reporter in slow_reqs_app.reporters:
            if hasattr(reporter, 'client'):
                slow_reqs_client = reporter.client

    from tg import config
    app_globals = config['tg.app_globals']
    app_globals.sentry_clients = {
        'errors': trace_errors_client,
        'slowreqs': slow_reqs_client
    }
    return app    

from tg import hooks
hooks.register('after_config', gather_sentry_client)

谢谢你的建议,亚历山德罗。但是,由于使用模式通常是设置一些每个请求的上下文信息,因此在
tg.app\u globals.sentry\u clients
中全局共享相同的
raven.base.Client
实例不可能导致竞争条件吗?我怀疑
resack
可能需要重写以支持报告器的延迟请求本地初始化。我现在从
raven.base.Client.context()
中的docstring中看到它“为将来的事件更新此客户端线程本地上下文”。但是,我在
Context
实现中没有看到任何代码使它看起来像是线程本地的。Context继承自threading.local->因此您分配给它的任何属性实际上都是线程本地的,包括存储所有上下文数据的
data
。谢谢。我没有注意到。我可以确认这就像一个符咒。非常感谢。我的测试用途是放置
app_globals.sentry_客户端['errors'].user_上下文({'email':'foo@example.com'})
RootController.\u before()
方法中。