4. SLO 定义与指标采集:定义服务级别目标(延迟、错误率、吞吐量),Envoy 的 Stats 与 Access Logs 配置
服务网格治理回滚护栏的核心在于可量化的服务质量目标。本章将聚焦于如何定义服务级别目标(SLO),并配置 Envoy 作为数据面代理,精准采集延迟、错误率、吞吐量三大黄金指标。Envoy 的 Stats(统计)与 Access Logs(访问日志)是实现这一目标的两大支柱。
4.1 服务级别目标(SLO)的定义
SLO 是服务可靠性工程(SRE)的基石。在服务网格中,我们通常为每个关键服务定义以下三类 SLO:
| SLO 类型 | 核心指标 | 典型目标值(示例) | 测量维度 |
|---|---|---|---|
| 延迟(Latency) | 请求响应时间(P99 / P95 / P50) | P99 < 500ms,P95 < 200ms | 上游集群、路由、HTTP 方法 |
| 错误率(Error Rate) | HTTP 5xx / 4xx 占比,gRPC 错误码 | 错误率 < 0.1% | 目标集群、状态码、出口入口 |
| 吞吐量(Throughput) | 每秒请求数(RPS) | 基线 RPS > 1000 | 监听器、虚拟主机、集群 |
实践建议: 定义 SLO 时,应区分“燃烧率”与“预算消耗速度”。回滚护栏通常基于错误预算的消耗速率触发,而非瞬时阈值。
4.2 Envoy Stats 配置:指标采集引擎
Envoy 内置了强大的统计子系统,支持将指标以 Prometheus 格式暴露。通过配置 stats_config 和 stats_sinks,我们可以精确控制采集哪些指标。
4.2.1 核心 Stats 配置示例
admin:
access_log_path: /dev/null
address:
socket_address:
address: 0.0.0.0
port_value: 9901
stats_config:
stats_tags:
- tag_name: "cluster_name"
regex: "^cluster\\.((.+?)\\.)"
- tag_name: "response_code_class"
regex: "^cluster\\..+?\\.(\\dxx)"
use_all_default_tags: true
stats_sinks:
- name: envoy.stat_sinks.prometheus
typed_config:
"@type": type.googleapis.com/envoy.extensions.stat_sinks.prometheus.v3.Prometheus
emit_tags_as_labels: true
关键参数说明:
stats_tags:通过正则表达式从指标名称中提取标签(如集群名、状态码类),使指标维度更丰富。emit_tags_as_labels:将 Envoy 内部标签转换为 Prometheus 标签,便于查询聚合。use_all_default_tags:启用 Envoy 默认的标签提取规则,减少手动配置。
4.2.2 三大黄金指标对应的 Stats 名称
| 黄金指标 | Envoy Stats 名称(Prometheus 格式) | 说明 |
|---|---|---|
| 延迟 | envoy_cluster_upstream_rq_time_bucket |
直方图,需配合 Histogram Quantile 计算 P99/P95 |
| 错误率 | envoy_cluster_upstream_rq_completed + envoy_cluster_upstream_rq_5xx |
通过 (5xx / completed) 计算错误率 |
| 吞吐量 | envoy_cluster_upstream_rq_total |
Counter 类型,计算每秒增量得到 RPS |
4.3 Envoy Access Logs 配置:精细化请求追踪
Access Logs 提供了每个请求的完整上下文,是计算 SLO 和调试回滚事件的“黑匣子”。Envoy 支持多种日志格式和输出方式。
4.3.1 结构化 JSON 日志配置
access_log:
- name: envoy.access_loggers.file
typed_config:
"@type": type.googleapis.com/envoy.extensions.access_loggers.file.v3.FileAccessLog
path: /var/log/envoy/access.log
log_format:
json_format:
start_time: "%START_TIME%"
method: "%REQ(:METHOD)%"
path: "%REQ(X-ENVOY-ORIGINAL-PATH?:PATH)%"
protocol: "%PROTOCOL%"
response_code: "%RESPONSE_CODE%"
response_flags: "%RESPONSE_FLAGS%"
duration: "%DURATION%"
upstream_cluster: "%UPSTREAM_CLUSTER%"
downstream_remote_address: "%DOWNSTREAM_REMOTE_ADDRESS%"
user_agent: "%REQ(USER-AGENT)%"
x_request_id: "%REQ(X-REQUEST-ID)%"
注意: 生产环境中,Access Logs 的 I/O 开销不可忽视。建议使用异步日志(
access_log_flush_interval)或采样日志(SampledAccessLog)来平衡性能与可观测性。
4.3.2 关键日志字段与 SLO 关联
| 日志字段 | 对应 SLO | 用途 |
|---|---|---|
%DURATION% |
延迟 | 记录请求总耗时(毫秒),用于计算延迟分布 |
%RESPONSE_CODE% |
错误率 | 区分成功(2xx)、客户端错误(4xx)、服务端错误(5xx) |
%RESPONSE_FLAGS% |
错误率 / 延迟 | 标记 Envoy 内部错误(如 UO 上游超时、UF 连接失败) |
%UPSTREAM_CLUSTER% |
吞吐量 | 按目标服务聚合请求量,计算各集群 RPS |
4.4 指标采集架构总览
下图展示了从 Envoy 数据面到 SLO 计算平台的完整指标采集链路:
4.5 配置验证与常见问题
4.5.1 验证步骤
- 检查 Stats 端点: 访问
http://<envoy-admin>:9901/stats/prometheus,确认指标名称和标签符合预期。 - 验证 Access Logs: 发送测试请求,检查日志文件是否包含
duration、response_code、response_flags等字段。 - 端到端测试: 在 Prometheus 中查询
envoy_cluster_upstream_rq_time_bucket,确认直方图数据正常上报。
4.5.2 常见配置陷阱
- Stats 标签爆炸: 避免使用高基数标签(如
%REQ(X-REQUEST-ID)%)作为 Stats 标签,会导致 Prometheus 内存飙升。应将其保留在 Access Logs 中。 - Access Logs 性能: 高并发场景下,同步写入日志会阻塞 Envoy 事件循环。务必启用异步模式或使用采样。
- 直方图桶配置: 默认的延迟桶可能不匹配你的 SLO 目标。建议自定义
bucket_settings,覆盖关键阈值(如 100ms、200ms、500ms)。
4.6 本章小结
通过本章的学习,你已掌握:
- 如何为服务网格定义延迟、错误率、吞吐量三类 SLO。
- Envoy Stats 的 Prometheus 配置与关键指标名称。
- Envoy Access Logs 的结构化 JSON 配置与字段映射。
- 从数据面到 SLO 计算引擎的完整采集架构。