17.11.1 监控指标体系与SLA/SLO规范

监控指标体系与SLA/SLO规范#

0. 原理草图:指标→SLI→SLO→SLA→告警#

文章图片

1. 指标体系分层与分类(含示例)#

  • 四大黄金指标:延迟、流量、错误率、饱和度。
  • 系统层指标:CPU、内存、磁盘、网络、负载、文件句柄、TCP状态、时钟偏移。
  • 服务层指标:QPS、P95/P99 延迟、成功率、超时率、队列长度、线程池/连接池使用率。
  • 中间件指标:MySQL连接数/慢查询,Nginx请求率/5xx,Redis内存/命中率,Kafka滞后,ZK/Nacos心跳,HAProxy/Keepalived健康。
  • 业务层指标:核心业务成功率、错误码分布、转化漏斗。
  • 用户体验指标:首字节时间、页面渲染时间、端到端可用性。

命令示例:查看当前已有指标(Prometheus API)

# 查询Prometheus当前加载的指标名
curl -s http://127.0.0.1:9090/api/v1/label/__name__/values | head
# 预期:返回json列表,包含http_requests_total等指标名

2. SLA、SLO与SLI定义(含计算示例)#

  • SLI:可度量指标(成功率/延迟/可用性)。
  • SLO:对SLI的目标约束(如99.9%成功率)。
  • SLA:对外承诺与赔付条款,通常高于SLO。

PromQL示例:可用性与错误率

# 可用性(成功率)
sum(rate(http_requests_total{code!~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))

# 错误率
sum(rate(http_requests_total{code=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))

3. SLO与错误预算(Error Budget)落地示例#

  • 错误预算1 - SLO,如SLO=99.9%,月度允许0.1%失败。
  • 应用原则:超预算冻结发布;未用完预算允许迭代。

计算示例:月度错误预算分钟数

# 假设30天窗口,SLO 99.9%
total_minutes=$((30*24*60))
error_budget=$(echo "$total_minutes*0.001" | bc)
echo "允许失败分钟数: $error_budget"
# 预期输出:允许失败分钟数: 43.2

4. 指标口径与数据规范(含配置示例)#

  • 统一口径:明确“成功/失败/超时”判定。
  • 标签规范:限制高基数标签,统一命名(env、region、service、instance)。
  • 采集频率:基础指标15s~60s,业务指标1m~5m。

Prometheus采集频率示例

# /etc/prometheus/prometheus.yml
global:
  scrape_interval: 15s
  evaluation_interval: 15s

scrape_configs:
  - job_name: "app"
    metrics_path: "/metrics"
    static_configs:
      - targets: ["10.0.0.11:8080","10.0.0.12:8080"]

5. SLA/SLO落地流程(含落地示例)#

  1. 业务梳理:识别核心链路与关键路径。
  2. 指标选型:选定SLI并建立PromQL。
  3. 目标设定:与业务/产品/运维达成SLO范围。
  4. 告警联动:SLO违约预警绑定告警分级。
  5. 回顾机制:月度/季度评估SLO达成率。

Recording Rule 示例(落地到Prometheus)

# /etc/prometheus/rules/slo.rules.yml
groups:
- name: slo.rules
  rules:
  - record: job:request_success_rate:5m
    expr: |
      sum(rate(http_requests_total{code!~"5.."}[5m])) by (job)
      /
      sum(rate(http_requests_total[5m])) by (job)

  - record: job:request_p95:5m
    expr: |
      histogram_quantile(0.95,
        sum(rate(http_request_duration_seconds_bucket[5m])) by (le, job)
      )

6. SLO告警示例(含安装与生效验证)#

告警规则文件

# /etc/prometheus/rules/slo.alerts.yml
groups:
- name: slo.alerts
  rules:
  - alert: SLOAvailabilityBreach
    expr: job:request_success_rate:5m < 0.999
    for: 10m
    labels:
      severity: critical
    annotations:
      summary: "SLO可用性低于99.9%"
      description: "job={{ $labels.job }} success_rate={{ $value }}"

  - alert: SLOLatencyBreach
    expr: job:request_p95:5m > 0.3
    for: 5m
    labels:
      severity: warning
    annotations:
      summary: "P95延迟超过300ms"
      description: "job={{ $labels.job }} p95={{ $value }}s"

Prometheus主配置引入规则

# /etc/prometheus/prometheus.yml
rule_files:
  - "/etc/prometheus/rules/slo.rules.yml"
  - "/etc/prometheus/rules/slo.alerts.yml"

重载配置并验证

# 热重载Prometheus配置
curl -X POST http://127.0.0.1:9090/-/reload

# 验证规则是否加载
curl -s http://127.0.0.1:9090/api/v1/rules | grep -E "SLOAvailabilityBreach|SLOLatencyBreach"

7. 运维规范与验收标准(含模板示例)#

  • 最小指标集:每服务至少包含可用性、延迟、错误率、饱和度。
  • SLO覆盖率:核心≥90%,非核心≥60%。
  • 告警一致性:SLO违约与告警策略一致。
  • 验收标准:新增服务必须提供SLO说明、看板、告警。

SLO说明书模板(示例)

service: order-service
sli:
  availability: "1 - 5xx_rate"
  latency: "p95 < 300ms"
slo:
  availability: "99.9% (30d)"
  latency: "p95 < 300ms (5m)"
window:
  rolling: "5m/30d"
alerts:
  - SLOAvailabilityBreach
  - SLOLatencyBreach

8. 常见问题与排错(含命令)#

  • 高基数标签导致存储膨胀:限制动态标签、改为采样与聚合。
  • SLO过高不可实现:分阶段目标或分人群SLO。
  • 指标失真:统一入口指标,避免重复统计。

排错命令:查看目标与抓取状态

# 检查目标抓取是否正常
curl -s http://127.0.0.1:9090/api/v1/targets | grep -E "health|lastError|scrapeUrl"

# 检查抓取失败的目标
curl -s http://127.0.0.1:9090/api/v1/targets \
| grep -B2 -A2 "down" 

9. 练习(动手操作)#

  1. 新增一个SLO规则:为你的服务添加P99<800ms的Recording Rule,并在Prometheus中验证。
  2. 模拟SLO违约:用abhey压测制造高延迟,观察告警触发。
  3. 基数控制演练:给应用指标增加user_id标签,观察Prometheus内存变化,然后移除标签并对比。

压测示例

# 安装hey(示例:Linux AMD64)
curl -L -o /usr/local/bin/hey https://hey-release.s3.us-east-2.amazonaws.com/hey_linux_amd64
chmod +x /usr/local/bin/hey

# 模拟高并发
hey -z 30s -c 200 http://10.0.0.11:8080/api/v1/order
# 预期:延迟上升,SLOLatencyBreach可能触发