3. 基线定义与采集:系统稳态基线与关键指标
混沌工程的核心前提是“可观测的稳态”。在注入故障之前,必须明确系统在正常状态下的行为特征,即系统稳态基线。没有基线,就无法判断故障注入是否产生了影响,也无法量化恢复程度。本章将系统讲解基线的定义、关键指标的选取原则以及主流采集工具的使用方法。
3.1 系统稳态基线(Steady-State Baseline)
系统稳态基线是指系统在正常生产负载下,各项关键指标处于可接受范围内的稳定状态。它不是静态的固定值,而是一个动态的、带有统计上下文的正常波动区间。
核心定义: 稳态基线 = 正常负载下的指标分布(均值、P50、P95、P99) + 可接受的波动范围(±3σ 或固定阈值)。
基线的作用贯穿混沌实验全流程:
- 实验前: 验证系统当前状态是否与基线一致,确保实验起点正常。
- 实验中: 实时对比当前指标与基线,判断故障是否扩散或系统是否降级。
- 实验后: 确认系统是否恢复到基线范围内,作为实验结束的判定条件。
3.2 关键性能指标(KPI)与业务指标(SLI/SLO)的选取
基线采集的第一步是确定“采集什么”。混沌工程中,指标分为两个层次:技术层 KPI 和 业务层 SLI/SLO。两者缺一不可,共同构成完整的稳态视图。
3.2.1 技术层 KPI(关键性能指标)
KPI 反映系统基础设施和中间件的健康状态,是故障注入时最直接的观测对象。常见 KPI 包括:
| 指标类别 | 典型指标 | 采集粒度 | 基线参考 |
|---|---|---|---|
| CPU | 使用率、Load Average | 10s - 1min | 均值 < 70%,峰值 < 90% |
| 内存 | 使用率、Swap 使用量 | 10s - 1min | 使用率 < 80%,Swap ≈ 0 |
| 网络 | 带宽使用率、TCP 重传率 | 1min | 重传率 < 0.1% |
| 磁盘 | IOPS、延迟、使用率 | 1min | 延迟 P99 < 10ms |
| 应用 | QPS、错误率、响应时间 | 10s - 1min | 错误率 < 0.1%,P99 < 500ms |
3.2.2 业务层 SLI/SLO
SLI(Service Level Indicator)是服务质量的直接度量,SLO(Service Level Objective)是 SLI 的目标值。混沌工程必须验证故障注入是否导致 SLO 违反。
- SLI 示例: 请求成功率、页面加载时间、订单创建延迟、支付完成率。
- SLO 示例: 请求成功率 ≥ 99.9%(三个9)、P95 延迟 ≤ 200ms、每日错误预算消耗 ≤ 10%。
选取原则: 优先选择与用户体验直接相关的 SLI,其次选择基础设施 KPI。每个混沌实验至少包含 1 个业务 SLI 和 2 个技术 KPI,确保既能发现功能问题,也能定位资源瓶颈。
3.2.3 KPI 与 SLI/SLO 的关系
3.3 基线采集工具:Prometheus 与 Grafana
生产级基线采集需要具备高可用、低延迟、可回溯的能力。Prometheus + Grafana 是目前混沌工程领域最成熟的开源组合。
3.3.1 Prometheus:指标采集与存储
Prometheus 通过 Pull 模式从目标 exporter 拉取指标,支持多维数据模型和 PromQL 查询语言。
典型采集配置示例(prometheus.yml):
global:
scrape_interval: 15s # 全局采集间隔
evaluation_interval: 15s # 规则评估间隔
scrape_configs:
- job_name: 'node-exporter'
static_configs:
- targets: ['192.168.1.10:9100', '192.168.1.11:9100']
- job_name: 'app-metrics'
metrics_path: '/metrics'
static_configs:
- targets: ['192.168.1.20:8080']
- job_name: 'cadvisor'
static_configs:
- targets: ['192.168.1.30:8080']
基线采集的关键配置参数:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| scrape_interval | 10s - 30s | 故障注入场景建议 10s,日常基线 30s |
| scrape_timeout | 10s | 避免因 exporter 慢导致采集失败 |
| storage.tsdb.retention.time | 30d | 保留足够历史数据用于基线对比 |
| storage.tsdb.retention.size | 根据磁盘调整 | 建议保留 30 天数据,约 100GB/节点 |
3.3.2 Grafana:基线可视化与告警
Grafana 作为可视化层,将 Prometheus 中的指标转化为基线仪表盘,并支持设置动态告警规则。
基线仪表盘设计要点:
- 时间范围: 默认展示最近 1 小时,同时提供“同比昨日”和“同比上周”的基线对比视图。
- 统计聚合: 使用 avg、p50、p95、p99 函数展示指标分布,而非仅展示原始值。
- 阈值线: 在面板中叠加 SLO 目标线(如 99.9%)和告警阈值线,直观判断是否越界。
- 变量模板: 使用 Grafana 变量(如 $service、$instance)实现多环境复用。
常见陷阱: 基线不是“最大值”或“最小值”,而是“正常波动区间”。如果仅用固定阈值(如 CPU < 80%),会漏掉突发尖峰导致的 SLO 违反。建议使用 PromQL 的
histogram_quantile 和 rate 函数计算动态基线。
3.3.3 基线采集的 PromQL 示例
以下 PromQL 查询可用于生成稳态基线:
# 1. 请求成功率 SLI(过去 5 分钟)
sum(rate(http_requests_total{status=~"2..|3.."}[5m]))
/
sum(rate(http_requests_total[5m]))
# 2. P95 响应时间基线(过去 1 小时)
histogram_quantile(0.95,
sum(rate(http_request_duration_seconds_bucket[1h])) by (le)
)
# 3. CPU 使用率基线(过去 7 天同一时刻)
avg by (instance) (
avg_over_time(node_cpu_seconds_total{mode="idle"}[7d])
)
3.4 基线采集的完整流程
将上述概念和工具整合,基线采集的标准化流程如下:
- 指标梳理: 列出所有需要采集的 KPI 和 SLI,确定采集粒度和保留周期。
- Exporter 部署: 在目标节点部署 node_exporter、cadvisor、应用自定义 exporter。
- Prometheus 配置: 设置 scrape_interval、retention 策略,确保采集覆盖所有目标。
- Grafana 仪表盘: 创建基线视图,叠加 SLO 阈值线和同比对比。
- 基线数据导出: 将至少 7 天的历史数据导出为 CSV 或 JSON,作为混沌实验的参考基线文件。
- 定期校准: 每周或每次重大发布后重新校准基线,避免基线漂移。
基线采集检查清单:
✅ 所有核心服务已暴露 /metrics 端点
✅ Prometheus 采集间隔 ≤ 15s
✅ 数据保留 ≥ 30 天
✅ Grafana 仪表盘包含 P50/P95/P99 视图
✅ 已导出至少 7 天历史基线数据
✅ 已设置 SLO 告警规则(非仅基础设施告警)
✅ 所有核心服务已暴露 /metrics 端点
✅ Prometheus 采集间隔 ≤ 15s
✅ 数据保留 ≥ 30 天
✅ Grafana 仪表盘包含 P50/P95/P99 视图
✅ 已导出至少 7 天历史基线数据
✅ 已设置 SLO 告警规则(非仅基础设施告警)