Chapter 05

Exporter 生态

无需改造被监控系统,Exporter 把各种第三方软件的状态翻译成 Prometheus 指标。这一章覆盖最常用的几个。

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_totalnode_memory_MemAvailable_bytesnode_filesystem_avail_bytesnode_load1node_network_receive_bytes_total

Windows 用 windows_exporter

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_codeprobe_duration_secondsprobe_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_totalcontainer_memory_working_set_bytescontainer_network_receive_bytes_total(带 containerpodnamespace 标签)。

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_exportermysql_up、mysql_global_status_threads_connected、慢查询、复制延迟
redis_exporterredis_up、redis_connected_clients、redis_memory_used_bytes、命中率
postgres_exporterpg_up、pg_stat_database_*、连接数、复制 lag
kafka_exporter消费组 lag、topic 分区 offset
给 Exporter 专用只读账号

数据库 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 小结与下一步