监控平台的设计缺陷

监控指标采集(WarningLog) -> 规则验证 (WarningRuleRecord)-> 通知记录(WarningEvent)

报警规则
报警的触发条件和通知方式。

报警事件 WarningRuleRecord
系统每隔1分钟,就会根据报警规则中设置的报警触发条件,判断指标是否触发报警。如果触发,则会生成一个报警事件记录。

通知记录 WarningEvent
报警事件生成之后,系统会根据报警规则中设置的报警生效时段和报警间隔,判断是否发送报警通知(电话、短信、钉钉群机器人)给您。如果发送,则会生成一个通知记录。

阈值报警
当前指标的值和阈值实时比较,如果符合设定的阈值条件,则触发报警。

1.0 监控平台之前出过的问题

虽然 之前让公元优化定时轮询的执行线程池,理论上所有定时任务都会在同一个线程池的不同线程上-一定程度上解决了之前的告警事件延时问题。默认是所有定时轮询都是一个线程执行。 导致告警事件延时。出现大量延时重复数据。

1.1 监控指标采集
WarningLog metric 收集表
type =1 业务上队列积压监控 (轮询调用队列服务,拉取)
type =2 来自队列监控 ,(推送,这个目前只有一个指标,没有插件开发收集指标问题。java这边会开发收集tps ,rt 等指标插件,详情请看https://www.jianshu.com/p/28d25a6637ff
type =3 来自采集器(拉取)
监控设计上拉取就有问题 ,70个线上指标就出现了线上指标延迟问题。如果有上万个线上指标呢。

通过分布式lock ,定时轮询监控指标通过3种不同方式,进行收集批量写入WarningLog 表 。

性能上 ,不管有多少pod , 同时执行的只有一个pod的一个线程池 。性能上,无扩展的能力 。
而且目前收集都采用的拉的方式,一旦某个服务不可用,会阻塞当前执行线程。收集的数据量很大的情况 ,必然会导致数据收集端的延时 。所以线上对接的业务指标还不是很多,大概60,70个。没有服务metric 指标等,和以前公司几十万个服务监控指标差距还是很大的,目前作用其实也不大。

1.2 监控规则

监控规则采用 自定义 @Async 方式,执行规则将符合规则的告警数据插入告警规则表WarningRuleRecord中, @Async大量存在与j37代码中。所有异步接口代码都公用一个线程池 ,随着未来规则越来越多,必然会存在着上一个监控规则轮询没有执行完 ,下个规则轮询就开始的问题.随着累积的加剧 ,后期必然会影响其他的异步方法调用。
目前线上已经出现了积压情况。值得警惕

j37-51-6988d5667c-dtc22 | online | 10.66.1.207 | cn-zhangjiakou.10.63.97.203 | 线程池 async-service- 中队列积压任务数量为 71

1.3 告警
通过告警规则找到对应告警规则记录WarningRuleRecord,通过告警通知合并策略以及通知策略。下推通知WarningEvent给用户
代码规范真的蛮弱的 , 0,6 表示类别,状态, 还是蛮难看懂的

      query.setIsDelete(0);
    query.setStatus(0);
    query.setCreateDate(beforeTime);
    query.setRuleId(warningRule.getId());
    query.setWarningServiceId(warningRule.getWarningServiceId());
    List<WarningEvent> eventList = eventMapper.queryByWarningServiceId(query);
    if (CollectionUtils.isNotEmpty(eventList)) {
        for (WarningEvent item : eventList) {
            WarningEventOperation eventOperation = new WarningEventOperation();
            eventOperation.setIsDelete(0);
            eventOperation.setEventId(item.getId());
            eventOperation.setType(6);

1.4 过期数据清除
虽然通过分布式lock ,但依然会有多个pod 同时执行dataclean任务,这里让我不得不怀疑分布式lock 有没有作用。


attach_169594cef5439b28.png

从清除数据上可知 ,每天凌晨2点线上清除的数据在 16w 级别 ,数据量不大。

1.5 通知流程

下面是实现代码

/**
 * 每天凌晨2:00清理数据
 */
@Scheduled(cron = "0 0 2 * * ?")
private void dataClean() {
    redisLockUtil.executeWithLock("data:clean:cron:Lock", () -> {
        // 定时清理主无效的(告警规则运行记录)
        warningCronService.dataClean();
    });
}
/**
     * 整分钟00秒运行
     */
    @Scheduled(cron = "0 */1 * * * ?")
    private void executeLogCollectCron() {
        redisLockUtil.executeWithLock("warning:Collect:Execute:Lock111", () -> {
            // 告警规则运行周期(整分钟00秒运行)
            warningCronService.excute();

            //告警日志数据采集器(周期性采集数据)
            warningCronService.executeLogCollect();

            //防止异步方法过快释放分布式锁 (任务运行多次)
            waitReleaseLock(1);
        });
    }

    /**
     * 整分钟00秒运行
     */
    @Scheduled(cron = "0 */1 * * * ?")
    private void executeLogCollectCron() {
        redisLockUtil.executeWithLock("warning:Collect:Execute:Lock111", () -> {
            // 告警规则运行周期(整分钟00秒运行)
            warningCronService.excute();

            //告警日志数据采集器(周期性采集数据)
            warningCronService.executeLogCollect();

            //防止异步方法过快释放分布式锁 (任务运行多次)
            waitReleaseLock(1);
        });
    }

    /**
     * 整分钟30秒运行
     */
    @Scheduled(cron = "30 */1 * * * ?")
    private void executeExcuteCron() {
        redisLockUtil.executeWithLock("warning:Excute:Execute:Lock", () -> {
            //每1分钟通过接口调用,获取队列积压数据&(记录最大历史积压值)
            warningCronService.executeQueueWarning();
        });
    }

    /**
     * 每三十秒检测是否有待接收事件需要发送消息(包括轮询消息和合并后消息)
     */
    @Scheduled(cron = "0/30 * * * * ?")
    private void sendQueueMessage() {
        redisLockUtil.executeWithLock("send:Queue:Message", () -> {
            // 三十秒一次检测队列事件是否超过合并周期(超过周期就发送预警消息)
            warningCronService.sendQueueMessage();
            // 三十秒一次检测普通事件是否超过合并周期(超过周期就发送预警消息)
            warningCronService.sendMessage();
            // 轮询发送消息
            warningCronService.sendMoreMessage();
        });
    }

    /**
     * 每天凌晨2:00清理数据
     */
    @Scheduled(cron = "0 0 2 * * ?")
    private void dataClean() {
        redisLockUtil.executeWithLock("data:clean:cron:Lock", () -> {
            // 定时清理主无效的(告警规则运行记录)
            warningCronService.dataClean();
        });
    }

    private void waitReleaseLock(int i) {
        try {
            Thread.sleep(i * 1000);
        } catch (Exception e) {
        }
    }

    /**
     * 从队列里面获取
     */
    @Scheduled(cron = "0/30 * * * * ?")
    public void queueCollect() {
        if (!queueCollectFlag) {
            return;
        }
        redisLockUtil.executeWithLock(QUEUE_COLLECT_REDIS_KEY, () -> {
            warningCronService.exportLogFromQueue();
        });
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,711评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,932评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,770评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,799评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,697评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,069评论 1 276
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,535评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,200评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,353评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,290评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,331评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,020评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,610评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,694评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,927评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,330评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,904评论 2 341

推荐阅读更多精彩内容