5.1 什么是 Exporter
Exporter 是一个小型 HTTP 服务,它去读取某个系统(主机、数据库、消息队列…)的内部状态,转换成 Prometheus 文本格式,暴露在 /metrics 端点上供 Server 抓取。它解决了"无法修改目标系统代码"的监控难题。
- 直接埋点 vs Exporter
- 自己的应用用 client library 直接埋点(第 6 章);无法改代码的第三方系统(MySQL、Redis、Nginx)用对应 Exporter。
- Exporter 部署模式
- 多数与被监控进程同机部署(如 node_exporter);少数是"多目标"模式,一个 Exporter 探测多个远程目标(如 blackbox_exporter)。
- 官方 vs 社区
- Prometheus 官方维护 node/blackbox/mysqld 等;社区有 1000+ 第三方 Exporter,覆盖几乎所有主流软件。
- textfile collector
- node_exporter 的一个采集器,读取本地
.prom文件,让脚本/cron 任务能把自定义指标"塞"进 node_exporter。 - 多目标 Exporter 模式
- 如 blackbox_exporter,一个实例通过
?target=参数探测多个远程地址,Prometheus 用 relabel 传入目标。 - Exporter 端口约定
- 社区维护了默认端口分配表(node=9100、blackbox=9115、mysqld=9104、redis=9121…),避免冲突。
- up 与 exporter 自身指标
- 每个 Exporter 除转换目标指标外,通常还暴露自身运行状态(scrape 耗时、采集错误数),便于监控 Exporter 本身。
5.2 node_exporter:主机监控
最常用的 Exporter,采集 Linux/Unix 主机的 CPU、内存、磁盘、网络、文件系统、负载等。
# 启动(默认监听 :9100)
$ ./node_exporter --collector.systemd --collector.processes
# prometheus.yml 抓取
- job_name: "node"
static_configs:
- targets: ["10.0.0.11:9100", "10.0.0.12:9100"]
关键指标:node_cpu_seconds_total、node_memory_MemAvailable_bytes、node_filesystem_avail_bytes、node_load1、node_network_receive_bytes_total。
node_exporter 是 *nix 专用。Windows 主机请用官方 windows_exporter(原 wmi_exporter),指标前缀 windows_。
5.3 blackbox_exporter:黑盒探测
从外部探测端点可用性:HTTP/HTTPS 状态码、TCP 连通、ICMP ping、DNS 解析、TLS 证书到期。属于"多目标"模式——Prometheus 把要探测的 URL 作为参数传给它。
# blackbox.yml 模块定义
modules:
http_2xx:
prober: http
timeout: 5s
http:
valid_status_codes: [200]
method: GET
# prometheus.yml —— 用 relabel 把 target 塞进 params
- job_name: "blackbox-http"
metrics_path: /probe
params:
module: [http_2xx]
static_configs:
- targets:
- "https://www.gufacode.com"
- "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:9115" # exporter 地址
关键指标:probe_success(1/0)、probe_http_status_code、probe_duration_seconds、probe_ssl_earliest_cert_expiry(证书到期时间戳)。
5.4 cAdvisor:容器监控
Google 出品,采集容器(Docker/containerd)的 CPU、内存、网络、文件系统。K8s 里 kubelet 已内置 cAdvisor,通过 /metrics/cadvisor 暴露。
$ docker run -d --name cadvisor -p 8080:8080 \
-v /:/rootfs:ro -v /var/run:/var/run:ro \
-v /sys:/sys:ro -v /var/lib/docker:/var/lib/docker:ro \
gcr.io/cadvisor/cadvisor:v0.49.1
关键指标:container_cpu_usage_seconds_total、container_memory_working_set_bytes、container_network_receive_bytes_total(带 container、pod、namespace 标签)。
5.5 数据库 Exporter
# mysqld_exporter,用 DSN 连库(默认 :9104)
$ export DATA_SOURCE_NAME='exporter:pass@(10.0.0.20:3306)/'
$ ./mysqld_exporter
# redis_exporter(默认 :9121)
$ ./redis_exporter -redis.addr redis://10.0.0.30:6379
| Exporter | 关键指标 |
|---|---|
| mysqld_exporter | mysql_up、mysql_global_status_threads_connected、慢查询、复制延迟 |
| redis_exporter | redis_up、redis_connected_clients、redis_memory_used_bytes、命中率 |
| postgres_exporter | pg_up、pg_stat_database_*、连接数、复制 lag |
| kafka_exporter | 消费组 lag、topic 分区 offset |
数据库 Exporter 需要连库账号,务必授予最小只读权限(如 MySQL 的 PROCESS, REPLICATION CLIENT, SELECT),并限制连接来源 IP,绝不用 root。
5.6 textfile collector:自定义指标
当没有现成 Exporter,又不想写服务时,可以让脚本把指标写到 .prom 文件,由 node_exporter 的 textfile collector 读取。
# 启动 node_exporter 时指定目录
$ ./node_exporter --collector.textfile.directory=/var/lib/node_exporter/textfile
# backup_check.sh —— 由 cron 定时运行,原子写入
# 备份是否成功 + 上次备份时间戳
TMP=/var/lib/node_exporter/textfile/backup.prom.$$
cat > $TMP <<EOF
# HELP backup_last_success_timestamp 上次备份成功时间
# TYPE backup_last_success_timestamp gauge
backup_last_success_timestamp $(date +%s)
EOF
mv $TMP /var/lib/node_exporter/textfile/backup.prom # 原子替换防读到半截
5.7 小结与下一步
- Exporter = 把第三方系统状态翻译成 Prometheus 指标的 HTTP 服务。
- 主机用 node_exporter、可用性探测用 blackbox_exporter、容器用 cAdvisor、数据库用对应 exporter。
- 没有现成 Exporter 时,textfile collector 让脚本也能贡献指标(记得原子写入)。
- 下一章讲 应用埋点——给你自己的服务加上业务指标。