Prometheus Exporter 与指标设计
Exporter 将主机、数据库、中间件或第三方 API 的状态转换为 Prometheus 文本格式,并在 HTTP /metrics 暴露。Prometheus 负责抓取,Exporter 不应承担复杂的聚合、告警或长期存储职责。
1. 工作原理与数据格式
目标系统 --> Exporter --> /metrics --> Prometheus scrape --> TSDB
Exporter 通常调用系统接口、数据库只读查询或中间件管理 API,并输出 Counter、Gauge、Histogram 等样本。Exporter 账号应只拥有读取监控所需的最小权限,指标端口只对 Prometheus 或受信网络开放。
# HELP process_cpu_seconds_total Total user and system CPU time spent in seconds.
# TYPE process_cpu_seconds_total counter
process_cpu_seconds_total 42.17
2. Node Exporter
Node Exporter 采集 Linux 主机 CPU、内存、文件系统、磁盘、网络和内核指标。通过 systemd 或容器部署时,端口默认是 9100,应限制 Prometheus 访问来源。
| 维度 | 常用指标 | 关注点 |
|---|---|---|
| CPU | node_cpu_seconds_total | 使用 rate() 计算忙碌比例,区分 idle、iowait、system |
| 内存 | node_memory_MemAvailable_bytes | 优先使用可用内存,不把 page cache 直接视作故障 |
| 磁盘 | node_filesystem_avail_bytes | 排除 tmpfs,按挂载点检查空间与 inode |
| 磁盘 I/O | node_disk_* | IOPS、吞吐、队列与延迟需结合设备类型分析 |
| 网络 | node_network_* | 接收/发送速率、错误、丢包与网卡状态 |
# 节点 CPU 使用率
100 - avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100
# 根分区使用率
100 * (1 - node_filesystem_avail_bytes{mountpoint="/",fstype!~"tmpfs|overlay"}
/ node_filesystem_size_bytes{mountpoint="/",fstype!~"tmpfs|overlay"})
3. 常用 Exporter
| Exporter | 典型监控目标 | 最小权限与注意事项 |
|---|---|---|
| mysqld_exporter | 连接、慢查询、复制、InnoDB | 使用专用只读监控账号,避免暴露 SQL 文本 |
| redis_exporter | 内存、命中率、复制、连接 | 使用 ACL 最小权限,保护 Redis 密码 |
| kafka_exporter / JMX Exporter | Broker、Topic、Consumer Lag | 控制 Topic/Consumer 标签基数,保护 JMX 端口 |
| blackbox_exporter | HTTP、TCP、ICMP、DNS 探测 | 仅探测授权目标,设置模块超时与出口网络策略 |
| kube-state-metrics | Kubernetes 对象状态 | 区分对象期望状态与真实资源使用量 |
Exporter 版本、采集器开关和指标名称会变化。上线前先在 /metrics 核对实际指标和标签,再编写 Dashboard 与规则。
4. 自定义应用指标
应用应直接使用官方客户端库暴露业务指标,而不是频繁轮询日志或数据库。优先实现 RED 指标:请求速率、错误、延迟;再补充队列、缓存、依赖调用和业务成功量。
checkout_requests_total{method="POST",code="200"}
checkout_request_duration_seconds_bucket{le="0.3"}
checkout_payment_failures_total{provider="bank-a"}
设计原则:
- Counter 使用
_total,时长使用_seconds,容量使用_bytes。 - 标签仅表达有限业务维度,不记录用户、订单、请求或动态错误文本。
- Histogram 桶围绕 SLO 阈值设置,并在发布前压测样本量。
- 指标变化视为 API 变更,记录负责人、兼容期和 Dashboard/规则影响。