2. Exporter 基础回顾:Prometheus Exporter 的工作原理与常见类型

在构建数据采集异常自愈剧本之前,必须深入理解 Exporter 的本质。Exporter 是 Prometheus 生态中负责“数据采集与转换”的代理组件,它将被监控系统的内部指标暴露为 Prometheus 能够抓取的 HTTP 端点。本章将系统梳理 Exporter 的工作原理、核心生命周期以及生产环境中最常见的 Exporter 类型。

2.1 Prometheus Exporter 的工作原理

Exporter 的核心职责是“适配与转换”。它通过特定协议与目标系统通信,获取原始状态数据,然后按照 Prometheus 的指标格式(Metric Format)进行重组,最后通过 HTTP 服务端等待 Prometheus Server 的拉取请求。

核心工作流程: 采集 → 转换 → 暴露 → 响应拉取。

下图展示了 Exporter 在 Prometheus 架构中的位置及其内部数据流:

Exporter 工作原理与数据流 目标系统 (OS / 应用 / 硬件) 原始状态数据 采集适配层 协议解析 / 系统调用 数据清洗 / 单位转换 指标聚合 指标注册与暴露 注册 Metric 描述 格式化为 Prometheus 文本 绑定 /metrics 端点 Prometheus Server HTTP GET /metrics 关键特性 • 无状态设计 • 被动等待拉取
关键理解: Exporter 本身不主动推送数据,而是将指标数据以标准格式暴露在 /metrics 端点,等待 Prometheus Server 按配置的时间间隔来拉取。这种“拉取模型”是 Prometheus 架构的核心特征。

2.2 Exporter 的指标生命周期

每个 Exporter 暴露的指标都遵循 Prometheus 的四种核心指标类型。理解这些类型对于后续编写自愈剧本中的异常检测条件至关重要。

指标类型 描述 典型示例 自愈场景关注点
Counter 只增不减的累计计数器 node_network_receive_bytes_total 速率突降或归零(采集中断)
Gauge 可增可减的瞬时值 node_memory_MemAvailable_bytes 数值突变、缺失或超出阈值
Histogram 分桶统计的分布数据 http_request_duration_seconds_bucket 桶数据不更新或累积异常
Summary 分位数统计 http_request_duration_seconds_summary 分位数计算停滞

2.3 常见 Exporter 类型与适用场景

生产环境中,Exporter 的种类繁多,覆盖从操作系统到中间件、从硬件到云服务的各个层面。以下是运维场景中最核心的几种 Exporter:

选型原则: 每个被监控的目标系统都应有一个专用的 Exporter 负责适配,避免使用通用脚本替代专用 Exporter,否则会丧失指标规范性和稳定性。

2.3.1 Node Exporter(主机级监控)

Node Exporter 是部署最广泛的 Exporter,用于采集 Linux/Unix 主机的操作系统级指标,包括 CPU、内存、磁盘、网络、文件系统、进程等。它通过读取 /proc、/sys 等虚拟文件系统获取数据。

  • 默认端口: 9100
  • 核心指标: node_cpu_seconds_total、node_memory_MemTotal_bytes、node_disk_io_time_seconds_total
  • 自愈关注点: 进程挂掉、端口不可达、指标数据陈旧、文件系统句柄泄漏

2.3.2 Blackbox Exporter(网络探测)

Blackbox Exporter 通过主动探测(Probe)的方式检查目标服务的可达性和响应质量,支持 HTTP、HTTPS、TCP、ICMP、DNS 等协议。它不直接采集内部指标,而是从外部视角评估服务状态。

  • 默认端口: 9115
  • 核心指标: probe_success、probe_duration_seconds、probe_http_status_code
  • 自愈关注点: 探测超时、状态码异常、证书过期、DNS 解析失败

2.3.3 其他常用 Exporter

Exporter 名称 监控目标 默认端口 典型指标示例
cAdvisor 容器(Docker / Kubernetes) 8080 container_cpu_usage_seconds_total
MySQL Exporter MySQL / MariaDB 数据库 9104 mysql_global_status_threads_connected
Nginx Exporter Nginx 反向代理 9113 nginx_connections_active
Redis Exporter Redis 缓存 9121 redis_memory_used_bytes
JMX Exporter Java 应用(JVM) 自定义 jvm_memory_bytes_used

2.4 Exporter 的部署模式与高可用考量

Exporter 的部署方式直接影响数据采集的稳定性。在生产环境中,通常采用以下两种模式:

  • Sidecar 模式: 在 Kubernetes Pod 中与主容器共享网络命名空间,Exporter 作为辅助容器运行,采集主容器的应用指标。
  • 独立进程模式: 在物理机或虚拟机中作为系统服务运行,通过 systemd 或 supervisor 管理,采集主机级或中间件指标。
常见陷阱: 很多自愈剧本失效的根本原因在于 Exporter 本身已经异常(如进程僵死、端口被占用、指标格式错误),但 Prometheus Server 仍然能建立 TCP 连接,导致“假活”现象。因此,自愈剧本必须同时检测 Exporter 进程状态和指标数据新鲜度。
常见 Exporter 类型与监控层次 应用层 Exporter JMX Exporter (Java) Nginx Exporter Redis / MySQL Exporter 容器与编排层 cAdvisor (容器指标) Kubelet / kube-state-metrics Kubernetes 集群状态 基础设施层 Node Exporter (OS) Blackbox Exporter (网络) SNMP Exporter (网络设备) 自愈剧本覆盖范围 每一层 Exporter 都可能出现进程挂掉、端口不可达、指标数据陈旧、采集超时等异常 自愈剧本需要针对不同 Exporter 类型设计差异化的健康检查与恢复策略

2.5 Exporter 数据采集异常分类

在进入自愈剧本设计之前,需要明确 Exporter 数据采集异常的常见类型。这些异常是后续剧本触发条件的核心依据。

异常类型 表现 可能原因 检测方式
进程异常 Exporter 进程退出或僵死 OOM、配置错误、依赖库缺失 systemd 状态、进程列表
端口不可达 Prometheus 抓取超时或连接拒绝 端口被占用、防火墙规则、Exporter 未启动 TCP 端口探测
指标数据陈旧 指标时间戳长时间未更新 Exporter 内部采集循环阻塞、目标系统无响应 PromQL 时间戳差值检测
指标格式错误 HTTP 返回非 200 或内容解析失败 Exporter 版本不兼容、指标注册冲突 HTTP 状态码 + 内容校验
资源耗尽 Exporter 自身 CPU/内存飙升 采集目标过多、内存泄漏、高并发抓取 Exporter 自身资源监控
自愈剧本设计起点: 上述五种异常类型中,“指标数据陈旧”和“端口不可达”是自愈剧本最常处理的场景,因为它们可以通过重启 Exporter 进程或重新加载配置快速恢复。而“指标格式错误”通常需要版本回退或配置修复,属于更复杂的恢复流程。