所谓的闭环,就是指告警发出、认领、协作处理、问题恢复、复盘改进的整个过程。

排班,专人做专事

​这个手段听起来并不高大上,但确实非常有效。值班期间虽然提心吊胆的,生怕背锅,但因为是轮班制,心里总有个盼头,挺过这个周期就好了。

轮班的人在值班期间是第一责任人,会拿出 120% 的精力来处理问题,责任到人显然更容易推进问题解决,其他不值班的人则可以心无旁骛地做一些长线的事情,不至于总是被告警打断。

排班系统通常不开源,通常是作为事件中心的一个功能,PagerDuty 就提供了排班能力,即使没有系统支持,也建议人为制定一个排班表,把这个制度落实下去,对告警闭环处理也会有很大帮助。

值班人员在值班期间,虽然已经高度重视了,但也难免疏漏,这就需要告警升级机制了。

告警升级机制

​告警升级是指在第一责任人收到告警之后没有及时响应,然后系统自动通知二线、三线人员的一种机制。

一线人员没有及时响应的原因可能有很多,比如手机静音了没有听到,晚上睡着了,或者临时出去有事忘带手机了等等。

这个时候系统发现某个告警一直没有恢复,也没有被认领,一段时间之后,就应该通知值班人员的领导或者二线备份人员,如果二线人员也迟迟没有响应,就应该继续往上升级。

告警升级机制需要认领功能的配合,也就是一线人员收到告警之后要通过某种机制告诉系统:“我已知晓告警,现在我开始处理了,你不要升级了”。

所以一般只有严重的告警才会启用升级机制,警告或者通知性质的告警都不用启用升级机制。当然,这个规范怎么定,各个团队可以自行商定。

告警收敛逻辑

一般收敛逻辑是三级收敛,event -> alert -> incident。

从 event 到 alert 的这个收敛逻辑,我们叫做一级收敛。只有这个收敛逻辑还不够,告警信息还是比较散,不好基于这些散乱的告警分别做协同,把多个 alert 收敛成一个 incident(故障),基于 incident 做协同才比较方便。但是,event 到 alert 是有一个固定的收敛逻辑的,可以通过程序自动收敛,而 alert 到 incident 却很难自动收敛。

1.根据时间做收敛;2. 根据时间 + 标签做收敛;3. 根据时间 + 文本相似度做收敛。

既然没办法把告警自动收敛成故障,那就手工来做。一个故障关联的关键告警,还是相对容易区分的,只要把关键告警关联到故障,后续基于这个故障做协同就可以了。所谓协同,一个是信息同步、协同处理,一个是共同复盘、管理跟进项。

​故障协同处理

首先,并不是所有的告警都需要升级成故障协同处理。一般来讲,如果告警可以被值班人员直接处理掉,对别的团队负责的服务没有影响,不需要通知别的团队,通常是不需要升级成故障的,在告警层面来协同就可以了,自己团队内部消化掉;如果值班人员和他所在的团队没办法独自处理告警,才需要升级成故障,拉其他团队的人进来一起处理。

多个团队共同处理一个故障,不同团队的人会发现一些不同的线索,需要及时同步给所有相关的人,这个时候就可以在故障下面添加评论,其他人就可以及时看到。等到止损之后,大家还要根据故障时间线复盘,产出一系列跟进项,这个时候就需要这个故障管理模块具备跟进项管理的功能,或者至少能够跟任务管理系统良好打通。

有了这样一个故障协同的机制之后,故障被处理掉的概率就大幅提升了,后续再配合一些运营统计手段,统计各个团队的平均故障止损时间,建立红黑榜,大家就会有更高的热情来处理故障。当然,人的热情再高,也不如机器来得快,如果有些告警能够直接关联自动化处理逻辑,无疑可以大大增加事件闭环率。

​告警自动处理

很多监控系统都可以配置 Webhook,当告警触发之后自动回调某个 HTTP 接口,来串联一些自动化的逻辑,让告警事件无人值守自动处理。

比如某个机房的某个服务挂掉了,Webhook 的逻辑是自动调用切流的接口,把服务流量切走,这样来达到止损的目的。

​告警自动处理的这段逻辑,未必一定能够做到告警自愈,有的时候只是使用这个机制来抓现场,也是非常有价值的。

比如某个进程挂掉了,在挂掉的时候我想知道当时机器的一些运行情况,比如各项资源的占用情况、系统日志的信息等等,我们就可以借助告警自动处理的这个方式,来自动跑个脚本抓取当时机器上的一些现场信息,相比收到告警之后手工登录机器查看要高效得多。

参考资料

https://blog.csdn.net/key_3_feng/article/details/132301224