Exporter 链路基础:Prometheus Exporter 架构、数据采集流程与常见类型

在可观测性体系中,Exporter 是 Prometheus 生态的“传感器层”。它负责将目标系统的内部状态(如 CPU 使用率、HTTP 响应码、数据库连接数)转换为 Prometheus 能够抓取的指标格式。理解 Exporter 的架构与采集流程,是构建自愈剧本、定位链路故障的第一步。

1. Exporter 核心架构

Exporter 本质上是一个独立的 HTTP 服务进程,通常与被监控目标部署在同一台主机或同一网络命名空间内。其内部架构遵循“采集 → 聚合 → 暴露”的管道模型。

架构要点: Exporter 不主动推送数据,而是等待 Prometheus Server 按配置的 scrape_interval 来拉取(Pull)。这种拉取模式降低了网络风暴风险,并使得故障定位更清晰——如果抓取失败,问题要么在 Exporter 本身,要么在网络链路上。
Prometheus Exporter 内部架构与数据采集流 Exporter 内部架构与数据采集流 目标系统 (OS / App / DB) 采集器 Collector (指标抓取与转换) 指标注册表 Registry (指标存储与聚合) HTTP Handler (/metrics 端点) Prometheus Server (拉取 /metrics) 系统调用 注册指标 序列化 HTTP GET 💡 拉取模型优势:Exporter 无状态,Prometheus 控制采集节奏;Exporter 崩溃不影响 Prometheus 已有数据。 故障自愈关注点:Collector 挂死、Registry 内存泄漏、HTTP Handler 超时。

2. 数据采集流程详解

一次完整的 Exporter 指标采集,从 Prometheus 发起 HTTP 请求到指标入库,经历以下 5 个阶段:

阶段 组件 关键动作 故障风险点
1. 调度 Prometheus Server 根据 scrape_config 定时发起 HTTP GET 请求 网络超时、DNS 解析失败
2. 采集 Exporter Collector 调用系统 API 或读取文件获取原始数据 系统调用阻塞、文件句柄泄漏
3. 转换 Exporter Collector 将原始数据转为 Prometheus 指标格式(Gauge/Counter/Histogram) 类型转换错误、标签基数爆炸
4. 暴露 HTTP Handler 在 /metrics 端点返回 text/plain 格式指标 内存溢出、响应体过大导致 OOM
5. 入库 Prometheus TSDB 解析响应、校验标签、写入时序数据库 数据格式错误、标签冲突
自愈切入点: 阶段 2 和阶段 4 是 Exporter 侧最常见的故障点。例如,Node Exporter 在读取 /proc/stat 时如果遇到 I/O 抖动,会导致采集超时;Blackbox Exporter 在探测目标时如果 DNS 解析卡死,会导致 HTTP Handler 无法返回。自愈剧本应优先监控这两个阶段的耗时与错误率。

3. 常见 Exporter 类型与选型对比

Prometheus 社区维护了超过 200 种 Exporter。在生产环境中,以下 4 类 Exporter 覆盖了 90% 以上的监控场景:

Exporter 名称 监控目标 核心指标示例 典型端口 故障特征
Node Exporter Linux/Windows 主机 node_cpu_seconds_total, node_memory_MemAvailable_bytes 9100 文件系统挂载点失效、磁盘 I/O 高导致采集延迟
Blackbox Exporter 网络端点(HTTP/HTTPS/TCP/ICMP) probe_success, probe_duration_seconds 9115 DNS 解析超时、TLS 证书过期、ICMP 被防火墙拦截
cAdvisor 容器与 Pod 资源 container_cpu_usage_seconds_total, container_memory_usage_bytes 4194 容器频繁重启导致指标标签抖动、cgroup 读取权限不足
MySQL Exporter MySQL/MariaDB 数据库 mysql_global_status_threads_connected, mysql_global_status_queries 9104 数据库连接池耗尽、慢查询导致采集阻塞

4. Exporter 链路故障分类

基于上述架构与流程,Exporter 链路故障可归纳为以下 3 类:

  • 采集层故障: Collector 无法读取目标数据(如 /proc 文件损坏、数据库连接失败)。表现为指标缺失或全部为 0。
  • 暴露层故障: HTTP Handler 无法正常响应(如端口被占用、内存溢出导致进程 OOMKilled)。表现为 /metrics 返回 5xx 或连接超时。
  • 网络层故障: Prometheus 到 Exporter 的网络链路中断(如防火墙规则变更、容器网络策略限制)。表现为 up{job="..."} == 0。
Exporter 链路故障分类与影响 Exporter 链路故障分类与影响 采集层故障 Collector 挂死 / 数据源不可用 暴露层故障 HTTP Handler 超时 / OOM 网络层故障 防火墙 / DNS / 容器网络策略 影响结果 指标缺失 → 告警静默 → MTTR 延长 → 业务受损

5. 自愈剧本的 Exporter 健康检查基线

在编写自愈剧本之前,需要先建立 Exporter 的健康检查基线。以下是最低检查清单:

# 1. 进程存活检查
pgrep -x node_exporter || systemctl restart node_exporter

# 2. HTTP 端点可达性检查
curl -s -o /dev/null -w "%{http_code}" http://localhost:9100/metrics
# 期望返回 200

# 3. 指标新鲜度检查(通过 PromQL)
# 在 Prometheus 中执行:
#   time() - node_exporter_build_info{job="node"} > 60
# 如果结果 > 60 秒,说明 Exporter 已停止更新指标

# 4. 资源使用检查
# 内存:ps -o rss= -p $(pgrep node_exporter)  # 超过 500MB 视为异常
# CPU:ps -o %cpu= -p $(pgrep node_exporter)   # 持续 > 80% 视为异常
常见陷阱: 仅检查进程存活是不够的。进程可能仍在运行,但 Collector 线程已死锁(表现为 /metrics 返回空数据或旧数据)。自愈剧本必须同时检查 HTTP 响应状态码和指标时间戳新鲜度。