源码角度了解Skywalking之告警机制是怎么实现的
我们在使用Skywalking的时候有没有想过它的告警机制是怎么实现的呢,本篇文章就介绍一下它的告警机制的实现机制
skywalking插件的源码部分在server-alarm-plugin 模块中
告警初始化
AlarmModuleProvider的prepare()方法进行了告警的初始化
@Override public void prepare() throws ServiceNotProvidedException, ModuleStartException { Reader applicationReader; try { applicationReader = ResourceUtils.read("alarm-settings.yml"); } catch (FileNotFoundException e) { throw new ModuleStartException("can't load alarm-settings.yml", e); } RulesReader reader = new RulesReader(applicationReader); Rules rules = reader.readRules(); alarmRulesWatcher = new AlarmRulesWatcher(rules, this); notifyHandler = new NotifyHandler(alarmRulesWatcher); notifyHandler.init(new AlarmStandardPersistence()); this.registerServiceImplementation(MetricsNotify.class, notifyHandler); }检查是否触发告警
AlarmCore是警报核心类,它的start()方法设置的固定线程池,每隔10s执行一次检查的线程,具体逻辑是当前时间与上次告警相差一分钟的时候调用RunningRule的check()方法进行告警检查,返回告警信息集合,如果集合不为空,就调用WebhookCallback和AlarmStandardPersistence的doAlarm()方法发送告警信息。
发送告警信息
AlarmStandardPersistence和WebhookCallback都是AlarmCallback接口的实现类
告警信息持久化
AlarmStandardPersistence将警报信息保存到数据库中持久化以供 UI 查询,它的doAlarm()方法具体逻辑是创建AlarmRecord对象,将告警信息保存到AlarmRecord中,然后通过RecordStreamProcessor进行持久化操作
发送告警信息给第三方
WebhookCallback是使用 SkyWalking 报警 webhook API 调用远程端点的类,第三方的告警地址同样是在alarm-settings.yml文件中配置,配置信息如下:
alarm-settings.yml文件:
webhooks: - http://127.0.0.1/notify/ - http://127.0.0.1/wechat/文件信息会解析放入到Rules类中的webhooks集合中,WebhookCallback的doAlarm()方法的具体逻辑就是构建http请求,携带告警信息发送Http请求给第三方
总结
这篇文章我们分析了skywalking的告警信息是怎么实现了,从告警的初始化过程,检查是否触发告警条件和具体发送告警信息,涉及到一个alarm-settings.yml配置文件,告警的初始化主要是加载配置文件中定义的告警规则,检查告警主要是通过定时线程池每隔10s创建线程来检测是否满足告警条件,具体是由RunningRule的check()方法来实现,告警信息可以通过AlarmStandardPersistence放入数据库中,也可以通过WebhookCallback来发送给第三方。
❤️ 感谢大家
如果你觉得这篇内容对你挺有有帮助的话: