Skip to main content
☘️ Septvean's Documents
Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

Prometheus 核心概念

一、什么是 Exporter?

Exporter = 指标采集适配器

一句话:

Exporter 负责把“被监控对象的状态”转换成 Prometheus 能理解的 /metrics 格式。

Prometheus 不会主动采集系统指标,它只会:

HTTP GET /metrics

Exporter 就是这个 /metrics 的提供者。

二、Exporter 的工作模式

2.1 基本流程

[系统 / 应用 / 中间件]
      Exporter
          ↓  /metrics (HTTP)
     Prometheus

Prometheus 定期 Pull Exporter 的 /metrics。

2.2 Exporter 的两种形态

类型 说明 示例
独立进程 单独运行的 exporter node_exporter
内嵌 SDK 应用自身暴露指标 Python/Java SDK

三、Prometheus 官方与常见 Exporter

3.1 系统与基础设施

Exporter 说明 端口
node_exporter Linux 服务器 CPU/内存/磁盘 9100
windows_exporter Windows 主机 9182
blackbox_exporter HTTP/TCP/ICMP 探测 9115

3.2 数据库

Exporter 说明
mysqld_exporter MySQL
postgres_exporter PostgreSQL
mongodb_exporter MongoDB
redis_exporter Redis
elasticsearch_exporter ES

3.3 中间件 & 服务

Exporter 说明
nginx_exporter Nginx
kafka_exporter Kafka
rabbitmq_exporter RabbitMQ
zookeeper_exporter ZooKeeper
haproxy_exporter HAProxy

3.4 容器 & Kubernetes

Exporter 说明
cAdvisor 容器资源
kube-state-metrics K8S 资源状态
kubelet metrics Pod/Node 指标

四、Exporter 输出格式(非常重要)

4.1 文本格式(Prometheus Exposition Format)

示例:

# 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"} 12345.67

包含:

  • # HELP:指标说明
  • # TYPE:指标类型
  • metric + labels + value

4.2 指标命名规范

规则
名称 小写 + 下划线
单位 _seconds _bytes _total
语义 只描述“是什么”

五、Exporter 配置与 Prometheus 集成

5.1 Prometheus 配置示例

scrape_configs:
  - job_name: 'node'
    static_configs:
      - targets:
        - 10.0.0.1:9100
        - 10.0.0.2:9100

5.2 Exporter 健康检查

curl http://localhost:9100/metrics | head

六、Exporter 设计原则

6.1 Exporter 不做什么?

  • ❌ 不存储数据
  • ❌ 不做聚合
  • ❌ 不做告警
  • ❌ 不推送数据

6.2 Exporter 应该做什么?

  • ✅ 快速采集
  • ✅ 暴露真实状态
  • ✅ 标签稳定
  • ✅ 低开销

七、高基数(High Cardinality)问题

7.1 Exporter 是高基数的源头

错误示例:

request_duration_seconds{url="/user/12345"}

正确示例:

request_duration_seconds{handler="/user/:id"}

7.2 Exporter 层面解决方法

  • 控制 label 数量
  • label 只表示维度,不表示实例
  • 关闭不必要的 metrics
  • 使用 –collector.disable-defaults

八、Pushgateway 与 Exporter 的关系

对比 Exporter Pushgateway
模式 Pull Push
场景 长期服务 短任务
自动清理
是否推荐 ⚠️ 仅特定场景

九、自定义 Exporter(实战)

9.1 Python 自定义 Exporter

from prometheus_client import start_http_server, Gauge
import time

cpu_temp = Gauge('cpu_temp_celsius', 'CPU temperature')

start_http_server(8000)

while True:
    cpu_temp.set(55.3)
    time.sleep(5)

9.2 Go 自定义 Exporter(生产首选)

prometheus.NewGaugeFunc(
  prometheus.GaugeOpts{
    Name: "app_status",
    Help: "Application status",
  },
  func() float64 {
    return 1
  },
)

十、Exporter 常见问题(运维必会)

10.1 Exporter 指标突然消失

  • 程序重启
  • 指标名称变更
  • label 变化导致新 series

10.2 Exporter 导致 Prometheus OOM

  • 高基数 label
  • histogram bucket 过多
  • exporter bug 无限暴露新指标

10.3 Exporter 本身 CPU 高

  • 采集逻辑过重
  • scrape interval 太短
  • 并发过高

十一、Exporter 最佳实践总结

一指标 = 一事实

标签 = 维度,不是数据

少即是多

先设计指标,再写代码

任何 exporter 都要限制 cardinality

十二、总结

Exporter 的职责是 暴露真实、稳定、低基数的指标接口

Prometheus 通过 Pull 模式周期性采集

指标设计的好坏,直接决定整个监控系统是否可用