absent 与 absent_over_time 是什么
当目标整体下线时,它的指标序列会从 Prometheus 里消失,此时 up==0 也可能不存在,基于阈值的告警便测不到异常。absent() 在参数匹配不到任何序列时返回 1,absent_over_time() 在时间窗口内一直没有数据时返回 1,专门用来做「无数据」类告警,把「静默消失」这种最难发现的情况变成可告警信号。
基本信息
| 函数签名 | absent(v instant-vector) / absent_over_time(v range-vector) |
|---|---|
| 返回值 | 合成序列,值为 1(无匹配时) |
| 标签来源 | 参数中的匹配器(等值、正则等) |
| 常见搭档 | up==0(抓取失败)与 absent(序列消失)分工 |
| 典型时长 | absent_over_time 常用 5-15 分钟窗口 |
| 适用版本 | absent 全版本;absent_over_time 需较新版本 |
典型使用场景
- 整个 job 的目标被误删或抓取配置被移除时触发告警
- 关键实例长时间无上报,用 absent_over_time 兜底
- 聚合类看板里目标消失导致曲线空白,靠它把无数据变成告警
- 配合 for 时长抑制采集抖动造成的误报
- 迁移或改名期间监控旧指标是否彻底停更
- 把「服务已死」与「服务没了」分成两类事件分别告警
用法示例
用法示例
# 序列完全消失时触发(例如整个 job 的目标被移除)
absent(up{job="api"})
# 窗口内一直没有数据时触发
absent_over_time(node_load1{instance="10.0.1.11:9100"}[10m])
# 分工:目标还在但抓取失败用 up==0;目标被删除用 absent
up{job="api"} == 0
# 组合告警:目标丢失或抓取失败都报
absent(up{job="api"}) or up{job="api"} == 0两种无数据语义对照
| 场景 | 表达式 | 说明 |
|---|---|---|
| 抓取失败但目标还在 | up == 0 | 目标存在,抓取超时或被拒绝 |
| 目标被删除 | absent(up{...}) | 序列完全消失才返回 1 |
| 窗口内长时间无数据 | absent_over_time(...[10m]) | 适合慢周期指标兜底 |
| 只想看空集合 | count(...) == 0 | 不做合成序列时的替代写法 |
absent 产生的是合成序列,标签来自参数中的匹配器;告警规则的 annotations 要写清影响面,否则通知只说「无数据」看不出影响范围。
absent 只在参数匹配不到任何序列时返回 1:部分实例消失不会触发。要按实例维度发现单个实例丢失,应逐实例做 absent,或改用 up 系列加阈值。
absent 的结果没有历史数据,短窗口查询在边界处可能瞬时空白;告警务必留足 for 时长,避免任务重启期间反复抖动。