首先,得了解告警和恢复的原理,参考官方文档: https://flashcat.cloud/docs/content/flashcat-monitor/nightingale-v6/faq/alerting-logic/
对于某个告警规则(假设其归属业务组 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 标签的时候,夜莺就不根据归属关系做拦截,直接产生告警事件。
标签:10,机器,业务组,夜莺,时序,告警 From: https://www.cnblogs.com/ulricqin/p/18355169