服务水平目标(SLO)监控
介绍
服务水平目标(Service Level Objective, SLO)是衡量系统可靠性的关键指标,通常以百分比形式表示(如"99.9%的请求应在200ms内完成")。在Zipkin的分布式追踪上下文中,SLO监控帮助开发者量化系统的实际表现是否符合预期,并为告警提供数据依据。
为什么需要SLO?
- 将模糊的"系统要快"转化为可衡量的目标
- 为团队提供明确的可靠性标准
- 避免过度告警(基于错误率而非单个故障)
核心概念
1. SLO基本组成
-
指标选择:常见于分布式系统的指标包括:
- 延迟(Latency):
p99 < 300ms
- 错误率(Error Rate):
< 0.1% 5xx错误
- 吞吐量(Throughput)
- 延迟(Latency):
-
目标阈值:通常表示为"X%的请求满足条件Y"
-
时间窗口:如"30天内达到99.9%可用性"
2. Zipkin中的SLO实现
Zipkin通过追踪数据计算SLO指标。例如,要监控API延迟:
java
// 在Spring Boot应用中添加自定义标签
@GetMapping("/api")
public ResponseEntity<String> getData() {
Span span = tracer.currentSpan();
span.tag("slo.type", "latency");
span.tag("slo.threshold_ms", "200");
// ...业务逻辑
}
对应的Zipkin查询:
sql
SELECT COUNT(*) FROM spans WHERE
timestamp > now() - 1h AND
tags["slo.type"] = "latency" AND
duration < tags["slo.threshold_ms"] * 1000
实际案例:电商订单服务
假设我们需要保证订单服务的SLO:
- 目标:99%的订单创建请求在1秒内完成
- 监控周期:滚动7天窗口
实现步骤
- 标记关键Span:
python
# Flask应用示例
@app.route("/create_order", methods=["POST"])
def create_order():
with tracer.start_span("create_order") as span:
span.set_tag("slo_category", "order_processing")
span.set_tag("slo_max_latency", "1s")
# 处理订单逻辑
- Zipkin数据聚合:
bash
# 使用Zipkin API查询符合SLO的请求比例
curl -X GET "http://zipkin:9411/api/v2/traces?serviceName=order-service&annotationQuery=slo_category=order_processing"
- 计算结果:
总请求数:10,000
<1s完成的请求:9,920
SLO达标率:99.2% (达标)
告警策略设计
避免告警疲劳
建议采用"燃烧率"(Burn Rate)模型而非即时告警:
- 燃烧率 = 错误预算消耗速度
- 例如:当1小时消耗了1天的错误预算时触发告警
总结
关键要点:
- SLO需要明确定义可测量的指标
- Zipkin的分布式追踪数据是计算SLO的理想来源
- 应该基于错误预算而非即时指标触发告警
扩展练习
- 在您的Zipkin实例中:
- 为关键服务添加
slo_category
标签 - 编写查询计算过去24小时的SLO达标率
- 为关键服务添加
- 设计一个燃烧率告警规则(假设允许每月27分钟宕机)