Linux node_exporter 使用与指标采集

1次阅读

node_exporter 默认监听 /metrics,404 多因 –web.disable-exporter-metrics 或绑定地址限制;磁盘 io_time 为 0 需查 /proc/diskstats 原始值;可用 textfile_collector 注入 df 百分比;cpu 指标断点宜用 irate() 替代 rate()。

Linux node_exporter 使用与指标采集

node_exporter 启动后 curl http://localhost:9100/metrics 返回 404

默认情况下,node_exporter 不监听 /metrics(这是 prometheus 客户端库的常见路径),而是用 /metrics ——但前提是没被显式禁用。实际 404 多半是启动参数或权限问题。

  • 检查是否加了 --web.disable-exporter-metrics:这个参数会删掉基础指标,连 /metrics 都不暴露,直接去掉它
  • 确认监听地址没锁死:默认只绑 127.0.0.1:9100,远程访问要加 --web.listen-address=":9100"(注意冒号前无 IP)
  • systemd 启动时容易漏掉 Restart=alwaysLimitNOFILE=65536,后者不足会导致连接拒绝,看起来像服务没起来

采集磁盘 I/O 时 node_disk_io_time_seconds_total 为 0 或突变归零

这个指标依赖内核的 /proc/diskstats,但不同发行版、内核版本对“io_time”的统计逻辑有差异,尤其是 NVMe 设备或启用多队列(mq-deadline)调度器时。

  • 先运行 cat /proc/diskstats | awk '{print $13}' | head -3 看原始值是否在增长;如果原生文件里就不变,说明内核没上报,不是 node_exporter 的锅
  • 避免用 node_disk_io_time_seconds_total 做绝对耗时分析,更适合做同比变化率(比如除以 node_disk_reads_completed_total
  • 某些云盘(如 AWS EBS gp3)或 LVM thin pool 卷可能压根不提供 io_time,此时应切换到 node_disk_read_time_seconds_total + node_disk_write_time_seconds_total

自定义采集项:想加一个 df -h 里的已用百分比,但不想写 Go 插件

node_exporter 支持通过 textfile_collector 注入外部指标,适合一次性、低频、脚本可生成的数据,比改源码或写 exporter 轻量得多。

  • 启用时必须加参数:--collector.textfile.Directory="/var/lib/node_exporter/textfile_collector"
  • 脚本每分钟生成一个 /var/lib/node_exporter/textfile_collector/df_usage.prom,内容形如:
    node_filesystem_utilization{mountpoint="/"} 87.3
  • 注意:文件名必须以 .prom 结尾,且权限得是 node_exporter 用户可读(常被忽略,导致 metrics 里完全不出现该指标)

和 Prometheus 抓取频率不匹配,node_cpu_seconds_total 出现断点或锯齿

node_cpu_seconds_total 是计数器(counter),本身是单调递增的,Prometheus 用 rate() 计算速率。断点往往不是数据丢了,而是抓取节奏和内核统计精度打架。

  • Prometheus 默认抓取间隔 scrape_interval: 15s,但 node_exporter 内部采样周期是 1s —— 这没问题;真正的问题是,若抓取卡在 CPU 切换瞬间,两次采样间可能跨过多个 tick,造成 rate 计算抖动
  • 解决方案不是调高抓取频率,而是改用 irate()(最近两个样本)替代 rate()(最近五分钟窗口),对瞬时波动更敏感也更稳
  • 另一个隐藏坑:node_exporter 在容器中运行时,若没加 --pid=host,看到的 CPU 指标其实是容器 cgroup 的,和宿主机 /proc/stat 对不上

有些指标看着是数字,其实背后连着内核 ABI、cgroup 版本、甚至 sysctl 设置。别急着调 PromQL,先确认 node_exporter 看到的和 /proc 里的一致。

text=ZqhQzanResources