报错是这么冒出来的。Grafana 9 接 Prometheus 数据源,一个 CPU 面板写 rate(node_cpu_seconds_total[5m]),时间范围 Last 6 hours 却整屏 N/A,把同一句粘到 Prometheus 的表达式浏览器里立刻有曲线。

排查方向其实有限,先把可能性排一排。数据源里填的 Scrape interval 与实际 15 秒不符,$__interval 算出来比采样间隔还大。少数情况下是面板 Min step 设成 1m,rate 窗口里凑不到两个点,函数返回空。

还有一种情况,查询里带 job 标签,标签值写成 node-exporter 而实际是 node。

第一件事是确认标签取值

curl -s 'http://127.0.0.1:9090/api/v1/label/job/values'

接着看窗口里有没有两个点

curl -s 'http://127.0.0.1:9090/api/v1/query?query=count_over_time(up[1m])' | jq '.data.result[0].value'

然后把 rate 窗口换成变量

rate(node_cpu_seconds_total{job="node"}[$__rate_interval])

剩下的就是把面板 Min step 调回 15s

面板 Query options 里 Min step 填 15s

中间停过一次,把已经改的东西回滚干净,再重新来一遍。

同样的操作我在测试机上先走了一遍,线上只做验证过的部分。

怎么算真的好了,看的是同一批现象。面板从 N/A 变成连续曲线,Legend 里的 instance 数与 Prometheus 中 up 指标的实例数一致,切换 6 小时和 24 小时都有数据。

Grafana 的 N/A 九成是区间和步长不匹配,先看 $__interval 的实际值;改数据源 Scrape interval 比逐个面板调 Min step 省事。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189