Python 涡轮齿轮和反冲:如何为Raven添加额外的、按请求的上下文,以获得更多信息的哨兵报告?
通过,支持向via报告错误。启用错误报告非常简单,只需在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
.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()
方法中。