现有技术
基于实时数据监控,目前也有一些开源的架构提供相应的监控告警以及可视化页面数据展示的功能,例如Prometheus和Zabbix,提供了数据计算和数据可视化功能。很多时候我们都需要使用调度任务,按照指定周期执行对应的应用程序,简单的可以借助Spring的定时任务完成,复杂的可以借助一些通用的调度任务框架,例如XXL-JOB。使用Spring调度任务时,需要考虑分布式加锁机制,防止不同的服务器同时运行对应的调度任务,同时,当相关机器有问题时,要完成程序的自动切换。对于XXL-JOB架构的使用,需要搭建对应的服务,当我们简单的程序应用时,投入成本就比较大了。
解决方案
针对我们对实时数据指标监控告警功能的使用功能角度出发,在我们现有数据指标计算的基础上,搭建一套灵活完整的数据监控告警体系,一方面防止数据重复写入浪费资源,另一方面针对现有实时数据指标结果信息完成告警监控。
方案详情
1、告警规则后台管理模块
告警规则后台管理模块包含三部分:业务指标、告警规则、用户组
- 1)业务指标:主要是存储对应需要监控的指标维度计算的信息,用来查询底表数据,完成数据值预警,其中涉及对应业务维度、指标类型(例如PV、UV)、对比类型(例如同比、环比等)、时间粒度(例如5分钟、10分钟、天等)、指标阀值(具体指标计算之后的对比数值)、业务表等,其中重要参数配置有两个:规则key(rule_key)、分组,这两个字段主要是用在调度任务中,用来防止重复查询以及充当ha任务分发角色
- 规则key(rule_key):主要是基于业务维度_对比类型_时间粒度形成的唯一key,确保每个底表基于维度规则有唯一的规则key,这样可以防止在调度任务数据查询模块中对应规则重复查询,造成查询性能问题
- 分组:实现方式是在指定数值范围内生成的随机数,这个主要是在调度任务查询模块中使用的,对不同的分组配置不同的调度任务,为了提高系统并法度而设置
- 2)告警规则:主要针对告警配置的管理,涉及告警级别、触发次数、告警时间、通知方式等
- 3)用户组:主要是针对业务指标生成的告警规则通知的用户群体,用来完成消息通知,不同的用户组可以绑定不同的业务指标告警规则
2、调度任务数据查询模块
基于告警规则后台管理模块中配置的告警规则,周期调度查询,生成对应的指标结果信息
- 1)调度任务按照对比类型+时间粒度+分组的方式进行配置,基于查询的rule_key进行SQL查询组装,查询出该规则下最近五个时间维度下的所有指标数据信息
- 2)查询出结果信息,对应存储规则如下:
例如,假设存在业务维度,对应维度名称为站点,该站点下存在不同的值(APP、微信、PC),用户配置的站点维度值为APP主站,对比同比昨天5分钟维度的数据,则生成的rule_key为 : APP主站_同比昨天_5分钟,查询该rule_key下对应表数据结果信息如下:
{
"rule_key": "APP_同比昨天_5分钟",
"today": {
"202209021000": {
"pv": 111,
"uv": 1
},
"202209021005": {
"pv": 222,
"uv": 2
},
"202209021010": {
"pv": 333,
"uv": 3
},
"202209021015": {
"pv": 444,
"uv": 4
},
"202209021020": {
"pv": 555,
"uv": 5
}
},
"compared": {
"202209011000": {
"pv": 111,
"uv": 1
},
"202209011005": {
"pv": 222,
"uv": 2
},
"202209011010": {
"pv": 333,
"uv": 3
},
"202209011015": {
"pv": 444,
"uv": 4
},
"202209011020": {
"pv": 555,
"uv": 5
}
}
}
其中today为当天时间数据,compared为对比时间,存储最近五个时间段的数据
- 3)将生成的结果信息发送给规则服务处理模块
3、规则服务处理模块
收到调度任务数据查询模块生成的结果信息后,对该结果进行分析,满足告警条件的信息发送到消息通知服务模块
- 1)基于rule_key查询对应所有生效的规则,并获取告警指标阀值数据(生效条件:a、状态可用;b、当前时间在告警时间范围内)
- 2)基于告警值判断是否触发告警规则
用户对应规则触发结果保存在redis中,其中redis key为:{rule_key}_{用户组}_{规则ID},结果为触发的{次数}_{触发状态(是否已触发)}
- i. 根据获取的最新的指标信息,同比告警阀值的值,如果数值对比满足触发条件
- 从redis中获取该规则累计触发的数值,如果不存在,数值为1,存在,在原有的基础上数值累加+1,获取最新数值
- 判断是否持续告警参数,如果持续告警,发送告警信息到消息通知服务模块,非持续告警,判断是否是首次触发,首次触发则发送告警信息到消息通知服务,否则不做处理,对应最新数值存储到redis中
- ii. 不满足阀值告警触发条件,如果存储的数值已经触发告警阀值并已发送过告警信息,则发送解除告警信息到消息通知服务模块,同时删除redis中的数据,如果未触发过告警阀值,删除redis中的数据
4、消息通知服务模块
接收到规则服务处理模块发送过来的数据,根据用户配置的消息发送形式,组装发送消息信息,将告警规则发送给对应用户
通过上面四个步骤,实现了实时数据指标层面的告警功能,当然为了加快查询速度,可以将告警规则管理模块中配置的规则存储到redis中,每次有修改同步进行更新,这样在调度任务数据查询模块、规则服务处理模块中使用数据时可以直接从redis中获取数据,增加数据处理速度。