前言

服务的高可用离不开稳定的监控,如果服务出现了问题,作为开发者能第一时间发现问题,修复上线是业务止损的最好方法,随着业务飞速发展,对系统的稳定性有了更高的要求,传统的基础告警指标和触发器设计方案,在使用上存在很多限制,报警规则配置依赖开发人员主观经验,配置一条高可用规则需要多次实践,等到系统或外部依赖发生变化,又要依据新的数据调整规则,不仅开发筋疲力竭,报警的误报漏报也十分严重,面对这些问题,我们设计研发了一套智能报警系统,它与传统报警最大的不同在于它集成了机器学习算法,具有自我学习的功能,根据系统的演进自动调节阈值,能够很大程度降低误报和漏报。

数据分析

将某项目上报数据中的错误概率绘制成折线图,可以发现一些错误的规律(这里给出的是概率统计值):

从时间上看,错误概率时间序列有两个明显的特征(如上图所示):

  • 周期性。每天错误量的变化趋势都大致相同,午高峰和晚高峰样本数大,错误概率稳定在一定值,凌晨到早8点左右概率值不稳定。
  • 独立性。错误出现的概率只受系统内部的影响,不会随着流量的波动而改变,即样本足够时,概率变化可以和系统内部出现的问题一一对应。

在最开始,我们尝试用传统方案配置告警规则(如下图):

但是如果简单的根据错误个数来配置报警,业务会陷入一个矛盾:假设按照高峰期流量设置为100个异常,则低峰期不会报警,反之设置低峰期10个异常,那么高峰期会持续报警

为了解决这个问题,我们将当前时刻和前一时刻序列值比较,采用监控增速的算法,但是这种方式也没有排除周期性对数据的影响,误报率和漏报率都比较大。后期发现平台有服务提供了基线数据模型服务,基线数据模型考虑到了时间序列的周期性特征,于是我们尝试将业务数据上传到美团点评的服务治理平台,试验后发现基线模型忽略了实时性特征,导致了数据验证不及时,依旧存在大量的误报漏报,RD对于报警已经麻木,出现问题时不能及时响应,因此,急需一种新的异常检测模型,提高报警的准确率。

由于数据是时间序列模型,且具有很强的周期性,我们选择了移动平均的替代算法,三次指数平滑法三次指数平滑算法可以对同时含有趋势季节性的时间序列进行预测,该算法是基于一次指数平滑和二次指数平滑算法的。

预测器

一次指数平滑算法基于以下的递推关系:

si=αxi+(1-α)si-1

其中α是平滑参数,si是之前i个数据的平滑值,取值为[0,1],α越接近1,平滑后的值越接近当前时间的数据值,数据越不平滑,α越接近0,平滑后的值越接近前i个数据的平滑值,数据越平滑,α的值通常可以多尝试几次以达到最佳效果。

三次指数平滑累加累乘两种方法,下面是累加的三次指数平滑

si=α(xi-pi-k)+(1-α)(si-1+ti-1)

ti=ß(si-si-1)+(1-ß)ti-1

pi=γ(xi-si)+(1-γ)pi-k 其中k为周期,累加三次指数平滑的预测公式为: xi+h=si+hti+pi-k+(h mod k)

下式为累乘的三次指数平滑

si=αxi/pi-k+(1-α)(si-1+ti-1)

ti=ß(si-si-1)+(1-ß)ti-1

pi=γxi/si+(1-γ)pi-k 其中k为周期,累乘三次指数平滑的预测公式为: xi+h=(si+hti)pi-k+(h mod k),α,ß,γ的值都位于[0,1]之间,可以多试验几次以达到最佳效果。

下面给出算法的部分实现(核心部分):

