使用absent函数结合正则时Prometheus查询不返回instance属性的解决方法
解决Prometheus告警缺失实例标签的问题
问题分析
你当前使用的absent(namedprocess_namegroup_num_threads{groupname="tnslsnr",instance=~"instance01|instance02|instance03"})查询,在进程缺失时只会返回带有groupname="tnslsnr"标签的结果,无法定位具体是哪个实例的进程消失——原因是absent会聚合所有匹配的序列,丢失instance维度。
解决方案
可以通过构造预期实例的向量,结合unless操作符筛选出缺失进程的实例,无需拆分多个查询:
# 构造包含所有目标实例的向量 (vector(1) {instance="instance01"} or vector(1) {instance="instance02"} or vector(1) {instance="instance03"}) # 排除存在正常进程指标的实例 unless namedprocess_namegroup_num_threads{groupname="tnslsnr"}
原理说明
- 第一部分通过
vector(1)为每个目标实例创建一条带对应instance标签的时间序列; unless操作符会保留左侧向量中不存在于右侧向量的条目,也就是那些没有namedprocess_namegroup_num_threads指标的实例;- 最终结果会显示所有进程缺失的实例标签,方便直接定位问题节点。
替代方案(基于时间范围检测)
如果需要检测实例在一段时间内完全没有进程指标,可以使用absent_over_time并保留instance维度:
absent_over_time(namedprocess_namegroup_num_threads{groupname="tnslsnr",instance=~"instance01|instance02|instance03"}[1m]) by (instance)
注:这里的
[1m]是检测时间窗口,可根据实际采集间隔调整,确保能覆盖至少一次采集周期。
内容的提问来源于stack exchange,提问作者John Phelps
相关产品推荐
相关产品推荐

