Prometheus node_exporter 指标说明及告警规则表达
·
Prometheus node_exporter 指标说明及告警规则表达
说明:这篇是 node_exporter 指标的查询指南,可以说是从入门到精通的手册。如果你在用 Grafana 搭监控面板,这里面的 PromQL 可以直接搬过去用。
一、基本信息(单值查询)
这些适合放在 Grafana 的 Singlestat 或 Stat 面板,一眼看到系统概况。
| 指标 | PromQL | 说明 |
|---|---|---|
| CPU 核心数 | count(count(node_cpu_seconds_total) by (cpu)) |
物理 CPU 的总核心数 |
| 内存总量 | node_memory_MemTotal_bytes |
物理内存大小(bytes) |
| 交换分区总量 | node_memory_SwapTotal_bytes |
SWAP 总大小(bytes) |
| 根分区大小 | node_filesystem_size_bytes{mountpoint="/",fstype!="rootfs"} |
根文件系统总空间 |
| 1 分钟平均负载 | node_load1 |
load average 的第一列 |
| 系统运行时长 | node_time_seconds - node_boot_time_seconds |
从开机到现在跑了多久 |
二、使用率查询(百分比)
这些适合放在 Gauge 面板,显示当前资源用了多少。
CPU 使用率
# 方法 1:基于空闲率反算
100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
内存使用率
# 包含 Buffer/Cache(保守算法)
((node_memory_MemTotal_bytes - node_memory_MemFree_bytes) / node_memory_MemTotal_bytes) * 100
# 不包含 Buffer/Cache(更准确,反映应用实际占用)
100 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100)
两种算法的区别:第一种把 Buffer/Cache 也算在"已用"里,第二种认为 Cache 可以回收,用
MemAvailable当可用内存。推荐用第二种。
交换分区使用率
((node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes) / node_memory_SwapTotal_bytes) * 100
根分区使用率
100 - (node_filesystem_avail_bytes{mountpoint="/",fstype!="rootfs"} / node_filesystem_size_bytes{mountpoint="/",fstype!="rootfs"} * 100)
CPU 负载率(相对 CPU 核心数)
# 1 分钟负载百分比
avg(node_load1) / count(count(node_cpu_seconds_total) by (cpu)) * 100
# 5 分钟负载百分比
avg(node_load5) / count(count(node_cpu_seconds_total) by (cpu)) * 100
三、CPU 详细分解(图表用)
把 CPU 按几种模式拆开看,适合 Grafana 的 stacked 面积图:
# System 态占比
sum by (instance)(rate(node_cpu_seconds_total{mode="system"}[5m])) * 100
# User 态占比
sum by (instance)(rate(node_cpu_seconds_total{mode="user"}[5m])) * 100
# Iowait(磁盘等待)
sum by (instance)(rate(node_cpu_seconds_total{mode="iowait"}[5m])) * 100
# 中断(硬中断 + 软中断)
sum by (instance)(rate(node_cpu_seconds_total{mode=~".*irq"}[5m])) * 100
# Idle 空闲
sum by (mode)(rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100
四、内存详细分解
把系统内存拆成几层来看,适合堆积面积图:
| 分类 | PromQL |
|---|---|
| 应用占用 | MemTotal - MemFree - Buffers - Cached - Slab - PageTables - SwapCached |
| 缓存 | node_memory_Cached_bytes |
| 缓冲 | node_memory_Buffers_bytes |
| Slab | node_memory_Slab_bytes |
| 页表 | node_memory_PageTables_bytes |
| 空闲 | node_memory_MemFree_bytes |
| 交换分区 | SwapTotal - SwapFree |
五、网络流量
这里过滤掉了虚拟网卡(docker、veth、br 等),只看物理网卡:
# 接收速率(每 5 分钟平均)
rate(node_network_receive_bytes_total{device!~"lo|docker.*|veth.*|br.*"}[5m])
# 发送速率
rate(node_network_transmit_bytes_total{device!~"lo|docker.*|veth.*|br.*"}[5m])
如果需要更灵敏的瞬时速率,用 irate 替代 rate:
# 瞬时接收速率
irate(node_network_receive_bytes_total{device!~"lo.*"}[5m])
六、磁盘 I/O
IOPS(每秒 I/O 操作次数)
# 读操作
irate(node_disk_reads_completed_total{device=~"[a-z]*[a-z]"}[5m])
# 写操作
irate(node_disk_writes_completed_total{device=~"[a-z]*[a-z]"}[5m])
读写吞吐量
# 读取字节
irate(node_disk_read_bytes_total{device=~"[a-z]*[a-z]"}[5m])
# 写入字节
irate(node_disk_written_bytes_total{device=~"[a-z]*[a-z]"}[5m])
I/O 耗时
# 磁盘 I/O 时间占比
irate(node_disk_io_time_seconds_total{device=~"[a-z]*[a-z]"}[5m])
七、系统其他指标
# 上下文切换速率
irate(node_context_switches_total[5m])
# 中断速率
irate(node_intr_total[5m])
# 正在运行的进程数
node_procs_running
# 阻塞的进程数
node_procs_blocked
# 进程创建速率
rate(node_forks_total[5m])
# 文件描述符使用率
process_open_fds / process_max_fds * 100
# 系统可用熵
node_entropy_available_bits
八、时间同步监控
# 时间同步状态(1=已同步,0=未同步)
node_timex_sync_status
# 时间偏移量(秒)
node_timex_offset_seconds
# 预估误差(秒)
node_timex_estimated_error_seconds
# 最大误差(秒)
node_timex_maxerror_seconds
九、硬件温度
# 当前温度
node_hwmon_temp_celsius
# 告警阈值
node_hwmon_temp_crit_celsius
# 是否触发过温告警
node_hwmon_temp_crit_alarm_celsius
十、连接跟踪
# 当前 conntrack 条目数
node_nf_conntrack_entries
# conntrack 上限
node_nf_conntrack_entries_limit
# 使用率
node_nf_conntrack_entries / node_nf_conntrack_entries_limit * 100
十一、node_exporter 自检
有时候查不出数据,先看看 exporter 自己有没有问题:
# 每个采集器的采集耗时
node_scrape_collector_duration_seconds
# 采集器是否成功(1=成功,0=失败)
node_scrape_collector_success
PromQL 使用小技巧
-
ratevsirate:rate(metric[5m]):5 分钟内的平均速率,曲线平滑,适合带宽、磁盘吞吐irate(metric[5m]):5 分钟内最后两个点的瞬时速率,曲线灵敏,适合 CPU、传感器
-
过滤虚拟网卡:写
device!~"lo|docker.*|veth.*|br.*|tap.*"可以过滤掉虚拟接口,只关注物理网卡 -
计算百分比:
(实际值 / 总量) * 100是最通用的公式,改一下指标名就能套用到内存、磁盘、连接数等场景 -
变量替换:原文中大量使用
instance=~"$node:$port",job=~"$job"是 Grafana 的模板变量写法,在 Grafana 面板中可以直接用,手动查 Prometheus 时需要换成具体值
更多推荐

所有评论(0)