function calcHoltWinters(data, st1, bt1, alpha, beta, gamma, seasonal, period, m) {var len = data.lengthvar st = Array(len)var bt = Array(len)var it = Array(len)var ft = Array(len)var ist[1] = st1bt[1] = bt1for (i = 0; i < len; i++) {ft[i] = 0.0}for (i = 0; i < period; i++) {it[i] = seasonal[i]}for (i = 2; i < len; i++) {if (i - period >= 0) {st[i] = ((alpha * data[i]) / it[i - period]) +((1.0 - alpha) * (st[i - 1] + bt[i - 1]))} else {st[i] = (alpha * data[i]) + ((1.0 - alpha) *(st[i - 1] + bt[i - 1]))}bt[i] = (gamma * (st[i] - st[i - 1])) +((1 - gamma) * bt[i - 1])if (i - period >= 0) {it[i] = ((beta * data[i]) / st[i]) +((1.0 - beta) * it[i - period])}if (i + m >= period) {ft[i + m] = (st[i] + (m * bt[i])) *it[i - period + m]}}return ft
}function getForecast (data, alpha, beta, gamma, period, m) {var seasons, seasonal, st1, bt1if (!validArgs(data, alpha, beta, gamma, period, m)) {return}seasons = Math.floor(data.length / period)st1 = data[0]bt1 = initialTrend(data, period)seasonal = seasonalIndices(data, period, seasons)return calcHoltWinters(data,st1,bt1,alpha,beta,gamma,seasonal,period,m)
}function seasonalIndices (data, period, seasons) {var savg, obsavg, si, i, jsavg = Array(seasons)obsavg = Array(data.length)si = Array(period)for (i = 0; i < seasons; i++) {savg[i] = 0.0}for (i = 0; i < period; i++) {si[i] = 0.0}for (i = 0; i < seasons; i++) {for (j = 0; j < period; j++) {savg[i] += data[(i * period) + j]}savg[i] /= period}for (i = 0; i < seasons; i++) {for (j = 0; j < period; j++) {obsavg[(i * period) + j] = data[(i * period) + j] / savg[i]}}for (i = 0; i < period; i++) {for (j = 0; j < seasons; j++) {si[i] += obsavg[(j * period) + i]}si[i] /= seasons}return si
}复制代码

我们同时实现了一个暴力枚举算法,反复拟合出最符合业务数据的参数 :[0.2 、0.1、 0.45]

预测器部分已经基本完成,接下来就是触发器相关的设计:

触发器

触发器和检测器的关系如下图所示:

当预测器通过前几天的数据分析两处理预测出当天的理想值后,触发器每隔一个时间间隔获取当天凌晨0点至触发器当前时间点的数据,理想值与真实值经过比较器处理,判断真实值是否符合预期而对应是否触发报警。

触发器的设计如下图所示:

大体上触发器做的事是——真实值与预测值对比,不满足预期则报警。为提高报警的准确度,通过对预测数据分时间段计算方差,方差越大则数据曲线波动越大。当波动程度大时,对应的时间段所设置的阈值应设置更宽避免较多的误报。则当相同时间段内预测曲线 、真实曲线的均值差大于预测曲线的某个倍数时则触发器触发报警,这就是通过离散度和预测值得到相对动态的阈值,我们目前处于当前阶段。

但是检测不同数据类型时这个倍数不同,针对不同类型的报错需要设定不同的倍数值。人工统一设定的倍数值还是不够准确,易造成漏报(倍数太大)或者误报(倍数太小)。所以对于我们来说更智能的动态阈值是能从历史数据学习到这个动态的倍数值,这是下个阶段的目标,让波动阈值区域尽量收的更紧凑。如下图曲线外包裹区域:

总结

在我们监控系统上报数据后,基于已上报的数据我们可以做智能报警,而不是再像普通的报警系统,通过大量人工针对性的分段阈值设定,过于依赖人工经验性判断。基于机器学习的智能报警会更准确和高效。当然有了数据不只是可以做智能报警,这套系统还有更多可深入挖掘和发掘的功能,智能报警只是人工智能和监控领域结合的初步成果。

