Prometheus 核心概念
Exporter = 指标采集适配器
一句话:
Exporter 负责把“被监控对象的状态”转换成 Prometheus 能理解的 /metrics 格式。
Prometheus 不会主动采集系统指标,它只会:
HTTP GET /metrics
Exporter 就是这个 /metrics 的提供者。
[系统 / 应用 / 中间件]
↓
Exporter
↓ /metrics (HTTP)
Prometheus
Prometheus 定期 Pull Exporter 的 /metrics。
| 类型 | 说明 | 示例 |
|---|---|---|
| 独立进程 | 单独运行的 exporter | node_exporter |
| 内嵌 SDK | 应用自身暴露指标 | Python/Java SDK |
| Exporter | 说明 | 端口 |
|---|---|---|
| node_exporter | Linux 服务器 CPU/内存/磁盘 | 9100 |
| windows_exporter | Windows 主机 | 9182 |
| blackbox_exporter | HTTP/TCP/ICMP 探测 | 9115 |
| Exporter | 说明 |
|---|---|
| mysqld_exporter | MySQL |
| postgres_exporter | PostgreSQL |
| mongodb_exporter | MongoDB |
| redis_exporter | Redis |
| elasticsearch_exporter | ES |
| Exporter | 说明 |
|---|---|
| nginx_exporter | Nginx |
| kafka_exporter | Kafka |
| rabbitmq_exporter | RabbitMQ |
| zookeeper_exporter | ZooKeeper |
| haproxy_exporter | HAProxy |
| Exporter | 说明 |
|---|---|
| cAdvisor | 容器资源 |
| kube-state-metrics | K8S 资源状态 |
| kubelet metrics | Pod/Node 指标 |
示例:
# 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
| 项 | 规则 |
|---|---|
| 名称 | 小写 + 下划线 |
| 单位 | _seconds _bytes _total |
| 语义 | 只描述“是什么” |
scrape_configs:
- job_name: 'node'
static_configs:
- targets:
- 10.0.0.1:9100
- 10.0.0.2:9100
curl http://localhost:9100/metrics | head
- ❌ 不存储数据
- ❌ 不做聚合
- ❌ 不做告警
- ❌ 不推送数据
- ✅ 快速采集
- ✅ 暴露真实状态
- ✅ 标签稳定
- ✅ 低开销
错误示例:
request_duration_seconds{url="/user/12345"}
正确示例:
request_duration_seconds{handler="/user/:id"}
- 控制 label 数量
- label 只表示维度,不表示实例
- 关闭不必要的 metrics
- 使用 –collector.disable-defaults
| 对比 | Exporter | Pushgateway |
|---|---|---|
| 模式 | Pull | Push |
| 场景 | 长期服务 | 短任务 |
| 自动清理 | 有 | 无 |
| 是否推荐 | ✅ | ⚠️ 仅特定场景 |
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)
prometheus.NewGaugeFunc(
prometheus.GaugeOpts{
Name: "app_status",
Help: "Application status",
},
func() float64 {
return 1
},
)
- 程序重启
- 指标名称变更
- label 变化导致新 series
- 高基数 label
- histogram bucket 过多
- exporter bug 无限暴露新指标
- 采集逻辑过重
- scrape interval 太短
- 并发过高
一指标 = 一事实
标签 = 维度,不是数据
少即是多
先设计指标,再写代码
任何 exporter 都要限制 cardinality
Exporter 的职责是 暴露真实、稳定、低基数的指标接口
Prometheus 通过 Pull 模式周期性采集
指标设计的好坏,直接决定整个监控系统是否可用