前言
本文主要记录自己配置grafana相关告警时的一些心得体验,因为看grafana的官方文档不容易理解,结合自己的的使用体验,记录下告警配置的一些思路~
告警规则影响因素
- 数据: 数据是影响我们告警最重要的方式,告警本质也就是观察数据变化情况然后判断是否异常然后进行告警提示我们查看,所以当告警频繁出现时,首先考虑我们的数据埋点或者SQL语句编写是否准确
- 查询间隔Interval: interval是我们每隔多久去查一次数据,我们不设置MinInterval的话grafana会根据我们的查询间隔以及面板宽度自动分配interval。interval定义了数据源的查询间隔,数据如果在某个时间段量很低,但是我们设置了很短的interval,在一段interval里面没有数据则成功率的告警则会出现很多成功率的为0的点,这样grafana使用聚合函数判断值的时候,容易触发pedding,所以如果数据量比较少要拉长Interval为 5min或者更长
- Step: 影响面板的展示可能会让我们产生疑惑,明明面板展示没有低于某个值却告警了,此时可以去掉step进行观察实际数据源的值就比较清晰。同时也会影响告警的的统计数据但不是按照step的点进行计算平均值,而是再使用对应的聚合函数计算对应的值
- Alert--Evaluate every: 含义是每隔多久去查一下Condition语句的值是否低于/高于我们设置的阈值,这个是我们查询是否触发告警的时间间隔,和interval不一样,要大于或者等于interval的值否则有可能还没数据源就查询告警的话是不准确。每隔多久查询一次告警语句时间不能太短服务器顶不住,可能会有时间偏差,服务器不一定是整点整分秒去查询。
- Alert-for: 当我们阈值持续多久就真正的触发告警,当我们数据第一次低于阈值时,状态会变成pedding状态,只有在我们设置的for时间内持续低于阈值才会真正告警。所以当我们数据波动比较大时,可以适当拉长for时间 减少误告,但是太长的话会导致告警不及时所以需要斟酌
- Condition-of: 也就是我们告警对数据源的处理方式,成功率这些可以使用avg,累计量的使用sum等。
query (A, 5m, now): A表示我们query里面的A查询语句,5m表示分钟之前 now表示现在,也就是计算5m到现在的数据源的平均值。所以这里时间间隔也要大于我们的interval。当我们数据比较少时要和interval同步拉长为Interval的整数倍,防止now数据没有立刻查出可以优化为query (A, 6m, now-1m) - If no data or all values are null:当我们告警查询中某次没有数据或者都是null的处理情况,如果设置为Alerting则会直接告警不用等待告警观察周期结束,ok的话就是变成恢复正常 keep laststate保持和上次查询状态一致,No Data就是继续无数据
- If execution error or timeout:: 和上面null含义触发时机一样
总结
- 当频繁发出告警时,首先排查数据查询以及数据有无问题。其次可以拉长for告警的时间,避免一部分误告但是太长会存在告警不及时的问题。检查自己interval以及step查询间隔是否合理。也可以调整condition-of为
query (A, 6m, now-1m)避免一些数据量太少数据整点还没拉到产生的误告. - 如果数据量在某一段时间数据量很低很高容易产生告警:可以配置和昨天同一时刻的diff值,通过配置diff值来判断业务是否真的有问题.
- 设置多个告警条件:可以同时设置成前20min小于某个阈值和前五分钟小于某个阈值都满足才告警。或者成功率的告警搭配访问量同时配置保证了成功率不会因为数据量太少波动比较大
- interval和Step设置都会对告警产生一定的影响,但不是直接通过对点求平均值得到,具体怎么计算的没找到也可能没权限,但是会对null值或者0这些有一定影响,如果原始点太分散计算肯定会偏低的,所以设置一个合适interval很重要,主要影响Pedding,有知道的jym也可以评论一起交流下~