bigywater.tech
Flask · 183

错误监控

线上的异常要靠监控发现。用 Sentry 之类的服务时有几件事要先弄清楚:哪些异常会被上报、请求里的哪些敏感数据会被带上、收集端出问题时会不会拖慢应用。这篇用真实的 sentry-sdk 配自写的 transport 逐项验证,没有联网、没有用真实的 Sentry 服务(日志与请求 ID 见第 181、182 篇)。

0 个
被自己的 @errorhandler(Exception) 接住的异常上报的事件数
?token=
查询字符串里的参数没有被默认过滤
+2.1 s
收集端卡住时 SIGTERM 后进程退出多等的时间

上报哪些异常

实测 · 本机执行输出
  未处理的 /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

分步演示

Flask 错误监控
本步的对象

    本文用到的工具与边界

    • 本机 macOS 27 arm64 / Python 3.14.7 / Flask 3.1.3 / Werkzeug 3.1.9 / Jinja2 3.1.6 / SQLAlchemy 2.1.1 / gunicorn 26.2.0(都装在自己的虚拟环境里);大多数实验用 Flask 的 test_client(直接调用 WSGI 应用,不经过网络),需要真实 HTTP 时另起 gunicorn 或开发服务器(端口 9600 以上,本机 127.0.0.1);计时用 time.perf_counter,数字每次运行会有小幅抖动。sentry-sdk 2.71.0(FlaskIntegration、自写 Transport),gunicorn
    • 没有验证:真实的 Sentry 服务端(事件分组、告警、面包屑在界面里的样子)、性能追踪(traces_sample_rate)、release 与 source map、其它监控产品、在多 worker 下按进程初始化的差别(这里只用 1 个 worker)
    京ICP备2026067502号-1京公网安备11010502063487号