uwsgitop + StatsServer:实时监测uWSGI实例的完整可观测性教程
【免费下载链接】uwsgi-docsOfficial uWSGI docs, examples, tutorials, tips and tricks项目地址: https://gitcode.com/gh_mirrors/uw/uwsgi-docs
uwsgitop是一款 top 风格的实时监测工具,配合 uWSGI 内置的Stats Server,只需一行配置就能让 uWSGI 实例的运行状态(请求数、内存、worker 状态)变成一份可查询的 JSON 数据,并在终端中持续刷新。本教程基于 uWSGI 官方文档,带你从零搭建完整的 uWSGI 可观测性体系。
1. Stats Server 工作原理:一行配置导出监控数据
Stats Server 是 uWSGI 内置的统计导出机制:把 uWSGI 内部状态打包成 JSON 对象,通过 socket 对外提供。客户端只要连接指定地址,就能立即拿到实时统计信息(连接结束后返回)。
启用它非常简单——--stats后跟任意合法的 socket 地址即可:
# 四种常用 socket 形式 --stats 127.0.0.1:1717 # TCP 地址 --stats /tmp/statsock # Unix socket 文件 --stats :5050 # 仅监听本地端口 --stats @foobar # 抽象 Unix socket # 加上 --stats-http 后,任意 socket 都可以通过 HTTP 访问统计 --stats 127.0.0.1:1717 --stats-http💡 完整配置说明见官方文档 StatsServer.rst,全部选项定义见 Options.rst。
验证 Stats Server 是否生效
启动一个带 stats 的实例:
uwsgi --socket :3031 --stats :1717 --module welcome --master --processes 8然后有两种方式读取数据:
nc 127.0.0.1 1717 # 或更便捷的内置命令 uwsgi --connect-and-read 127.0.0.1:1717你会得到一个包含每个 worker 信息的 JSON,核心字段包括:
| 字段 | 含义 |
|---|---|
requests | 该 worker 处理的请求数 |
exceptions | 异常次数 |
status | worker 状态(idle/busy) |
rss/vsz | 内存占用 |
respawn_count | worker 重生次数(异常退出信号) |
avg_rt | 平均响应时间 |
respawn_count频繁增长、exceptions飙升,都是需要重点关注的健康指标。
2. uwsgitop 快速上手:终端里的实时仪表盘
uwsgitop是专门消费 Stats Server 数据的 top 风格命令行工具,相当于 uWSGI 版的top。
一键安装 uwsgitop
它发布在 PyPI 上,用 pip 即可安装:
pip install uwsgitop启动实时监测
指向你的 stats 端口(上例为 1717):
uwsgitop -H 127.0.0.1 -p 1717启动后即可看到类似top的实时界面:worker 数量、请求计数、内存占用等指标持续刷新,是排查"哪个 worker 变慢了、内存是否泄漏"的第一选择。
📌 工具源码与安装说明记录在官方文档 StatsServer.rst 的 uwsgitop 章节。
3. 快速配置方法:选对 socket 类型
新手常犯的错误是把 stats 端口暴露到公网。建议按场景选择:
- 本机调试(最常用):
--stats 127.0.0.1:1717,只监听回环地址,配合 uwsgitop 使用 - 需要 HTTP 客户端/监控平台拉取:
--stats :1717 --stats-http - 与 uWSGI 同主机的程序对接:
--stats /tmp/statsock(Unix socket,无网络开销)
如果担心输出 JSON 过大,可配合stats-minify选项压缩 JSON 体积(选项定义见 Options.rst 中stats-minify条目)。
4. 进阶:Stats Pusher 把监控数据推给外部系统
Stats Server 是"拉取"模式,而Stats Pusher是"推送"模式——uWSGI 默认每 3 秒主动把统计 JSON 推送到指定目的地。相关机制见官方文档 PushingStats.rst 和 Metrics.rst。
常用 pusher 一览:
| Pusher | 类型 | 用途 |
|---|---|---|
file | JSON | 追加写入本地文件,最易上手 |
mongodb | JSON | 直接写入 MongoDB 集合 |
socket | 原始指标 | 推送到 UDP 监控端点 |
rrdtool | 原始指标 | 生成 RRD 历史图表 |
carbon | 原始指标 | 对接 Graphite 可视化 |
最简示例——每 10 秒把 JSON 追加到文件:
[uwsgi] socket = :3031 module = foobar master = true stats-push = file:path=/tmp/foobar,freq=10需要推送到多个目的地时,声明多条stats-push即可。
对接 Graphite 搭建可视化监控
官方教程 tutorials/GraphiteAndMetrics.rst 演示了完整的多应用监控方案:Emperor 管理多个 vassal,每个 vassal 通过carbon插件把 Metrics 推送到中央 carbon 服务器,再用 Graphite Web 查看图表:
[uwsgi] plugins = carbon enable-metrics = true carbon-use-metrics = true carbon-id = %n carbon = 127.0.0.1:20035. 从监测到告警:Metrics 子系统与阈值告警
uWSGI 1.9.19 起的Metrics 子系统为可观测性补上了最后一块拼图:
- 开箱即用的指标:worker 请求数、每核请求、内存使用、连接队列等大量内置指标
- 自定义指标:用
--metric声明业务指标(如活跃用户数),应用内通过metric_inc/metric_set等 API 更新 - 阈值告警:指标超限自动触发 Alarm 子系统的告警
[uwsgi] metric-alarm = key=worker.0.avg_response_time,value=2000,alarm=overload,rate=30 metric-threshold = key=mycounter,value=1000,reset=0上面两条规则分别表示:平均响应时间超过 2000ms 时每 30 秒触发一次overload告警;mycounter超过 1000 后自动清零。指标与告警的详细配置见 Metrics.rst 与 AlarmSubsystem.rst。
6. 常见问题 FAQ
Q:Stats Server 会影响性能吗?开销极小,JSON 在客户端连接时才生成;若追求极致可用stats-minify精简输出。
Q:uwsgitop 和 Stats Server 端口对不上?确认 uwsgitop 的-p端口与--stats配置一致,且防火墙未拦截本机回环流量。
Q:想让监控数据长期留存怎么办?用file/mongodbstats pusher 定期落盘,或接入 Graphite/RRD 等时序系统(参考 tutorials/GraphiteAndMetrics.rst)。
总结
整套 uWSGI 可观测性路径可以概括为三步:
--stats开启 Stats Server,获得实时 JSON 数据源uwsgitop在终端获得 top 式实时仪表盘- Stats Pusher + Metrics 把指标推入外部系统并配置阈值告警
从"能看"到"能推"再到"能告警",uWSGI 原生能力即可覆盖大多数生产监控场景,无需额外开发。
【免费下载链接】uwsgi-docsOfficial uWSGI docs, examples, tutorials, tips and tricks项目地址: https://gitcode.com/gh_mirrors/uw/uwsgi-docs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考