陈泽生
在医疗系统网络、医疗业务应用和数据中心运维场景下,面对大量的医疗IT服务终端和系统以及其关联关系的运维工作,健康监测工具是必不可少的,然而即使有了相关监测工具后,随之而来因医务变更、维护配置变更、片区故障、人为失误等异常情况导致的医疗系统告警风暴和连锁告警,往往让运维人员头痛,有价值的告警信息往往会被告警风暴淹没掉,导致故障排查的响应与分析定位工作受到很大阻碍,严重影响医务工作的开展,甚至会导致医疗事故。本文就医疗系统导致的告警风暴的问题,研究对其的收敛技术并加之实践,进一步提高检测告警的有效性、及时性和精准性,讨论如何从告警风暴中辨别出有效告警、重复告警和误告警,如何精准发现触发其告警背后的医疗业务问题根源,如何让运维人员从告警风暴中释放更多精力。
在医疗系统运维监测工作中,告警收敛是指对原始告警信息进行分析和处理,以此来降低告警信息的整体数量规模。告警收敛的目的就是把无关的告警信息过滤或合并,尽量保留有价值的告警信息,帮助运维人员作出快速而准确的判断。据此我们整个告警收敛框架设计主要分为四个步骤,包括原始告警输入、相关性处理、告警收敛处理和主告警输出。
(一)原始告警输入
通过对接运维监控和日志等工具,把原始的告警、日志和指标等信息按照标准化格式推送到告警收敛系统的告警事件库,作为告警收敛的原始告警信息输入。
(二)告警相关性处理
根据业务相关性,把输入的数据进行各种信息相关性处理,对告警信息进行分层分组处理,形成具有较强业务相关性的告警堆栈阵列,作为下一步告警收敛处理的样本。
(三)告警收敛处理
对告警堆栈阵列中的各个堆栈,适配各自的告警收敛策略算法,进行自动去重、自定义规则压缩,以及基于关系拓扑算法的收敛,实现不同堆栈告警信息按照各自的业务规则进行收敛和类聚。
(四)主告警输出
对进行收敛处理后的主告警进行输出,包括收斂后主告警的标识、收敛策略、压缩量、新增的自定义维度等信息。并把主告警信息输出到通知推送系统中,根据推送策略,向运维人员推送邮件、短信、电话和第三方API发送告警通知;也可以把告警推送到根因分析模块,与知识图谱结合分析,智能识别和定位告警产生的根因问题。
原始告警信息来源于运维监控工具,包括Zabbix、Prometheus、Nagios、Open-Falcon等,我们可以采用HTTP API、ElasticSearch、邮件等多种方式从监控工具中获取到原始告警信息。以Zabbix为例,可通过Zabbix的触发器动作配置,把告警信息按照定义好的标准化格式推送到告警收敛系统的HTTP API,作为告警收敛的原始告警信息输入。
原始告警输入后,是一种无序散乱的形态,我们必须根据各种业务的特性和预警场景,对具有关联性的告警进行归类和打包。通过数据分层法和分组法,把告警分配到各个堆栈陈列中,并为各堆栈标记上时间窗口和权重标记。为了更好说明,下面引用一个告警相关性处理例子。如下表是一组原始告警的输入。
对原始数据进行分层和分组处理,分层的维度可以按照告警的等级进行划分,分组的维度可以按照告警的类别划分,也可以根据业务特性按照不同的维度进行划分。划分后形成的相关性堆栈阵列,然后把告警分配到各自的堆栈中。
对告警进行相关性处理后,形成各个告警堆栈,根据堆栈的业务特性,关联各个告警收敛策略,每个告警策略包含有一组或多组的收敛算法,常用的收敛算法有:
(一)时间窗口
根据每个堆栈的等级,定义每个堆栈的时间窗口,满足时间窗口条件的告警触发时间的告警,将会触发一次收敛处理。例如A01堆栈设置了10分钟的时间窗口,则每10分钟对该堆栈中的告警进行一次收敛处理。
(二)同类去重
根据堆栈中告警的ID、对象、内容、地域等信息匹配程度,自动合并重复告警。例如楼宇片区停电的场景,对导致大量交换机告警内容为“ping超时”的告警,可以根据告警的地域信息和告警内容的同类一致匹配性,达到自动合并同类告警的目的。
(三)自定义收敛规则
根据业务特性,自定义收敛规则,运用正则表达式,对告警信息进行提取,对符合正则表达式的告警进行收敛压缩。
(四)周期性收敛
在生产环境中会存在很多定时任务,如数据备份、定期重启、昼夜策略变更等,这些定时任务的运行可能会触发某些告警,通过设置有针对性的时间表,与告警堆栈进行关联,实现基于时间表的周期收敛策略。
(五)静默
某些业务的中断会伴随着一连串连锁告警的触发,而我们关注的只会是最关键的一个节点或指标的告警,这个时候就需要把其他连锁反应的节点告警尽量静默掉,使告警更精准。
(六)基于拓扑关系的收敛
网络中的各个节点都具有拓扑或上下游的级联关系,业务系统和组件之间的调用链也是存在类似的依赖或映射关系,基于这种关系,位于拓扑关系上层节点或指标产生的上游告警必然会连锁触发下游告警,我们把这种关系转换为“节点IP+告警触发器”组合的上下游关系,即可实现告警与告警之间的层级图谱关系,进而实现基于拓扑关系的告警收敛。例如以下是一组简单的拓扑示例,服务器主机与网络交换机的连接关系:
● 【上游】节点:10.12.20.1,对象:网络交换机
● 【下游】节点:172.16.4.1,对象:服务器主机
上游节点产生的网络中断、硬件告警、流量拥塞等高等级告警,很大可能会导致下游节点也产生一系列的告警,有了这种拓扑关系,我们就可以通过收敛掉其下游节点的告警,归并到上游节点的主告警上。这种拓扑关系可以以数据表的方式构建,也可以基于已有的拓扑图或CMDB图谱来构建。
多条告警收敛处理后形成的一条主告警,主告警信息可以包括标识、收敛策略、压缩量、以及一些基于根因判断知识的自定义维度等信息。把主告警信息输出到通知推送系统中,根据推送策略,向运维人员推送邮件、短信、电话和第三方API发送告警通知。也可以把告警推送到根因分析模块,与知识图谱结合分析,智能识别和定位告警产生的根因问题。
本文提出了应对医疗系统海量告警风暴的告警收敛整体框架构想,通过对多个医疗系统的原始告警输入、告警相关性处理、告警收敛处理和主告警输出四个步骤,通过对原始告警的分层分组方法相关性处理,把原始告警类聚到各个业务堆栈中,再通过时间窗口、同类去重、收敛规则、基于拓扑关系等多种告警收敛算法,实现告警的收敛。目前该医疗告警收敛系统已在市\区医院医疗系统中正式上线运行,运行效果良好,能为运维人员提供简洁而准确的告警推送,提高了运维效率的同时大大降低了运维人员的告警信息分析负担。