Prometheus Exporter 有哪些常用类型?选型与配置实战
Prometheus 本身只负责数据采集和存储,真正的指标来源要靠 Exporter。Exporter 是一个独立进程,它把各种系统、数据库、应用的内部指标转换成 Prometheus 能够抓取的格式暴露出来。理解每类 Exporter 的定位和关键配置,是搭建可观测体系的基础。
系统层 Exporter
Node Exporter 是部署量最大的 Exporter 之一,几乎所有 Prometheus 环境都会跑它。它采集 Linux/Unix 主机的 CPU 使用率、内存余量、磁盘 I/O、网络吞吐和文件系统挂载状态,暴露的指标如 node_cpu_seconds_total 和 node_memory_MemAvailable_bytes 是容量规划和告警的基础数据源。部署方式很简单,在每台主机上以 systemd 服务或者 DaemonSet 运行,默认监听 9100 端口。
Windows Exporter 通过 WMI 接口采集 Windows 服务器指标,覆盖 CPU、内存、磁盘、网络以及 Windows 服务和 IIS 性能计数器。如果你的环境里混合了 Windows 节点,它是 Node Exporter 的对等替代。
数据库 Exporter
MySQL Exporter 连接到 MySQL 或 MariaDB 实例后,暴露连接数、查询吞吐、InnoDB 缓冲池命中率、慢查询计数和主从复制延迟等指标。关键指标 mysql_global_status_threads_connected 能帮你判断连接池是否够用,mysql_global_status_slow_queries 则是慢查询巡检的入口。配置时通过 DATA_SOURCE_NAME 环境变量传入 DSN,建议使用只读账号。
PostgreSQL Exporter 采集活动连接数、事务速率、缓存命中率、锁等待和复制状态。它支持通过查询 pg_stat_statements 扩展来暴露 SQL 级别的性能数据,需要在 postgresql.conf 中提前开启该扩展。
Redis Exporter 暴露内存使用量、键空间命中率、连接客户端数、驱逐键数和命令统计。对于 Redis Cluster 模式,它可以逐节点采集,帮助你定位热 key 和内存不均衡问题。
应用层 Exporter
Blackbox Exporter 不采集指标,而是主动探测外部端点的可用性。它支持 HTTP/HTTPS 请求、TCP 连接、DNS 解析和 ICMP Ping。你用它来验证服务是否可达、SSL 证书是否过期、DNS 解析是否正常。配置时在 blackbox.yml 中定义模块,然后在 Prometheus 的 scrape_configs 里用 relabel 把探测目标注入。
JMX Exporter 是 Java 应用的监控桥梁。它通过 JMX 获取 JVM 堆内存、GC 暂停、线程数以及应用层的 MBean 指标。Kafka、Tomcat、Cassandra 等中间件都能通过它暴露指标。有两种运行模式:Java Agent 模式随应用启动,独立进程模式单独采集。
容器与云平台 Exporter
cAdvisor 采集容器的 CPU、内存、网络和文件系统使用量,在 Kubernetes 里已经内嵌到 Kubelet,不需要额外部署就能拿到容器级别的资源数据。
Kube-State-Metrics 关注的是 Kubernetes 资源对象的状态而非资源用量。它暴露 Pod 的生命周期阶段、Deployment 的副本数偏差、Job 的完成状态和 PVC 的绑定情况。和 cAdvisor 互补,一个看资源消耗,一个看对象健康。
选型决策
选 Exporter 的核心原则是只部署你真正需要监控的组件。每个 Exporter 都会消耗目标系统的资源,MySQL Exporter 的查询会给数据库带来额外负载,JMX Exporter 的 MBean 采集会占用 JVM 堆外内存。建议先梳理业务关键路径,沿着路径部署对应的 Exporter,而不是一股脑全装。
对于 Kubernetes 环境,Node Exporter + cAdvisor + Kube-State-Metrics 三件套是起步配置,再根据业务组件加 MySQL Exporter、Redis Exporter 等。对于传统 VM 环境,Node Exporter + 业务相关的数据库 Exporter 即可覆盖基础监控。
配置示例
以下是一个涵盖系统、数据库和探测的典型配置:
yamlscrape_configs: - job_name: 'node' scrape_interval: 15s static_configs: - targets: ['node1:9100', 'node2:9100'] labels: env: 'production' - job_name: 'mysql' scrape_interval: 30s static_configs: - targets: ['mysql-exporter:9104'] - job_name: 'blackbox-http' scrape_interval: 60s metrics_path: /probe params: module: [http_2xx] static_configs: - targets: - https://api.example.com/health relabel_configs: - source_labels: [__address__] target_label: __param_target - source_labels: [__param_target] target_label: instance - target_label: __address__ replacement: blackbox-exporter:9115
注意 scrape_interval 的设置策略:系统级指标变化快,15 秒采集一次能及时捕捉异常;数据库指标相对稳定,30 秒足够;探测类任务频率可以降到 60 秒,避免对目标造成压力。
常见问题
Exporter 本身挂了怎么办?Prometheus 的 up 指标会变成 0,配合 alertmanager 规则 for 1m 即可触发告警。建议对每个 Exporter 都配置 up == 0 的告警。
指标太多导致 Prometheus 存储暴涨?用 metric_relabel_configs 过滤掉不需要的指标。例如 Node Exporter 默认暴露数百个指标,大部分文件系统指标如果不需要可以丢弃。
MySQL Exporter 连接报错?检查 DSN 格式是否正确,确认账号有 PROCESS 和 REPLICATION CLIENT 权限,网络策略是否放通了 Exporter 到数据库的连接。