TurboGears 和反弹:如何向 Raven 添加额外的、按请求的上下文以获得更多信息的哨兵报告?

TurboGears and backlash: How to add extra, per-request context to Raven for more informative Sentry reports?

通过backlash, TurboGears supports error reporting to Sentry via Raven。启用错误报告非常简单,只需在 .ini 配置文件中添加适当的设置即可,例如:

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

set debug = false

根据 Raven 的 documentation,向报告的内容添加更多上下文应该像

一样简单
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()

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

编辑 raven 上下文目前非常困难,因为错误报告器没有在任何地方注册,所以你不能说 "hey give me the error reporters" 并在该列表中查找哨兵。

目前唯一的方法是注册一个 after_config 挂钩,在配置过程中收集 Raven 客户端并将其存储在可访问的地方。

更改 backlash 中间件以将 reporters 存储在可访问的地方应该相当容易(例如 environ),但目前尚不可用。

顺便说一句,这里是 after_config 解决方案的一个简短示例,它应该使客户端可用 tg.app_globals.sentry_clients,将其复制到您的 app_cfg.py 中,它应该会达到您的预期(没时间尝试,如果发现错误请见谅),然后就可以在需要的时候从客户端获取context:

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)