概述
随着58集团业务的不断增长,各业务线为了解决个性化的监控需求,有一些自建的监控系统。当前自建监控系统的告警发送需求越来越多,其中很多是通用的问题。58告警开放平台主要提供了告警收敛、告警合并、告警发送(多种告警方式)等能力,业务线可以通过接口的方式快速接入自建监控系统的告警。
设计理念
1. 数据模型
数据模型的定义是否强大、是否灵活,对于开放平台接入监控的“使用效率”至关重要。开放平台的数据模型可以分为以下三部分:
• 基础数据:监控唯一标识、时间戳、监控的状态、接收人、上传数据的间隔、告警详情。
• 告警策略:告警触发条件、最大发送次数、告警发送方式、升级告警发送方式。
• 合并维度:可以根据不同的业务背景进行自定义,例如ip、集群、指标、接收人等。
通过这样的数据结构,开放平台可以接入大多数告警。
举个例子:
由上图所示,在19:30(sent_time)上传了第1个异常状态(status)的监控数据,上传数据的间隔为60秒(step),也就是第2次上传数据是在19:31,接收人是wangbin(recv_users),唯一标识(strategy_id)需要接入系统自行生成,告警详情(alarm_detail)是对监控的详细描述,提高负责人定位问题的效率。
如果上传的数据连续3次异常(func),也就是在19:30、19:31、19:32上传的数据状态都为异常,就会发送一条告警,发送告警的方式根据告警级别(priority)进行选择;如果监控持续异常,则会在发送第1次告警的5分钟后发送第2次告警,直到达到最大发送次数(max_step);达到最大发送次数后会进行告警升级、一天后还会进行告警提醒,告警升级、告警提醒发送告警的方式根据升级告警级别(upgrade_priority)进行选择。
2. 系统架构
开放告警平台主要包括数据接入、告警收敛、告警控制、告警合并、告警发送等5大核心模块(如下图),是在58监控系统核心模块的基础上以开放、通用为原则的进一步升级。
需要接入的自建监控系统只需要与数据接入模块进行对接,接入系统可以自定义告警策略、告警收敛、告警级别、告警合并的维度、告警接收人等。
• 数据接入模块负责接入其他系统的监控数据,并对接收的数据进行抽取、转换、装载。
• 告警收敛模块控制告警发送的次数、告警发送的间隔,是避免产生告警风暴的主要手段之一。
• 告警控制模块
• 根据告警接收人的信息获取接收人的联系方式(手机号、微信号、邮箱等),控制发送的告警信息的格式;
• 控制告警合并模块对原始告警信息进行告警合并的时机;
• 缓存当前异常以及为告警查询模块提供数据支持。
• 告警合并模块根据告警合并的维度,将多条原始告警信息合并为一条告警信息,在告警收敛的基础上进一步减少了发送告警的数量,而且通过各维度的汇聚可以清晰地展示出各维度服务的健康度,有利于相关负责人对故障的排查。
• 告警发送模块提供了语音、短信、微信、邮件等四种告警发送方式。
3. 稳定性
监控系统必须要有可靠的稳定性,保证系统不会因为单点故障而导致告警失效。对监控数据有行之有效的备份、恢复策略。
• 监控系统的自监控:我们使用了第三方的监控组件AntEye ,开放平台的各个模块都会提供一个描述自身服务可用性的自监控接口,AntEye服务会定时巡检、主动调用这些接口,如果发现某个接口没有如约返回"ok",就认为这个模块故障了,会通过语音、短信等方式通知相应负责人员。
• 容灾策略:核心模块同时部署多台机器,能够快速实现主备自动切换;数据接入模块与告警收敛模块之间使用一致性hash保障数据的一致性,数据传输异常时会进行失败转移,即对传输失败的数据进行二次hash后重新发送。
• 监控数据恢复:对当前异常的告警信息进行备份,单节点故障或重启时会从备份数据恢复最后一次监控的状态,减少对告警收敛的影响,避免发送重复告警。
功能设计及实践
1. 告警策略
由于对某个数据的异常判断往往与个性化的需求非常相关,告警开放平台将异常判断开放给了接入系统,即接入系统可以自行判断监控的状态(异常状态或正常状态),然后通过接口将数据的状态(例如异常状态)、告警策略(例如:连续3次异常就发送告警)等数据发送给开放平台。如果开放平台在数据上传周期内未接收到某一个监控的异常数据,那么开放平台会判定该监控已经恢复正常,并发送一条异常恢复的信息。
2. 告警收敛
自建监控系统可以在上抛的异常数据中自定义告警数据的间隔时间(例如图中为每分钟上抛一个告警数据)、告警发送的间隔时间(例如图中为5分钟发送一次)和最大告警次数(例如图中最大告警次数为3,即最多发送3次告警)。
3. 告警级别
开放平台中有4种告警发送方式:语音、短信、微信、邮件,用户可以在自建的监控系统中,在4种告警发送方式中任意选择1种至4种。例如:可以只将语音作为告警级别,或者也可以将语音、短信作为告警级别。
4种告警方式中任选1至4种,各个方式之间不是互斥的,而是可以同时并存的。因此可以使用位与计算,用一个整形值把它们同时表示出来,每一个位对应一种方式,以此来提高后端模块处理效率。
4. 告警合并
自建监控系统可以自定义告警合并维度,例如:按照集群、IP、监控指标等维度合并。
各个系统中的告警合并维度之间存在一定差异,因此告警合并模块的通用性、扩展性就尤为重要。接入模块在接受了各种维度参数之后,会转换为通用的键值对,告警合并模块参考决策树的设计理念,基于基尼指数最小化的原则,划分告警信息,自动选择合并维度,生成告警合并树。告警合并详情请查看往期文章:《智能运维-对抗告警风暴》。
5. 告警接收人
自建监控系统可以对每个告警信息自定义告警接收人,只需要在接口中提供接收人的OA用户名列表,开放平台会根据OA账号查找接收人的手机号、邮箱、微信等信息。开放平台和公司的相关系统做了数据联动,不会给已离职的接收人发送告警,避免干扰和信息泄露。
6. 查看告警
将告警信息入库,可以进行后续查询。
可以在监控系统的菜单“告警查询”-“单条告警查询”或“合并告警查询”中查看相关平台的告警记录。
7. 成功案例
目前,监控团队与框架组件部合作将服务管理平台的告警接入监控系统,对服务管理平台的告警数量做收敛和对告警信息进行合并。
根据服务管理平台的告警数据评估,接入监控系统后,能够减少85%的告警数量,并提供更高质量的告警信息。
以服务管理平台的告警为例,以下是微信告警功能的展示:左侧图是被合并后的告警信息,图中可以看到系统按照服务方的维度进行了合并;右侧图是单条告警的详情展示。
总结
开放告警平台主要提供告警收敛、告警合并、告警发送等能力,业务线的监控系统可以方便的通过接口进行接入,从而减少了各种定制化告警策略的开发代价和维护成本。
本文分享自微信公众号 - 58技术(architects_58)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。