夜莺监控告警规则里的“仅在本业务组生效”具体是怎么个逻辑?_IT运维监控

首先,得了解告警和恢复的原理

对于某个告警规则(假设其归属业务组A),其 promql 为 cpu_usage_idle < 5 告警,夜莺的告警引擎就会拿着这个 promql 去查时序库,比如查到 10 台机器的 cpu_usage_idle 数据都小于 5 ,于是,时序库返回 10 条数据,进而产生 10 条告警。

时序库并不知道这 10 台机器是归属在哪个业务组的,比如时序库用的是 Prometheus,机器和业务组的关联关系是在夜莺里,是两个不同的系统。所以,时序库只是返回所有符合 cpu_usage_idle < 5 的 time series 指标数据。

如果勾选了仅在当前业务组生效,就本例而言,就是说,只有业务组A下面的机器触发了 < 5 这个规则,才产生告警事件,其他业务组的机器即便触发了也不产生告警规则。这是怎么做到的呢?

夜莺看到时序库返回了 10 条记录,然后就从这 10 条数据里取 ident 标签的值当做机器,然后看这个机器是否属于“告警规则所属的业务组”,如果属于,那就生成告警事件,如果不属于,就丢弃这个事件。通过这种方式,来实现告警规则只对本业务组内的机器生效。

嗯,目前来看,整个逻辑是挺好的。

但是,有的时候,promql 可能会写一些聚合函数,导致 promql 查询的结果中不包含 ident 标签,此时,夜莺就无能为力了,不知道时序库返回的这个数据属于哪个机器,也就无法根据机器的归属关系判断是否发告警了。

promql 查询的结果中不包含 ident 标签的时候,夜莺就不根据归属关系做拦截,直接产生告警事件。