3. 基线定义与采集:系统稳态基线与关键指标

混沌工程的核心前提是“可观测的稳态”。在注入故障之前,必须明确系统在正常状态下的行为特征,即系统稳态基线。没有基线,就无法判断故障注入是否产生了影响,也无法量化恢复程度。本章将系统讲解基线的定义、关键指标的选取原则以及主流采集工具的使用方法。

3.1 系统稳态基线(Steady-State Baseline)

系统稳态基线是指系统在正常生产负载下,各项关键指标处于可接受范围内的稳定状态。它不是静态的固定值,而是一个动态的、带有统计上下文的正常波动区间。

核心定义: 稳态基线 = 正常负载下的指标分布(均值、P50、P95、P99) + 可接受的波动范围(±3σ 或固定阈值)。

基线的作用贯穿混沌实验全流程:

  • 实验前: 验证系统当前状态是否与基线一致,确保实验起点正常。
  • 实验中: 实时对比当前指标与基线,判断故障是否扩散或系统是否降级。
  • 实验后: 确认系统是否恢复到基线范围内,作为实验结束的判定条件。
稳态基线在混沌实验中的位置 1. 采集稳态基线 正常负载下指标分布 2. 注入故障 对比基线判断影响 3. 恢复验证 指标回归基线范围 基线对比逻辑 • 实验前:当前指标 vs 基线 → 确认起点正常 • 实验中:实时指标 vs 基线 → 发现异常扩散 • 实验后:恢复指标 vs 基线 → 判定实验结束

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 的关系

KPI 与 SLI/SLO 分层关系 业务层:SLI / SLO 请求成功率 ≥ 99.9% | P95 延迟 ≤ 200ms 应用层:KPI QPS | 错误率 | 响应时间 P50/P95/P99 基础设施层:KPI CPU | 内存 | 网络 | 磁盘 故障注入 影响 ↓ 资源 争抢 ↓ 应用 降级 ↓ 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 基线采集的完整流程

将上述概念和工具整合,基线采集的标准化流程如下:

  1. 指标梳理: 列出所有需要采集的 KPI 和 SLI,确定采集粒度和保留周期。
  2. Exporter 部署: 在目标节点部署 node_exporter、cadvisor、应用自定义 exporter。
  3. Prometheus 配置: 设置 scrape_interval、retention 策略,确保采集覆盖所有目标。
  4. Grafana 仪表盘: 创建基线视图,叠加 SLO 阈值线和同比对比。
  5. 基线数据导出: 将至少 7 天的历史数据导出为 CSV 或 JSON,作为混沌实验的参考基线文件。
  6. 定期校准: 每周或每次重大发布后重新校准基线,避免基线漂移。
基线采集检查清单:
✅ 所有核心服务已暴露 /metrics 端点
✅ Prometheus 采集间隔 ≤ 15s
✅ 数据保留 ≥ 30 天
✅ Grafana 仪表盘包含 P50/P95/P99 视图
✅ 已导出至少 7 天历史基线数据
✅ 已设置 SLO 告警规则(非仅基础设施告警)