Prometheus跨Exporter对比指标时左值为空的规则触发方案问询
解决方案
要解决这个问题,核心是基于右侧数据库指标的标签来补全左侧进程指标的空值,既能保留所需的client、manager、link标签,又能确保仅在右侧指标存在的实例上触发告警(右侧为空则不生成监控数据,自然不会触发)。
步骤1:构造带标签的0值补全系列
利用右侧指标的标签,生成一个值为0、标签完全一致的指标系列,这样补全空值时不会丢失维度信息:
oracledb_ebs_concurrent_queues_target_processes{concurrent_queue_name=~".*OPP.*"} * 0
步骤2:合并左侧指标与补全系列
将左侧进程指标和上面的0值系列合并,当左侧无数据时自动用0填充,同时通过标签限定仅在匹配维度上补全:
namedprocess_namegroup_num_procs{groupname=~".*OPP.*"} or on(client, manager, link) (oracledb_ebs_concurrent_queues_target_processes{concurrent_queue_name=~".*OPP.*"} * 0)
步骤3:告警规则表达式
如果需求是左侧进程数为0(或无数据)且右侧指标存在时触发告警,最终的告警规则表达式可以写为:
( namedprocess_namegroup_num_procs{groupname=~".*OPP.*"} or on(client, manager, link) (oracledb_ebs_concurrent_queues_target_processes{concurrent_queue_name=~".*OPP.*"} * 0) ) == 0
这个表达式的逻辑:
- 仅当右侧指标存在时,才会生成对应的0值补全系列;
- 左侧进程数为0(或无返回值)时,合并结果为0,触发告警;
- 右侧指标不存在的实例,整个表达式无返回值,不会触发告警(符合“该实例不适用此规则”的要求)。
扩展:对比进程数与目标值
如果需要判断左侧进程数小于右侧目标进程数时告警,可用以下查询:
( namedprocess_namegroup_num_procs{groupname=~".*OPP.*"} or on(client, manager, link) (oracledb_ebs_concurrent_queues_target_processes{concurrent_queue_name=~".*OPP.*"} * 0) ) < on(client, manager, link) group_right() oracledb_ebs_concurrent_queues_target_processes{concurrent_queue_name=~".*OPP.*"}
内容的提问来源于stack exchange,提问作者xafer
相关产品推荐
相关产品推荐

