4. 数据采集链路全景:从目标服务 → Exporter → Prometheus → 台账计算引擎的完整数据流

理解误差预算台账的生成,必须首先掌握数据从产生到最终聚合的完整链路。任何一个环节的异常(如Exporter挂起、Prometheus抓取超时、数据缺失)都会直接污染台账的准确性。本节将链路拆解为四个核心阶段,并逐一分析其数据形态与风险点。

4.1 链路四阶段总览

数据流从目标服务的内部指标出发,经过Exporter的格式转换、Prometheus的时序存储,最终进入台账计算引擎进行SLO聚合。下表概括了每个阶段的输入、输出与关键组件:

阶段 输入 处理组件 输出 典型协议/格式
1. 目标服务 应用内部状态(请求数、延迟、错误数) 应用代码 / 中间件 原始指标(Counter、Histogram、Gauge) 应用自定义埋点 / 框架自动采集
2. Exporter 原始指标(通过JMX、HTTP、DB查询等获取) Exporter进程(如node_exporter、custom_exporter) Prometheus兼容的Metrics端点(/metrics) Prometheus Exposition Format(文本/Protobuf)
3. Prometheus Exporter暴露的/metrics数据 Prometheus Server(抓取、存储、查询) 时序数据库(TSDB)中的时间序列 PromQL查询结果 / Remote Write
4. 台账计算引擎 Prometheus中的时序数据(通过PromQL或API) 台账服务(如自研计算器、Grafana、Thanos) 误差预算台账(SLO达成率、燃烧速率、剩余预算) JSON / 内部RPC / 数据库记录
关键认知: 误差预算台账的精度不会超过数据采集链路中最弱一环的精度。如果Exporter在5分钟内停止上报,即使Prometheus和计算引擎完全正常,台账也会出现5分钟的“数据黑洞”,导致预算计算失真。

4.2 阶段一:目标服务 → Exporter(数据源头的暴露)

目标服务本身并不直接暴露Prometheus格式的指标。它通过内部埋点(如Micrometer、Prometheus Client Library)记录请求总数、错误总数、延迟分布等原始数据。Exporter的作用是“桥接”:从目标服务的内部状态(如JMX MBeans、HTTP端点、日志文件、系统调用)中读取这些原始数据,并将其转换为Prometheus能够抓取的格式。

  • 数据形态: 目标服务内部通常是Counter(只增不减)、Histogram(分桶计数)、Gauge(可增可减)。
  • 风险点: Exporter与目标服务之间的连接中断、Exporter进程OOM、目标服务本身埋点缺失(如漏记错误请求)。
  • 典型场景: Java应用通过JMX Exporter暴露JVM指标;MySQL通过mysqld_exporter暴露查询延迟。

4.3 阶段二:Exporter → Prometheus(抓取与存储)

Prometheus Server按照配置的scrape_interval(通常为15s或30s)主动拉取Exporter的/metrics端点。这是链路中最关键的“心跳”环节。如果抓取失败(超时、返回非200状态码、数据格式错误),Prometheus会记录一次up == 0的告警,但不会重试该周期的数据。

# 典型的Prometheus抓取配置片段
scrape_configs:
  - job_name: 'my-app'
    scrape_interval: 15s
    scrape_timeout: 10s
    metrics_path: '/metrics'
    static_configs:
      - targets: ['192.168.1.100:8080']
  • 数据形态: 时间序列(metric_name + labels + timestamp + value)。
  • 风险点: 抓取超时(scrape_timeout < 实际响应时间)、目标服务重启导致时间戳跳跃、标签基数爆炸导致存储压力。
  • 影响台账: 一次抓取失败意味着该时间窗口内缺失一个数据点。对于基于rate()计算的SLO,缺失点会导致该周期内请求总数被低估,进而高估误差预算。

4.4 阶段三:Prometheus → 台账计算引擎(数据查询与聚合)

