targets 页面显示某个 job 的 last error 是 401 Unauthorized,up 指标为 0,但业务面板上的曲线还在,因为查询用了 7 天范围的平均值。token 是 30 天有效期,过期当天没人发现。乍看像缓存或者权限的锅,追下去往往不是。
curl -s 'http://prom:9090/api/v1/targets?state=active' | jq '.data.activeTargets[] | select(.health!="up") | {labels,lastError}'
up{job="node"} == 0
追下去是这么回事:抓取失败只体现在 up 和 scrape_duration 里,没有对应的告警规则。面板查询写的是 avg_over_time[7d],旧样本把空档填平了。token 轮换靠人工,日历提醒没落到值班人身上。
「exporter token 过期」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。报错里带路径的,先去看那个路径在不在、权限对不对。
具体做法是,给 up == 0 加一条持续 5 分钟的告警;token 改成短期凭证 由 sidecar 自动续期;面板默认时间范围改成 1 小时 别用 7 天平均;抓取失败时在面板上叠加 up 曲线 让空档可见。
验收就看一点,token 失效 5 分钟内收到告警,面板上能看到 up 掉到 0 的空档。
