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 计算平台的完整指标采集链路:

Envoy 指标采集与 SLO 计算架构 Envoy 指标采集与 SLO 计算架构 Envoy Sidecar Stats (Prometheus) Access Logs (JSON) Prometheus Server Fluentd / Logstash SLO 计算引擎 (错误预算 / 燃烧率) 回滚护栏触发器 数据流说明: 1. Envoy Sidecar 通过 Stats 暴露延迟直方图、错误计数、请求总量等指标。 2. Access Logs 记录每个请求的详细上下文(耗时、状态码、响应标志)。 3. Prometheus 定期拉取 Stats,日志采集器转发 Access Logs 到 SLO 计算引擎。 4. SLO 引擎聚合数据,计算错误预算消耗速率,触发回滚护栏决策。

4.5 配置验证与常见问题

4.5.1 验证步骤

  1. 检查 Stats 端点: 访问 http://<envoy-admin>:9901/stats/prometheus,确认指标名称和标签符合预期。
  2. 验证 Access Logs: 发送测试请求,检查日志文件是否包含 duration、response_code、response_flags 等字段。
  3. 端到端测试: 在 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 计算引擎的完整采集架构。