台账计算引擎通过PromQL查询Prometheus中的原始时序数据,执行SLO相关的聚合计算。例如,计算过去30天内的总请求数和总错误数,然后计算SLO达成率。这个阶段的数据流是“拉取”或“推送”两种模式:

  • 拉取模式: 台账引擎定期执行PromQL查询(如sum(rate(http_requests_total{job="my-app"}[5m])))。
  • 推送模式: Prometheus通过Remote Write将数据推送到台账引擎的中间存储(如Kafka、VictoriaMetrics)。
常见陷阱: 台账计算引擎的查询时间窗口必须与Prometheus的数据保留期对齐。如果Prometheus只保留15天数据,而台账需要计算30天SLO,则查询结果会不完整,导致预算计算错误。此外,PromQL中的rate()、increase()函数对数据缺失非常敏感——连续缺失两个抓取周期会导致函数返回0或异常值。

4.5 完整数据流SVG架构图

下图展示了从目标服务到台账计算引擎的完整数据流,并标注了每个环节的关键指标与潜在故障点:

数据采集链路全景架构图 数据采集链路全景:目标服务 → Exporter → Prometheus → 台账计算引擎 目标服务 内部埋点 Counter / Histogram 请求数、错误数、延迟 Exporter 桥接转换 /metrics 端点 Prometheus 格式 Prometheus 时序数据库 抓取 / 存储 / 查询 TSDB + PromQL 台账计算引擎 SLO聚合 预算计算 误差预算台账 JMX / HTTP / 日志 scrape_interval 15s PromQL / Remote Write 各环节典型故障点 目标服务故障 埋点缺失 / 进程崩溃 导致原始数据不完整 Exporter故障 OOM / 连接超时 /metrics 不可用 Prometheus故障 抓取超时 / 存储满 数据点缺失 台账引擎故障 查询超时 / 计算错误 预算台账不更新 数据流关键指标监控 • up{job="my-app"}:Exporter是否存活(1=正常,0=异常) • scrape_duration_seconds:每次抓取的耗时,超过scrape_timeout则失败 • prometheus_tsdb_head_series:当前活跃的时间序列数,用于监控标签基数

4.6 数据流中的关键指标与监控矩阵

为了快速定位采集链路中的异常,SRE团队需要建立针对每个环节的监控指标矩阵。下表列出了每个阶段的核心监控指标及其对误差预算的直接影响:

链路阶段 监控指标 正常范围 异常对台账的影响
目标服务 http_requests_total 增长率 与历史基线偏差 < 20% 请求数低估 → 预算高估
Exporter up 指标值 恒为 1 Exporter宕机 → 数据完全缺失 → 预算计算中断
Prometheus scrape_samples_scraped 与预期样本数一致 样本数减少 → 统计偏差 → 预算不准确
台账引擎 slo_budget_remaining 大于 0 计算错误 → 预算值异常跳变
实践建议: 在Prometheus中配置alerting规则,当up == 0持续超过2个抓取周期时立即告警。同时,在台账计算引擎中实现“数据完整性校验”:如果最近5分钟内的数据点缺失率超过10%,则暂停预算更新并标记台账为“数据不可靠”状态。

4.7 数据流异常对误差预算的传导效应

为了更直观地理解链路异常如何影响最终台账,下图展示了一个典型的“Exporter短暂宕机”场景,以及该异常如何通过数据流逐级传导至误差预算:

异常传导效应图 异常传导效应:Exporter宕机 → 误差预算失真 T0 T1 (Exporter宕机) T2 (Prometheus抓取失败) T3 (台账计算失真) 正常采集 Exporter宕机 数据缺失 预算高估 传导效应详解 1. Exporter宕机导致Prometheus抓取返回up=0,该时间窗口内的请求数和错误数均为0。 2. 台账引擎计算rate()时,缺失窗口被忽略,导致总请求数被低估,错误率被低估。 3. 最终误差预算显示“剩余预算高于实际”,运维团队可能错误地认为系统健康,从而延迟故障响应。