4、Exporter 概念与原理

Exporter 是 Prometheus 生态中负责将非原生指标转换为 Prometheus 可采集格式的中间代理程序。理解 Exporter 的作用、数据模型与四种核心 Metrics 类型,是构建可靠采集环境的基础。

4.1 Exporter 的作用

Prometheus 采用“拉取(Pull)”模式采集指标,但大多数业务系统、中间件或硬件设备并不直接暴露 Prometheus 格式的 HTTP /metrics 端点。Exporter 充当适配器,完成以下三项核心任务:

  • 协议转换:将 JMX、SNMP、SQL、自定义日志等异构数据源转换为 Prometheus 文本格式。
  • 指标暴露:在指定端口(通常为 9100、9308 等)启动 HTTP 服务,响应 Prometheus Server 的 /metrics 请求。
  • 状态映射:将源系统的运行状态(如连接数、错误率、队列深度)映射为 Prometheus 的四种标准 Metrics 类型。
关键原则:Exporter 只负责“采集与转换”,不负责告警、存储或可视化。每个 Exporter 应保持无状态、轻量级,并遵循 Prometheus 的命名规范与标签设计。

4.2 Exporter 数据模型

Prometheus 的数据模型以 Metric Name 和 Labels 为核心标识。Exporter 输出的每个样本点由以下三部分组成:

组成部分 说明 示例
Metric Name 描述指标含义的字符串,遵循 [a-zA-Z_:][a-zA-Z0-9_:]* node_cpu_seconds_total
Labels 键值对集合,用于维度区分;每个时间序列由 Metric Name + Labels 唯一确定 {mode="user", cpu="0"}
Sample Value 当前时间点的数值(float64) 1234.56

Exporter 在输出时必须保证 Metric Name 符合规范,标签数量可控(避免高基数爆炸),且时间戳由 Prometheus Server 在拉取时自动附加。

4.3 四种核心 Metrics 类型

Prometheus 客户端库定义了四种标准指标类型。Exporter 必须根据指标语义选择正确的类型,否则会导致查询语义错误或聚合失真。

4.3.1 Counter(计数器)

  • 语义:只增不减的累计值,系统重启后归零。
  • 适用场景:请求总数、错误总数、CPU 时间累计、字节发送总量。
  • 典型操作:rate()、increase()。
  • 示例:http_requests_total{method="GET", status="200"} 1024

4.3.2 Gauge(仪表盘)

  • 语义:可增可减的瞬时值,反映当前状态。
  • 适用场景:内存使用量、当前连接数、温度、队列长度。
  • 典型操作:avg()、max()、min()。
  • 示例:node_memory_MemAvailable_bytes 8.64e+09

4.3.3 Histogram(直方图)

  • 语义:对观测值进行分桶计数,同时记录总和与总次数。
  • 适用场景:请求延迟、响应大小、执行耗时分布。
  • 自动生成序列:_bucket{le="..."}、_sum、_count。
  • 典型操作:histogram_quantile() 计算分位数。
  • 示例:http_request_duration_seconds_bucket{le="0.5"} 240

4.3.4 Summary(摘要)

  • 语义:在客户端直接计算分位数,同时暴露 _sum 和 _count。
  • 适用场景:已知分位数需求(如 P99),且希望减少服务端计算开销。
  • 自动生成序列:{quantile="0.5"}、{quantile="0.9"}、{quantile="0.99"}、_sum、_count。
  • 典型操作:直接读取分位数,无法在服务端聚合。
  • 示例:rpc_duration_seconds{quantile="0.99"} 1.5
选型建议:需要服务端灵活计算分位数(如动态调整分位点)时使用 Histogram;分位数固定且客户端计算更高效时使用 Summary。Gauge 和 Counter 的选择标准是“是否只增不减”。

4.4 Metrics 类型对比表

特性 Counter Gauge Histogram Summary
增减方向 只增 可增可减 只增(桶计数) 只增(计数/总和)
分位数计算位置 — — 服务端 客户端
是否可聚合 是 是 是(桶可合并) 否(分位数不可聚合)
典型函数 rate() avg() histogram_quantile() 直接读取
数据量 低 低 中(桶数×标签) 中(分位数×标签)

4.5 Exporter 指标暴露流程

下图展示了一个典型 Exporter 从数据源采集到 Prometheus 拉取的完整链路:

Exporter 指标暴露流程 Exporter 指标暴露流程 数据源 JMX / SNMP / SQL / 日志 Exporter 适配器 协议转换 + 类型映射 HTTP /metrics 端点 Prometheus Server Pull /metrics 采集 拉取 Exporter 输出示例(/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="user"} 12345.67 node_memory_MemAvailable_bytes 8.64e+09

4.6 实战:Exporter 输出与类型验证

以 Node Exporter 为例,通过 curl 验证其输出格式与 Metrics 类型:

# 拉取 Node Exporter 指标
curl -s http://localhost:9100/metrics | head -30

# 输出片段(注意 HELP 与 TYPE 行)
# 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"} 2.345678e+06
node_cpu_seconds_total{cpu="0",mode="system"} 1.234567e+05

# HELP node_memory_MemAvailable_bytes Memory information field MemAvailable_bytes.
# TYPE node_memory_MemAvailable_bytes gauge
node_memory_MemAvailable_bytes 8.64e+09
常见陷阱:Exporter 必须为每个 Metric 显式声明 # TYPE 行,否则 Prometheus Server 默认将其视为无类型(Untyped),导致 rate() 或 histogram_quantile() 等函数无法正确执行。生产环境中应使用 promtool check metrics 验证 Exporter 输出合规性。

4.7 小结