DataLeap的全链路智能监控报警实践(三): 系统实现
系统实现
整体架构
- 基线管理模块:负责基线创建、更新、删除等操作,管理基线元信息,包括保障任务,承诺时间,余量及报警配置等);
- 基线实例生成:系统每天定时触发生成基线实例,生成实例的同时根据保障任务,由下而上逐层遍历 (BFS)所有上游任务并生成基线监控埋点。生成基线监控埋点的过程中,会计算每个任务节点的预测运行时长,承诺时间,预警时间,预警最晚开始时间,承诺最晚开始时间。此外,系统会给基线监控任务添加基线出错/变慢报警规则,当任务执行触发规则后,通过基础报警服务发送基线报警事件;
- 监控埋点校验:系统维护一个延迟队列,根据校验时间点(预警最晚开始时间,承诺最晚开始时间以及破线加剧时间校验点),定时触发监控埋点校验任务实例运行状态,如果在时间点实例未运行成功,产生基线预警/破线报警事件,发送给基础报警服务发送报警。
基线实例生成
- 每天固定时间点(如22:00),根据基线类型及业务日期生成对应的基线实例。
- 针对每一个
基线实例,系统根据该基线实例对应的监控链路(任务DAG),由保障任务为起点,自下而上逐层(BFS)计算各任务对应的监控埋点实例的校验时间节点,包括预测运行时长、预警时间、承诺时间、预警最晚开始时间,承诺最晚开始时间。
任务节点中的数字表示任务的预测运行时长,如节点A(1.5h),表示A的预测运行时长是1.5小时。
基线监控的任务链路变化了怎么办?
目前,基线监控算法是通过基线实例生成时刻该基线监控的任务链路“快照”来生成监控埋点实例的,暂未针对监控埋点生成结束后,基线覆盖的任务链路发生变化的情况进行处理。即,用户操作任务并不改变已经生成的基线监控埋点实例的信息(计算得来的各种时间及任务与基线的映射关系等),而是等到下一次生成基线实例的时候重新去计算。具体实现时,系统会将任务DAG进行缓存(1h),以提高埋点实例生成的效率。
基线覆盖的任务链路存在跨层依赖怎么办?
由于在计算监控埋点实例的时候是由下至上逐层计算的,可以理解为是个局部计算,无法获取整个任务链路的全貌。因此,如果基线覆盖的任务链路中存在跨层依赖,那么同一业务任务实例上的监控埋点的时间点需要不断更新至最早值。如下图所示,任务A依赖任务C和E,任务C依赖于任务E,而任务A又直接依赖于任务E。保障任务A的埋点实例计算结束之后,可以计算任务B、C、D、E的埋点实例信息;而当计算任务C的埋点实例信息时,任务E的埋点实例需要根据任务C的埋点实例信息进行更新。这样才能保证整个任务链路监控的合理性。
基线覆盖的任务链路存在循环依赖怎么办?
基线覆盖的任务链路中存在循环依赖,一般是由于某两个任务之间在业务时间存在offset导致的。如下图所示,比如任务B 业务时间23:00的实例依赖任务C 业务时间23:00的实例,而任务C 业务时间23:00的实例又依赖于任务A 业务时间22:00的实例。
latest_task_time)对应的埋点实例,早于latest_task_time的业务时间对应的埋点实例直接丢弃。这是考虑到对更早时间点的实例进行监控的意义不大,因为前一天的基线监控已经发现出问题并触发告警了。基线埋点校验
BaselineTimeQueue里,Delay时间节点、监控埋点实例校验阶段及对应阶段触发的报警类型三者之间的关系如下图所示:
- 基线监控埋点实例的初始阶段为基线预警校验阶段(
CHECK_START_WARNING_TIME),其Delay时间点为预警最晚开始时间(earliest_start_time_for_warning)。当到达earliest_start_time_for_warning时间节点时,监控埋点对应的任务仍未开始运行,且该任务是该基线监控链路上的首个满足条件的任务,则基线实例的状态由安全更新为基线预警,并发送基线预警报警。无论是否触发报警,监控埋点实例的状态都会从CHECK_START_WARNING_TIME流转至基线破线校验阶段(CHECK_START_COMMIT_TIME),并且重新放至延迟队列中,等待基线破线的校验。 - 当到达承诺最晚开始时间(
earliest_start_time_for_commit)时间节点时,监控埋点对应的任务仍未开始执行,且该任务是该基线监控链路上的首个满足条件的任务,则基线实例的状态由安全/基线预警更新为基线破线,并发送基线破线报警。 - 在基线破线校验结束之后,需要判断是否需要进入基线破线加剧校验阶段:
- 如果当前任务或其上游存在破线任务,且当前任务已经开始执行,则基线实例状态更新为基线破线加剧检查阶段(
CHECK_OVERTIME_INTENSIFY),Delay时间为基线破线加剧校验时间节点(overtime_intensify_time),即任务实际开始时间 + (预测运行耗时 * (1 + N%)); - 如果当前任务尚未开始执行,则基线实例状态更新为等待基线破线加剧检查阶段(
CHECK_WAIT_OVERTIME_INTENSIFY),此时Delay时间为等待基线破线校验时间节点(wait_overtime_intensify_time),即破线开始时间 + (预测运行耗时 * (1 + N%))。
- 如果当前任务或其上游存在破线任务,且当前任务已经开始执行,则基线实例状态更新为基线破线加剧检查阶段(
- 当到达
wait_overtime_intensify_time时间节点进行校验时,若任务仍未开始执行,则检查阶段保持不变,wait_overtime_intensify_time增加 30 秒,重新入队等待下次检查。 - 当到达
overtime_intensify_time时间节点进行校验时,若任务仍未运行成功,则触发基线破线加剧报警,并将基线实例的状态更新为FINISH_WITH_UNSAFE,埋点监控结束;若任务已运行成功,则不触发报警,并将基线实例的状态更新为FINISH_WITH_SAFE,监控结束。
总结
DataLeap的全链路智能监控报警实践(三): 系统实现的更多相关文章
- 京东全链路压测军演系统(ForceBot)架构解密
摘要:全链路压测是应对电商大促容量规划最有效的手段,如何有效进行容量规划是其中的架构关键问题.京东在全链路压测方面做过多年尝试,本文转载京东商城基础平台技术专家文章,介绍其最新的自动化压测 Force ...
- 基于SLF4J的MDC机制和Dubbo的Filter机制,实现分布式系统的日志全链路追踪
原文链接:基于SLF4J的MDC机制和Dubbo的Filter机制,实现分布式系统的日志全链路追踪 一.日志系统 1.日志框架 在每个系统应用中,我们都会使用日志系统,主要是为了记录必要的信息和方便排 ...
- 高德全链路压测平台TestPG的架构与实践
导读 2018年十一当天,高德DAU突破一个亿,不断增长的日活带来喜悦的同时,也给支撑高德业务的技术人带来了挑战.如何保障系统的稳定性,如何保证系统能持续的为用户提供可靠的服务?是所有高德技术人面临的 ...
- 全链路实践Spring Cloud 微服务架构
Spring Cloud 微服务架构全链路实践Spring Cloud 微服务架构全链路实践 阅读目录: 网关请求流程 Eureka 服务治理 Config 配置中心 Hystrix 监控 服务调用链 ...
- 全链路压测平台(Quake)在美团中的实践
背景 在美团的价值观中,以“客户为中心”被放在一个非常重要的位置,所以我们对服务出现故障越来越不能容忍.特别是目前公司业务正在高速增长阶段,每一次故障对公司来说都是一笔非常不小的损失.而整个IT基础设 ...
- 基于 Istio 的全链路灰度方案探索和实践
作者|曾宇星(宇曾) 审核&校对:曾宇星(宇曾) 编辑&排版:雯燕 背景 微服务软件架构下,业务新功能上线前搭建完整的一套测试系统进行验证是相当费人费时的事,随着所拆分出微服务数量的不 ...
- 融云技术分享:融云安卓端IM产品的网络链路保活技术实践
本文来自融云技术团队原创分享,原文发布于“ 融云全球互联网通信云”公众号,原题<IM 即时通讯之链路保活>,即时通讯网收录时有部分改动. 1.引言 众所周知,IM 即时通讯是一项对即时性要 ...
- <转>二十问全链路压测干货汇总(上)
本文转载自:微信公众号-数列科技<二十问全链路压测干货汇总(上)> 最近几年全链路压测无疑成为了一个热门话题,在各个技术峰会上都可以看到它的身影. 一些大型的互联网公司,比如阿里巴巴.京东 ...
- 性能利器 Takin 来了!首个生产环境全链路压测平台正式开源
6 月 25 日,国内知名的系统高可用专家数列科技宣布开源旗下核心产品能力,对外开放生产全链路压测平台产品的源代码,并正式命名为 Takin. 目前中国人寿.顺丰科技.希音.中通快递.中国移动.永辉超 ...
- C#编写Windows服务程序 (服务端),client使用 消息队列 实现淘宝 订单全链路效果
需求: 针对 淘宝提出的 订单全链路 产品接入 .http://open.taobao.com/doc/detail.htm?id=102423&qq-pf-to=pcqq.group oms ...
随机推荐
- JUC并发编程学习(十一)四大函数式接口(必备)
四大函数式接口(必备) 程序员:泛型.反射.注解.枚举 新时代程序员:lambda表达式.链式编程.函数式接口.Stream流式计算 函数式接口:只有一个方法的接口 @FunctionalInterf ...
- node 实现上传 和 下载 文件接口 简易版
var express = require('express');var fs = require('fs');var path = require('path');var multipart = r ...
- npm 发布包时 图片打包在新的项目引入不显示 路径错误解决方案
使用的是vue-cli 4.0以上脚手架 vue2.6 封装好组件后 npm publish ,在其他项目引入该组件库 图片显示失败 打开F12时看到 组件库里图片是/img/图片名,可是该项目没有此 ...
- vue 中如何使用axios调用接口
首先后端采用的是restful形式,分为了 1.post(添加)请求, 2.delect(删除)请求, 3.put(修改)请求, 4.get(查询)请求, 在vue里项目里,npm i axios - ...
- Socket.D 网络应用协议,首版发布!
有用户说,"Socket.D 之于 Socket,尤如 Vue 之于 Js.Mvc 之于 Http" 主要特性 基于事件,每个消息都可事件路由 所谓语义,通过元信息进行语义描述 流 ...
- vue-test ------class绑定
<template> <p :class="{'active':isActive}">Class样式绑定</p> <p :class=&q ...
- 9 "网址"--URI
目录 URI和URL URI详细介绍 URI的组成 URI的查询参数 URI的编码 疑问 URI和URL URI:统一资源标识符(Uniform Resource Identifier) 有两种形式: ...
- Mybatis-Flex核心功能之@Table
1.能干啥? @Table 主要是用于给 Entity 实体类添加标识,用于描述 实体类 和 数据库表 的关系,以及对实体类进行的一些 功能辅助. 例如: 数据库有一张tb_member的会员表 这时 ...
- 将Abp默认事件总线改造为分布式事件总线
@ 目录 原理 创建分布式事件总线 实现自动订阅和事件转发 使用 启动Redis服务 配置 传递Abp默认事件 传递自定义事件 项目地址 原理 本地事件总线是通过Ioc容器来实现的. IEventBu ...
- [CSP-S 2023] 密码锁
题目描述 小 Y 有一把五个拨圈的密码锁.如图所示,每个拨圈上是从 \(0\) 到 \(9\) 的数字.每个拨圈都是从 \(0\) 到 \(9\) 的循环,即 \(9\) 拨动一个位置后可以变成 \( ...