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 拉取的完整链路:
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 输出合规性。