2. 指标采集链路全景:从目标系统到 Prometheus Server 的完整数据流

在排查指标采集故障或校准误差预算台账之前,必须对采集链路中每一个环节的数据形态、传输协议和时序逻辑有精确理解。本节将拆解从目标系统内部指标产生,到 Prometheus Server 完成数据持久化的完整路径,并重点剖析 Exporter 暴露端口与 /metrics 端点的工作机制,以及 Server 端抓取(Scrape)的详细流程。

2.1 完整数据流:四阶段模型

指标数据从产生到入库,经历四个逻辑阶段。每个阶段都可能引入数据丢失、延迟或精度偏差,是故障排查与误差校准的关键检查点。

核心原则: 误差预算台账的校准,必须覆盖从“指标源头”到“存储后端”的全链路,而非仅关注 Prometheus Server 的抓取成功率。
指标采集链路四阶段全景 阶段 1:目标系统 应用进程 / 操作系统 内部状态计数器 暴露 阶段 2:Exporter 端口 :9100 /metrics 端点 抓取 阶段 3:Server HTTP 接收 / 解析 样本暂存 写入 TSDB 持久化 各阶段典型误差源 • 阶段1(目标系统):计数器重置、采样窗口抖动、内部精度截断 • 阶段2(Exporter):采集超时、指标缓存过期、类型转换错误 • 阶段3(Server):抓取间隔抖动、样本重复、时间戳对齐偏差 • 阶段4(TSDB):压缩合并丢失、WAL 回放延迟、存储满拒绝写入 链路健康度关键指标(用于误差预算) • scrape_duration_seconds:抓取耗时,超过 scrape_timeout 直接失败 • up{job="..."}:Exporter 可达性,0 表示抓取失败 • scrape_samples_scraped:每次抓取返回的样本数,用于校验数据完整性

2.2 Exporter 暴露端口与 /metrics 端点

Exporter 是目标系统与 Prometheus Server 之间的“翻译层”。它通过一个独立的 HTTP 服务将内部状态转换为 Prometheus 可识别的文本格式。

2.2.1 端口绑定与监听

  • 默认端口: 每个官方 Exporter 有约定端口(如 node_exporter 使用 :9100,blackbox_exporter 使用 :9115)。
  • 自定义端口: 通过启动参数 --web.listen-address=":9200" 可修改。
  • 多实例部署: 同一主机可运行多个 Exporter 实例,但端口必须唯一,否则端口冲突导致启动失败。

2.2.2 /metrics 端点响应格式

Prometheus Server 通过 HTTP GET 请求 http://<exporter_host>:<port>/metrics 获取数据。响应体为纯文本,遵循以下结构:

# HELP node_cpu_seconds_total Seconds the CPUs spent in each mode.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="0",mode="idle"} 283910.45
node_cpu_seconds_total{cpu="0",mode="system"} 8472.13
# HELP node_memory_MemTotal_bytes Memory information field MemTotal_bytes.
# TYPE node_memory_MemTotal_bytes gauge
node_memory_MemTotal_bytes 16625385472
行类型 格式 说明
HELP # HELP <metric_name> <doc_string> 指标描述,可选,Prometheus 解析时忽略
TYPE # TYPE <metric_name> <metric_type> 声明指标类型(counter / gauge / histogram / summary)
样本行 <metric_name>{<labels>} <value> [<timestamp>] 实际数据点,时间戳可选(默认使用 Server 接收时间)
常见故障点: 如果 Exporter 返回的 TYPE 声明与样本行不匹配(例如将 counter 类型指标返回为 gauge),Prometheus Server 会拒绝该样本并记录错误日志。这是台账数据不准的隐蔽来源。

2.3 抓取(Scrape)机制详解

抓取是 Prometheus Server 主动发起的 HTTP 请求,是采集链路中控制逻辑最复杂的环节。理解其内部状态机,是定位“抓取失败”和“数据空洞”的基础。

2.3.1 抓取生命周期

  1. 调度触发: 基于 scrape_interval(默认 15s)定时器触发抓取任务。
  2. DNS 解析: 将 __address__ 标签中的主机名解析为 IP 地址。
  3. HTTP 请求: 向 http://<ip>:<port>/metrics 发送 GET 请求,设置 scrape_timeout 超时。
  4. 响应读取: 读取 HTTP 响应体,逐行解析样本。
  5. 标签注入: 将配置中的 relabel_configs 和 metric_relabel_configs 应用到样本。
  6. 样本暂存: 解析后的样本写入 Head Block(内存中的最新数据区域)。
  7. 健康上报: 更新 up 指标(1=成功,0=失败)和 scrape_duration_seconds。

2.3.2 抓取配置关键参数

参数 默认值 对误差预算的影响
scrape_interval 15s 间隔越大,数据粒度越粗,SLO 计算窗口内的样本数越少
scrape_timeout 10s 超过此时间未收到完整响应则放弃,产生数据空洞
honor_labels false 若为 false,Server 会重写 Exporter 暴露的标签,可能导致台账标签丢失
sample_limit 0(无限制) 超过限制时丢弃多余样本,台账数据不完整

2.3.3 抓取失败重试与退避

Prometheus 对抓取失败不进行重试。一次超时或 HTTP 错误(如 500、503)直接导致该周期数据丢失,直到下一个 scrape_interval 触发。这种“无重试”设计是为了避免级联雪崩,但也意味着:

  • 网络抖动超过 scrape_timeout 就会产生数据空洞。
  • 误差预算台账必须将“抓取失败次数 × scrape_interval”计入不可用时间。
抓取状态机与故障路径 等待调度 HTTP 请求 解析样本 抓取失败 写入 Head Block 超时 / HTTP 错误 等待下一周期

2.4 链路故障排查要点

实战建议: 在搭建误差预算台账时,建议为每个目标系统建立“采集链路健康仪表盘”,包含以下四个核心面板:
  • 可达性面板: up{job="..."} 时间序列,标记所有 0 值的时间段。
  • 延迟面板: scrape_duration_seconds 的 P99 与 scrape_timeout 对比。
  • 样本量面板: scrape_samples_scraped 的突变检测,突然下降可能表示 Exporter 内部故障。
  • 错误日志面板: Prometheus Server 的 target_scrape_pool_exceeded_sample_limit_total 等指标。

通过本节对采集链路全景的拆解,可以明确:误差预算台账的校准不能仅依赖 up 指标,必须结合 scrape_duration_seconds、scrape_samples_scraped 以及 Exporter 端点的响应质量进行综合判断。下一环节将深入 Exporter 内部实现,分析指标采集与转换过程中的精度损失点。