Exporter 链路基础:Prometheus Exporter 架构、数据采集流程与常见类型
在可观测性体系中,Exporter 是 Prometheus 生态的“传感器层”。它负责将目标系统的内部状态(如 CPU 使用率、HTTP 响应码、数据库连接数)转换为 Prometheus 能够抓取的指标格式。理解 Exporter 的架构与采集流程,是构建自愈剧本、定位链路故障的第一步。
1. Exporter 核心架构
Exporter 本质上是一个独立的 HTTP 服务进程,通常与被监控目标部署在同一台主机或同一网络命名空间内。其内部架构遵循“采集 → 聚合 → 暴露”的管道模型。
架构要点: Exporter 不主动推送数据,而是等待 Prometheus Server 按配置的
scrape_interval 来拉取(Pull)。这种拉取模式降低了网络风暴风险,并使得故障定位更清晰——如果抓取失败,问题要么在 Exporter 本身,要么在网络链路上。
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。
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 响应状态码和指标时间戳新鲜度。