Administrator
Administrator
发布于 2026-11-03 / 0 阅读
0
0

Prometheus 从入门到生产实践(24):生产综合项目:灰度上线、故障演练与升级回滚

本篇是《Prometheus 从入门到生产实践》第 24 / 24 篇。配置以文中版本与环境前提为准,实验和故障均为教学场景。完整程序、配置及校验范围见配套实验包。

从实验验收、灰度发布到故障演练和升级回滚

学会写配置和 PromQL 之后,最后需要交付的是一套别人能接手、故障时有证据、升级时可以控制风险的监控系统。本篇以教学业务服务为主线,把采集、查询、告警、安全、容量和恢复组织成一次分阶段项目。

1. 先给项目定义可验收的目标

假设需求是:监控 demo 的请求速率、错误比例和延迟;目标抓取失败与业务持续恶化能通知正确的人;监控自身失效能被外部发现;短期历史、本地恢复时间和长期保存范围都有明确承诺。

把期望写成具体问题:最长允许多久没发现?谁负责接收与处理?多少天原始数据留在本地?某节点失效后保留什么能力?恢复要多久?哪些查询必须在多长时间内完成?

不要先承诺一个“99.99% 高可用”,再拼组件。监控链路与被监控业务分别有自己的服务目标,发送成功也不等同于值班人员已经响应。

2. 第一阶段:固定基准,再验证最短链路

在隔离环境启动教学 exporter 19100、Prometheus 19090、Alertmanager 19093,使用独立目录与回环监听。记录实际二进制版本、配置哈希和所有启动参数。

持续产生可控的成功和失败请求,先检查 /metrics 的计数与直方图,再确认 Targets 正常,最后用固定窗口查询 rate、错误比例及延迟。至少等待窗口内有足够样本;启动后的空结果不能直接当成零错误。

为后续步骤保存一份基准:目标标签、预期序列、请求总量、错误量、图表单位、告警状态及响应截图或导出的查询结果。数值在变化时,要记录查询时刻和范围,而不是只保存一张没有时间的图。

3. 第二阶段:把配置变更变成可复现流程

把 scrape、file_sd、recording rules、alerting rules 和通知路由放进版本管理,配置中只引用凭据位置,不提交真实令牌。记录服务发现与 Operator 资源的实际拥有者,避免手工修改由控制器生成的文件。

每次变更先在对应版本运行校验:

promtool check config prometheus.yml
promtool check rules rules/*.yml
amtool check-config alertmanager.yml

这些路径是项目目录约定,需替换为实际文件。规则单元测试补充 counter reset、低流量、缺失、匹配唯一性和告警持续时间。文件检查通过后,在测试实例加载,并查看运行时配置和规则健康状态;校验工具不会证明网络、认证或接收器正确。

变更记录至少包括原因、影响 job、预期序列增量、回退文件和验收查询。这样发现资源增长时,可以追到是哪次指标或发现规则变更。

4. 第三阶段:灰度一个 job,观察容量与正确性

先接入一小组有代表性的目标,不要第一天直接全量发现所有 namespace。比较接入前后的目标数、每次样本数、活跃序列、churn、内存、CPU、磁盘和查询延迟。

验证关键 SLI 没有被 relabel 丢掉,经典直方图的 le 保留,聚合维度与看板一致。为采集限制留余量,并配置限制触发时的诊断入口。确认估算不只是“当前磁盘还能放下”,还覆盖 WAL、压缩、备份和发布增长。

达成预算后按批次扩展,保留每批数据和观察时长。若需要缩回范围,回退具体发现选择器或指标来源,而不是用随机删目录来降低磁盘占用。

5. 第四阶段:让每种故障都有预期证据

专用测试故障 需要验证的结果
停止 demo exporter up 失败、Targets 原因、告警持续时间和恢复
保持 exporter 正常但提高错误比例 up 仍为 1,业务 SLI 告警能独立出现
规则引用错误或语义不符 文件/规则检查和运行时错误能被发现
测试接收端不可用 告警仍存在,通知失败与重试可观察
单 Prometheus/AM 实例停止 符合已设计 HA 能力,不把重复通知算成未知事件
远端存储暂不可达 积压与预算明确,恢复后追平并核对缺口

演练只能影响专用目标和授权接收端。每项记开始、首次被观察到、firing、首次收到、恢复和恢复通知时间,并解释中间各段延迟。把实际耗时与承诺比较,而不是只写“演练通过”。

6. 第五阶段:监控系统也需要被监控

本地 Prometheus 挂了以后,它自己无法及时求值“我已经挂了”的告警。因此需要独立位置的探测、另一套监控,或外部接收心跳的 dead-man's-switch。

配套的自监控规则示例如下,只有加载并送到正确接收链路才生效:

groups:
  - name: monitoring-self
    interval: 30s
    rules:
      - alert: MonitoringWatchdog
        expr: vector(1)
        labels:
          severity: none
          environment: lab
        annotations:
          summary: '监控通知链路心跳:持续存在是预期行为'
      - alert: MonitoringRuleEvaluationFailed
        expr: increase(prometheus_rule_evaluation_failures_total[10m]) > 0
        labels:
          severity: warning
        annotations:
          summary: '规则求值失败,请查看 Prometheus 规则状态和日志'

MonitoringWatchdog 持续存在是预期;真正要发现的是外部接收端一段时间未收到它。不能把它当成普通故障告警让值班手机不停响。规则求值失败的指标也应先确认版本实际暴露,并抓取 Prometheus 自身。

还需要观测配置重载失败、TSDB 写入与压缩问题、查询压力、远端发送、Alertmanager 通知错误及磁盘余量。告警设计可参照 Alerting practices,重点是能引导行动和定位原因。

7. 升级要按数据兼容性设计回滚

先阅读当前到目标版本之间的迁移说明和发布记录,核对 PromQL 行为、配置字段、抓取协议、原生直方图、Remote Write/OTLP 与后端兼容。用目标版本的 promtool 检查配置,但也保留实际运行版本的校验结果。

在克隆或测试数据上启动新版本,测量 WAL 重放、历史查询和规则行为。对于双副本,先升级一份,观察足够长的代表性窗口,确认另一份仍提供原来的保障后再继续。

不要假设回滚就是把二进制换回去。新版本可能写入旧版本不能读取的数据或状态,回滚要按已验证的兼容路径,必要时使用升级前备份或另一份尚未升级副本。不得让不同版本进程同时写同一个 TSDB。

Prometheus 3 的重大变化应阅读 Migration guide,具体版本再核对对应 release notes。保留安装包、校验摘要、配置、规则、启动参数与恢复记录,才能让回退步骤真正可执行。

8. 交接时交付一份能被接手的运行手册

运行手册应包含组件与数据流、负责人、资产范围、标签约定、规则与看板、容量预算、权限和凭据更新路径、备份恢复记录、常见故障入口及变更回退流程。

再让另一个人在没有口头补充的情况下,用手册完成一次查询、一次规则检查和一次测试故障定位。凡是必须靠“你记得某台机器在哪里”才能继续的步骤,都需要补到文档。

至此,教程的终点不是部署了最多组件,而是能够解释数据怎样进入、查询为何正确、告警怎样到人、故障损失多大,以及变更后如何证明系统仍符合承诺。


上一篇:联邦、Agent 与 OpenTelemetry:画清不同数据路径 · 系列目录 · 本篇为系列收尾


评论