基于时间序列检测算法的智能报警实现相关推荐

  1. 基于粒子群算法的智能车辆避障路径规划方法研究

    基于粒子群算法的智能车辆避障路径规划方法研究 1.环境生成 1.1 环境生成方法的选择 1.2 坐标法生成环境 1.3 车辆简化 1.4 障碍物数据 2.粒子初始化 2.1 速度迭代设置 2.2 避障 ...

  2. matlab代码:基于粒子群算法的智能微电网经济运行优化 智能微电网PSO优化算法

    matlab代码:基于粒子群算法的智能微电网经济运行优化 智能微电网PSO优化算法 基于时段电价差异,制定合理的储能系统充放电运行方式,优化各时段微电网与主网之间的交换功率,从而使得风光储微网系统综合 ...

  3. 【控制仿真】基于matlab flocking算法多智能蜂拥控制仿真【含Matlab源码 1955期】

    ⛄一.多智能体群集与避障算法研究简介 采用分散控制的策略, 将多智能体群体运动的总控制律分成三个子控制律, 即编队控制.避障控制.目标控制, 分别研究了多智能体运动中智能体之间位置和速度的协调.躲避障 ...

  4. 【微电网优化】基于粒子群算法求解智能微电网调度问题附matlab代码

    1 简介 搭建光伏,风力发电机和储能电池的数学模型.充分考虑对蓄电池的充放电保护,制定优化调度策略.应用粒子群算法(PSO)对其优化调度模型进行求解,在算法中增加了蓄电池满充满放的限制条件,同时使系统 ...

  5. 基于MSP430低功耗烟雾采集智能报警系统设计(毕设课设)

    MSP430烟雾报警器 设计基于MSP430的烟雾报警器 要求是设计尽量采取低功耗模式,延长电池使用寿命,当有烟雾产生时,报警器产生声音报警信号 #include <msp430x14x.h&g ...

  6. 基于粒子群算法的组卷系统的研究与实现

    摘 要 组卷系统的主要任务是根据用户的需要用当前数据库中的试题组成一套符合用户需求的试卷.随着数据库与题量增大,传统采用随机选取和回朔试探法的组卷抽提算法因其抽题时间长,占用的空间复杂度太大,容易陷入 ...

  7. 基于目标检测的海上舰船图像超分辨率研究

    基于目标检测的海上舰船图像超分辨率研究 人工智能技术与咨询 来源:< 图像与信号处理> ,作者张坤等 关键词: 目标检测:生成对抗网络:超分辨率 摘要: 针对海上舰船图像有效像素在整体像素 ...

  8. 解读ICDE‘22论文:基于鲁棒和可解释自编码器的无监督时间序列离群点检测算法

    摘要:本文提出了两个用于无监督的具备可解释性和鲁棒性时间序列离群点检测的自动编码器框架. 本文分享自华为云社区<解读ICDE'22论文:基于鲁棒和可解释自编码器的无监督时间序列离群点检测算法&g ...

  9. 基于时间序列的异常检测算法小结

    简介 搜罗了网上几乎所有的基于时间序列的异常检测方法,没有包括文献,整理记录一下. 综合引用以下文章: 数据挖掘导论 时间序列异常检测机制的研究 KPI异常检测竞赛笔记 异常检测之时间序列的异常检测 ...

最新文章

  1. python反射实例化_Python类反射机制使用实例解析
  2. python合并csv文件_Python学习——pandas 合并csv文件
  3. css 小知识点:inline/inline-block/line-height
  4. 中值滤波去除图像噪声的matlab程序
  5. 【英语学习】【English L06】U04 Adventure L1 I want to watch a ballet show there
  6. win7便笺元数据损坏,最新解决办法
  7. 排序算法之八 桶排序(C++版本)
  8. 使用ArcGIS提取HWSD中的土壤属性数据
  9. 熟知ios与android游戏渠道的区别,艾瑞:2013Q4中国iOS官方游戏分发渠道和Android游戏分发渠道产品榜单热门产品情况...
  10. QCC,让在学校的我们感受公司的温暖
  11. 有一天,你不上班后,打算干什么?
  12. Avatarify 爆火不到 7 天下架,抖音、快手接棒 “蚂蚁牙黑”刷屏特效制作
  13. ASP.NET MVC5 使用NPOI导出ExceL 返回浏览器下载
  14. 远程访问linux图像桌面,在windows下远程访问linux桌面
  15. Cadence Orcad Capture全局修改元件属性方法及技巧图文及视频演示
  16. python实现检查邮箱格式是否正确,并检查提交的文件格式是否正确
  17. eps提取高程点在哪里_只需一个命令,就能提取CAD图纸所有高程点坐标,感觉学费白交了...
  18. 计算机磁盘清理软件,清理磁盘空间的7种技巧,电脑装机、安装系统必备
  19. HASH和HMAC(3):SHA-1算法原理
  20. java版mc复制tnt,教程/方块和物品复制

热门文章

  1. vue使用高德地图画电子围栏_地理围栏-辅助功能-开发指南-iOS 定位SDK | 高德地图API...
  2. 在notepad++中安装jslint插件
  3. 网店分类图片生成软件
  4. 华为造车,不做搅局者
  5. netty-writeAndFlush的输出顺序
  6. 初级职称计算机成绩无法申请核查,2020初级会计考后资格审核不过怎么办?如何补救...
  7. 接口加上@Component 报错A component required a bean of type
  8. 【通用大语言模型】GLM-130B:一个开放的双语预训练模型
  9. arcgis地理参考信息模型:WMS,WFS,WCS,WMTS
  10. 2018杭州-云栖大会