3. Exporter 端排查:指标暴露格式与健康检查
Exporter 是整个采集链路的“数据源”。如果 Exporter 暴露的指标格式错误、端点不可达或配置存在逻辑缺陷,上游 Prometheus 无论如何调整采集参数都无法获得准确的误差预算数据。本节将聚焦 Exporter 端的三个核心排查维度:指标暴露格式验证、metrics 端点健康检查以及常见配置错误。
3.1 指标暴露格式验证
Prometheus 要求 Exporter 暴露的指标必须严格遵循 Prometheus Exposition Format。格式错误会导致 Prometheus 解析失败、指标缺失或数值异常。验证格式的最佳实践是直接使用 curl 或 wget 请求 Exporter 的 /metrics 端点,并检查输出结构。
# HELP http_requests_total Total number of HTTP requests.
# TYPE http_requests_total counter
http_requests_total{method="GET",status="200"} 1027
http_requests_total{method="POST",status="201"} 345
# 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"} 1.234e+05
- 缺少 HELP 或 TYPE 行:Prometheus 虽然能解析,但会丢失元数据,影响后续告警规则的可读性。
- 标签值未加双引号:例如
method=GET应为method="GET"。 - 数值包含非数字字符:例如
1027.0abc会导致解析失败。 - 时间戳格式错误:Exposition Format 允许可选时间戳,但必须为 Unix 毫秒级整数,且不能与 Prometheus 采集时间偏差过大。
- 指标名称包含非法字符:只能包含
[a-zA-Z0-9_:],不能包含连字符或空格。
建议在排查时使用 curl -s http://exporter:9100/metrics | head -50 快速预览前 50 行,确认 HELP/TYPE 行完整、标签格式正确、数值为合法浮点数或整数。
3.2 metrics 端点健康检查
除了格式验证,还需要确认 Exporter 的 HTTP 端点本身是否健康。Prometheus 通过 scrape_config 中配置的 target 地址定期拉取数据,如果端点返回非 200 状态码或超时,采集将直接失败。
| 检查项 | 命令/方法 | 预期结果 | 异常处理 |
|---|---|---|---|
| HTTP 状态码 | curl -o /dev/null -s -w "%{http_code}" http://exporter:9100/metrics |
200 | 检查 Exporter 进程是否运行、端口是否监听、防火墙规则 |
| 响应时间 | time curl -s http://exporter:9100/metrics > /dev/null |
< 5s(建议 < 1s) | 检查 Exporter 内部处理逻辑、系统资源(CPU/内存/磁盘 I/O) |
| 指标数量 | curl -s http://exporter:9100/metrics | wc -l |
与预期一致(如 node_exporter 通常 500-2000 行) | 检查 Exporter 是否启用了正确的 collector,是否存在采集错误 |
| 进程存活 | ps aux | grep exporter |
进程存在且无异常退出 | 检查 systemd 单元文件、日志文件(journalctl -u exporter) |
scrape_config 中为每个 Exporter 配置 metrics_path: /metrics 和 scheme: http(或 https),并设置合理的 scrape_timeout(默认 10s,可根据 Exporter 响应时间调整)。同时,建议在 Exporter 所在主机部署 blackbox_exporter 或使用 Prometheus 的 up 指标监控 Exporter 端点健康状态。
3.3 常见 Exporter 配置错误
Exporter 的配置错误是导致误差预算数据不准的“隐形杀手”。以下列出最常遇到的几类问题,并附排查方法。
3.3.1 Collector 未启用或误禁用
许多 Exporter(如 node_exporter、mysqld_exporter)通过 --collector.xxx 或 --no-collector.xxx 参数控制采集模块。如果关键 collector 被禁用,相关指标将完全缺失。
# 错误示例:禁用了 CPU 和内存采集
./node_exporter --no-collector.cpu --no-collector.meminfo
# 正确示例:启用所有默认 collector,或显式指定需要的 collector
./node_exporter --collector.disable-defaults --collector.cpu --collector.meminfo --collector.filesystem
3.3.2 标签(Label)冲突或缺失
Exporter 暴露的指标标签必须与 Prometheus 的 relabel_configs 或 metric_relabel_configs 兼容。常见问题包括:
- 标签值包含特殊字符:如空格、换行符,会导致 Prometheus 解析异常。
- 标签名重复:同一指标出现两个同名标签,Prometheus 只保留最后一个。
- 标签值过长:超过 64KB 的标签值会被 Prometheus 截断或拒绝。
3.3.3 指标命名空间冲突
如果多个 Exporter 暴露了相同名称的指标(例如 http_requests_total),Prometheus 会合并这些指标,但可能因标签不一致导致数据混乱。建议在 Exporter 端通过 --web.listen-address 区分端口,或在 Prometheus 端通过 honor_labels 和 relabel_configs 添加来源标识。
3.3.4 采集超时与数据量过大
当 Exporter 返回的指标数量过多(例如超过 10 万行)或响应时间过长时,Prometheus 可能因 scrape_timeout 而放弃采集,导致数据缺失。
# 在 Prometheus 日志中可看到类似错误:
# scrape of "http://exporter:9100/metrics" timed out after 10s
# 解决方案:
# 1. 增加 scrape_timeout(如 30s)
# 2. 优化 Exporter 采集逻辑(如减少不必要的 collector)
# 3. 使用 --exclude-metrics 或 --collector.xxx.whitelist 过滤指标
3.3.5 认证与 HTTPS 配置错误
如果 Exporter 启用了基本认证或 HTTPS,但 Prometheus 的 scrape_config 中未配置对应的 basic_auth 或 tls_config,采集将返回 401 或 TLS 握手失败。
# Prometheus scrape_config 示例(带基本认证):
scrape_configs:
- job_name: 'my_exporter'
static_configs:
- targets: ['exporter:9100']
basic_auth:
username: 'admin'
password: 'secret'
3.4 实战排查清单
以下清单可作为 Exporter 端排查的快速参考,建议在每次误差预算数据异常时逐项核对:
- 端点可达性:
curl -v http://exporter:9100/metrics是否返回 200? - 格式正确性:前 20 行是否包含 HELP/TYPE?标签值是否加引号?数值是否合法?
- 指标完整性:关键指标(如
http_requests_total、node_cpu_seconds_total)是否存在? - Collector 状态:Exporter 启动参数中是否误禁用了必要 collector?
- 资源消耗:Exporter 进程的 CPU/内存使用是否正常?是否存在 OOM 或被系统 kill?
- 日志检查:Exporter 自身日志中是否有 error/warning 信息?
- 版本兼容性:Exporter 版本是否与 Prometheus 版本兼容?建议使用官方最新稳定版。
curl 直接查看原始输出是最直接有效的排查手段。建议将 Exporter 的 /metrics 端点纳入 Prometheus 的 up 指标监控,并设置告警规则,以便在 Exporter 异常时第一时间感知。