源码角度了解Skywalking之告警机制是怎么实现的

举报
周杰伦本人 发表于 2022/10/30 18:28:21 2022/10/30
【摘要】 源码角度了解Skywalking之告警机制是怎么实现的 告警初始化 检查是否触发告警 发送告警信息 告警信息持久化 发送告警信息给第三方 总结 源码角度了解Skywalking之告警机制是怎么实现的我们在使用Skywalking的时候有没有想过它的告警机制是怎么实现的呢,本篇文章就介绍一下它的告警机制的实现机制skywalking插件的源码部分在server-alarm-plugin 模块...

源码角度了解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);
}
  1. 读取alarm-settings.yml文件,这个文件中制定了告警的规则,比如我们可以设置某个服务的响应时间超过多少秒触发告警,告警信息也可以在这个配置文件中配置
  2. 读取的文件信息会解析保存到AlarmRule对象中
  3. 接下来创建NotifyHandler对象,调用init()方法进行初始化操作,具体就是将AlarmStandardPersistence对象和WebhookCallback对象加入告警信息集合中,然后调用AlarmCore的start()方法
  4. 注册MetricsNotify的服务实现类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来发送给第三方。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。