基于SpringBoot的轻量非侵入式数据库数据告警器
基于SpringBoot的轻量、非侵入式数据库数据告警器
「 傍晚时分,你坐在屋檐下,看着天慢慢地黑下去,心里寂寞而凄凉,感到自己的生命被剥夺了。当时我是个年轻人,但我害怕这样生活下去,衰老下去。在我看来,这是比死亡更可怕的事。--------王小波」 我的需求:
需要写一个数据库数据监控的告警小工具,要求: 非侵入式的,对监控的数据只有查询权限,没有写权限 可以对数据表的部分数据状态,数据数量进行监控告警 监控数据,告警条件等是可配置的 我需要解决的问题:抽象告警行为,解耦告警流程构建过程 告警命中之后如何避免重复告警 可配置的部分如何从流程代码中解耦为配置 如何动态配置告警扫描计划 我是这样做的:
整体来讲,逻辑很简单,没啥技术难点,属于重复造轮子,考虑到需要解析配置文件、多数据源配置,定时任务等,所以使用SpringBoot,利用其自动化配置,类型安全配置属性,集成简单的任务调度等优点,可以方便地的配置不同的数据源,同时将复杂配置文件中的数据注入Bean中,动态配置定时计划
关于多数据源配置和类型安全配置属性等不是本文重点,这里不多讲。 编码思路:一是解耦告警器类的构建和构建步骤 二是解耦告警流程,涉及的单个行为从流程解耦,对于行为可变的部分从代码解耦为配置文件。 三是对于告警缓存的处理,非侵入式需要解决重复告警,当前集成了H2,但是没有使用,感觉有点重,所以利用 WeakHashMap 构建了一个弱键的缓存工具类来实现。 解耦告警器类的构建和构建步骤
对于告警器类的构建,涉及 初始化 和告警规则生成 两部分,初始化负责告警配置文件加载解析校验,告警规则生成负责告警流程的建立。
这里可以使用默认的初始化规则,和告警解析规程,也可以使用自定义的规则。整体上编码基于 构建者设计模式 ,类似于Spring Security配置对象 的构建
可以使用默认的告警解析流程,调用方式 alarms.alarmStart()
或者 alarms.alarmsInit(null).alarmsRun(null);
也可以通过自定义告警解析流程,这里采用函数式编程的思想,通过行为参数化的方式,可以动态编写告警解析流程。 // 告警器初始化 alarms.alarmsInit(alarmsInit -> { logger.info("告警器扫描时间周期cron:" + alarmsInit.getMinute()); alarmsInit.getAlarms().forEach((alarm -> { logger.info("加载的告警器名称:" + alarm.getItemsName()); logger.info("触发器:" + alarm.getTrigger()); logger.info("动作:" + Arrays.toString(alarm.getActions())); logger.info("告警媒介:" + Arrays.toString(alarm.getMediaType())); logger.info("告警内容:" + alarm.getMedia()); logger.info("告警短信插表SQL:" + alarm.getMediaSql()); })); return alarmsInit; // 告警规则生成 }).alarmsRun(alarmsRun -> { logger.info("告警器扫描......"); alarmsRun.getAlarms().forEach(alarm -> { Boolean boo = Long.class.cast(jdbcTemplateOne.queryForList(alarm.getTrigger()).get(0).get("isAlarms")) == 1L ? Boolean.TRUE : Boolean.FALSE; if (boo) { logger.info("告警规则命中......" + alarm.getTrigger()); Arrays.stream(alarm.getActions()).forEach(sql -> { List