我们将报警规则的实现定义为「过滤、聚合、比较」这三个阶段。举例来说,假设这是一个服务 A 的 ERROR 埋点日志:
app_name=B is_error=false warn_msg=aa datetime=2019-04-01 11:12:00
app_name=A is_error=false datetime=2019-04-02 12:12:00
app_name=A is_error=true error_msg=bb datetime=2019-04-02 15:12:00
app_name=A is_error=true error_msg=bb datetime=2019-04-02 16:12:09
报警规则定义如下:
-
过滤
:通过若干个条件限制来圈定一个数据集。对于上面的问题,过滤条件可能是:app_name=A
, is_error=true , datetime between '2019-14-02 16:12:00' and
'2019-14-02 16:13:00'.
-
聚合
:通过 count,avg,sum,max 等预先定义的聚合类型对上一步的数据集进行计算,得到一个唯一的数值。对于上面的问题,我们选择 count 来计算出现 ERROR 的次数。
-
比较
:把上一步得到的结果与设定的阈值比较。
对于一些复杂条件的报警
,比如我们上边提到的失败率和流量波动,应该如何实现呢?
假设有这样一个问题:如果调用的 A 服务失败率超过 80%,并且总请求量大于 100,发送报警通知。
我们知道,失败率其实就是失败的数量除以总数量,而失败的数量和总数量可以通过前面提到的
「过滤+聚合」
的方式得到,那么其实这个问题就可以通过如下的公式描述出来:
failedCount/totalCount>0.8&&totalCount>100
然后我们使用表达式引擎 fast-el 对上面的表达式进行计算,得到的结果与设定的阈值比较即可。