线上的异常要靠监控发现。用 Sentry 之类的服务时有几件事要先弄清楚:哪些异常会被上报、请求里的哪些敏感数据会被带上、收集端出问题时会不会拖慢应用。这篇用真实的 sentry-sdk 配自写的 transport 逐项验证,没有联网、没有用真实的 Sentry 服务(日志与请求 ID 见第 181、182 篇)。
未处理的 /boom → HTTP 500,上报 1 个事件:ZeroDivisionError: division by zero,栈 5 帧,最内层 boom:15(in_app=True),request GET http://localhost/boom,transaction=boom,mechanism=flask abort(404) → HTTP 404,上报 0 个事件 视图里 try/except 后自己 capture_exception → HTTP 200,上报 1 个事件(mechanism=generic) 注册了 @errorhandler(Exception) 返回 JSON → HTTP 500,上报 0 个事件
上一篇:请求 ID 链路追踪;下一篇:环境变量注入。
只用本机进程和自写 Transport,没有连接任何 Sentry 服务。
send_default_pii=False:
headers {'Authorization': '[Filtered]', 'X-Trace': 't1', 'Cookie': '[Filtered]'}
cookies None | query_string token=QS-TOKEN | body {'password': '[Filtered]', 'user': 'ann'} | user None
异常信息(message)里写进了用户名:'login failed for ann'
send_default_pii=True:
headers {'Authorization': '[Filtered]', 'X-Trace': 't1', 'Cookie': '[Filtered]'}
cookies {'sessionid': '[Filtered]'} | query_string token=QS-TOKEN | body {'password': '[Filtered]', 'user': 'ann'} | user {'ip_address': '127.0.0.1'}
异常信息(message)里写进了用户名:'login failed for ann'before_send 丢掉 ZeroDivisionError:/boom 与 /login 两次请求之后事件类型 = ['RuntimeError'] sample_rate=0.5,400 次 /boom 之后上报的事件数 = 200
配置 /boom 中位耗时 SIGTERM 后进程退出 没有初始化 sentry 0.9 ms 0.26 s DSN 端口无人监听 3.9 ms 0.25 s DSN 端口接受连接但不回复 2.7 ms 2.32 s