把状态码变成可观测指标
状态码是服务端最廉价的可观测信号:按 1xx 到 5xx 分层统计,再按接口维度下钻,就能把「用户手滑」和「服务故障」区分开。判断口径要先约定:4xx 率上升可能是业务变化也可能是扫描,5xx 才是硬故障;没有统一口径的监控,只会产出无人认领的告警。
基本信息
| 分层原则 | 1xx 忽略、2xx 正常、3xx 关注跳转链、4xx 看业务与攻击、5xx 立即告警 |
|---|---|
| 常用指标 | 5xx 率、4xx 率、P95 与 P99 延迟、429 计数 |
| 下钻维度 | 接口路径、客户端 UA、上游实例、地域 |
| 取样注意 | 按总请求量计算比率,避免低峰期单点被放大 |
阈值参考
| 指标 | 参考阈值 | 说明 |
|---|---|---|
| 5xx 率 | 大于 1% 持续 5 分钟告警 | 先确认是自身还是上游依赖 |
| 单接口 4xx 突增 | 较基线放大 10 倍关注 | 常见于客户端版本发布或爬虫扫描 |
| 429 计数 | 持续增长需扩容或限流调优 | 说明限流正在生效,用户可能受影响 |
| P99 延迟 | 超过基线 2 倍告警 | 状态码正常但用户已感知变慢 |
Nginx 侧快速统计
Nginx 侧快速统计
awk '{print $9}' /var/log/nginx/access.log | grep -E '^[45]' | sort | uniq -c | sort -rn | head
# 按接口看 5xx
awk '$9 ~ /^5/ {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
# 按分钟看 5xx 密度(需先按时间排序或使用日志处理工具)
awk '$9 ~ /^5/ {print $4}' /var/log/nginx/access.log | cut -d: -f2,3 | sort | uniq -c | tail典型使用场景
- 发布后对比发布前后的 5xx 曲线,作为回滚判据
- 大促前压测确认限流触发时的 429 比例是否在预期范围
- 排查「部分用户报错」:按 UA 与接口下钻定位受影响的客户端版本
- 把健康检查的探测失败与业务 5xx 分开统计,避免探针干扰告警
4xx 不一定是故障:爬虫 404 扫描、旧客户端 400 都会抬高 4xx 率。要按接口与 UA 维度下钻,才能分清是攻击、客户端陈旧还是业务逻辑变化。
别只看总量看比率:低峰期一个用户触发几次 500 就能让 5xx 率飙到很夸张,告警规则应同时要求最小请求量门槛。