基本逻辑流程
- 查询当前告警类型配置的所有告警规则
- 每间隔一分钟,取对应类型的报表,如果transaction类型的告警,就取transaction类型的报表,event类型的,就取event类型的报表,根据报表里面的duration(key=当前分钟,value=生成的次数)去校验是否触发告警规则,如果触发,则返回告警实例。
- 将上一步返回的告警实例,插入到AlertMananger内部队列里
- AlertManager 异步线程消费告警实例。根据类型、分组、级别(warn、error)查询对应的发送通道(email、sms、weixin),无论发送成功与否,都要写入数据库。(这里没有记录发送成功与否的状态,算是个bug)
Transaction告警
Cat告警在Cat-home里面。序列图如下:
如上图所示,Cat后台启动时,启动各种Alert,Alert内部每隔一分钟,将所有的告警规则过一遍,将触发了告警规则数据封装成一个告警实例,将告警实例插入到AlertManager里面的一个阻塞队列里面。AlertManager在初始化的时候启动一个跑批任务,每隔5ms从队列里面取告警实例,发送出去。
具体发送告警的实体类是
com.dianping.cat.report.alert.sender.sender.Sender
Event告警机制
Event类型告警处理时序图如下: