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落地流程(含落地示例)#
- 业务梳理:识别核心链路与关键路径。
- 指标选型:选定SLI并建立PromQL。
- 目标设定:与业务/产品/运维达成SLO范围。
- 告警联动:SLO违约预警绑定告警分级。
- 回顾机制:月度/季度评估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. 练习(动手操作)#
- 新增一个SLO规则:为你的服务添加
P99<800ms的Recording Rule,并在Prometheus中验证。 - 模拟SLO违约:用
ab或hey压测制造高延迟,观察告警触发。 - 基数控制演练:给应用指标增加
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可能触发