第62章|可观测性 2:指标(Metrics)、告警与 SLO/SLI

如果日志是“事故现场照片”,指标就是“生命体征监护仪”。 真正成熟的团队不会只盯 CPU 曲线,而是把系统目标翻译成可衡量的服务承诺: SLI 描述实际表现,SLO 描述目标阈值, Error Budget 决定发布节奏。告警系统则像值班台:不是越响越好,而是越“可行动”越好。

Metrics

Signal quality

  • latency / traffic
  • errors / saturation
  • business SLIs
SLO

Target setting

  • window + threshold
  • burn-rate policy
  • release gating
Alerting

Actionable paging

  • multi-window rules
  • dedup & routing
  • runbook links

1. 指标体系:从“能看图”到“能决策”

指标不是装饰性图表。高价值指标必须能够触发动作:扩容、降级、暂停发布、回滚。 建议先用四大黄金信号(延迟、流量、错误、饱和度)搭骨架,再补业务 SLI(下单成功率、支付完成率、搜索命中率)。 你应该能回答:这个指标波动时,谁应该在几分钟内采取什么行动。

Metrics hierarchy: infrastructure → service → user journey Infrastructure CPU / memory / disk queue depth Service SLI latency p99 5xx ratio Business SLI checkout success rate payment completion Actionable observability means every layer has a clear owner and response playbook.
图 1:指标分层后,才能把技术症状映射到用户体验和业务风险。

2. SLI/SLO:定义“好服务”的方法学

SLI(Service Level Indicator) 是实际测量值, SLO(Service Level Objective) 是目标约束。 举例:过去 30 天内,`checkout` 接口 99.9% 请求延迟小于 300ms,且错误率小于 0.2%。 一旦 SLO 被持续侵蚀,发布节奏必须收敛:这就是 error budget 的治理意义。

Term Meaning Example
SLI measured quality signal p99 latency, success ratio
SLO target threshold + window 99.9% under 300ms in 30d
Error Budget allowed unreliability 0.1% failure budget
# Illustrative SLI/SLO formulas
# Success ratio (SLI)
sum(rate(http_requests_total{status!~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))

# Error budget burn (conceptual)
burn_rate = current_error_rate / allowed_error_rate
底线:SLO 不是 KPI 装饰。它必须连接到治理动作(暂停上线、加人值守、触发回滚策略)。

3. 告警工程:从“噪声轰炸”到“可行动通知”

告警设计要回答三件事:谁被叫醒为什么叫醒醒来后先做什么。 推荐采用多窗口告警(fast burn + slow burn):既捕捉突发事故,也避免短时抖动造成误报。 每条告警都应附上 runbook 链接、最近发布标记、关键仪表盘与一键查询入口。

Alerting pipeline: evaluate → dedup → route → notify with context Evaluate rule windows threshold checks Dedup group by labels silence windows Route team ownership severity-based Notify pager + chat + ticket runbook + dashboard links
图 2:告警链路的价值在于“降噪并上下文化”,而不是把人叫醒后再让他猜。

4. 多窗口告警(Burn-rate alerts):兼顾“快反应”和“低噪声”

单窗口阈值往往导致两种极端:过于敏感(误报)或过于迟钝(漏报)。 多窗口 burn-rate 策略可同时监控短窗口与长窗口:短窗口捕获急性故障,长窗口确认趋势稳定。 在实际执行中,告警条件通常要求“两窗同时触发”,从而减少噪声。

# Illustrative multi-window burn-rate alert logic (conceptual)
# Short window: 5m, Long window: 1h
if burn_rate_5m > 14 and burn_rate_1h > 6:
    page("critical")
elif burn_rate_30m > 6 and burn_rate_6h > 3:
    ticket("warning")
Dual-window burn-rate decisions time burn critical line both windows exceed threshold
图 3:多窗口 burn-rate 能更稳地识别“真故障”而非瞬时抖动。

5. 指标治理:命名、标签、基数与成本

指标系统最容易“慢性中毒”的问题是标签基数失控。像 `user_id`、`session_id` 这样的高基数字段会迅速放大存储和查询成本。 建议制定指标规范:统一命名(`service_operation_duration_seconds`)、标签白名单(`service`, `region`, `status_class`)、 以及采样/聚合策略。把成本治理写进平台规范,而不是等账单暴涨后补救。

底线:任何新指标上线前,先评估标签基数与查询价值。能用日志/trace定位的问题,不一定要变成高成本指标。

6. 本章清单

  1. 定义服务核心 SLI(延迟、错误、可用性)并与用户旅程对齐。
  2. 为关键服务设置 SLO(目标阈值 + 时间窗口),并建立 error budget 解释规则。
  3. 构建可行动告警:多窗口 burn-rate、告警去重、团队路由、runbook 链接。
  4. 为每次发布打 release markers,便于指标回归与故障因果分析。
  5. 制定指标命名和标签规范,控制高基数带来的系统成本。
  6. 预告下一章:分布式追踪(Tracing),把“慢在哪里”定位到具体调用链。
← 上一章:可观测性 1 下一章:可观测性 3 →