本次专题主要包括四个方面内容,第一部分介绍AIOps平台,以及具备的能力和功能。第二部分讲解阿里云日志服务平台的作用,以及支撑AIOps的应用。第三部分为目前关注的异常检测算法的介绍。第四部分以一个实际的场景作为案例介绍流量场景中的实战,并加以分析。
本文为第三部分和第四部分,点击这里,查看第一部分和第二部分。
想看精彩直播回放,请点击这里。
以下为精彩直播内容整理:
三、异常检测算法
相关算法研究
起初的异常检测是使用统计的方法,比如统计确定时间点的流量变化。大部分人是基于指标来做,其中包括一些复杂的算法,比如局部低密度的异常点的检测算法,以及孤立森林的方法,还比如基于聚类的异常检测以及基于统计的异常检测。这些都是通过统计量分析当前统计量的偏差和概率的方法。
基于预测进行异常检测指的是,时序异常检测作为一条实际的线,线上的每个点都有值,比如一天或一个月的值,通过将过去的行为模式与当前的行为模式相比较,查看是否有偏差,如果偏差较大,则存在异常。同时,用各种各样的方法对任一条输入的序列提出一条基线,用基线的方法对比残差,通过残差的大小判别当前是否有异常。
比较新的一种方法是基于生成进行异常检测,其优势在于可以处理更复杂的形态和更大的数据量。基于预测的方法是要对数据进行一些回归的建模,但回归的建模在实际场景中不是很好用,因为实际场景中越底层的信息会有高频的噪音存在,很难得到每个曲线的趋势,基于这种情况是采用生成的方法,利用生成类似的数据,将生成正常数据与异常数据相比较,比较方式可以使基于残差的比较或者是基于重构概率的比较,从而衍生出一些模型。
由上图中的RNN和LSTM是基于预测方法所实现,VAE和WGAN是基于生成方法所实现。图中列举了一些可以查到的开源工具,Yahoo-EGADS是比较早的集成检测方法,Prophet为Facebook的预测包,主要针对统计方法所实现。Opprentice是一种学徒的方法,它集成30多种检测器用于异常检测,Anomaly Detection是Twitter开源的算法包,hawkular是Redhat的检测算法,Donut是采用生成的方法实现异常检测,Metis是Tencent的开源框架,YADING是采用异常聚类算法,能解决超大规模基于异常的问题,MoogSoft是一家海外公司,主要是做异常检测的。
异常检测算法介绍--统计方法
基于统计的方法对时序数据进行不同指标(均值、方差、散度、峰度等)结果的判别,通过一定人工经验设定阈值进行告警。同时可以引入时序历史数据利用环比、同比等策略,通过一定的人工经验设定阈值进行告警。
比如上图所指的是CPU的曲线图,出现的六种异常现象,分别为CPU变高、频率加快、峰度变化、存在间点、均值不断变换、稳定向上等现象。这些异常是可以通过检测和统计的方法解决的。通过建立不同的统计指标;窗口均值变化、窗口方差变化等可以较好的解决上图中(1、2、5)所对应的异常点检测;通过局部极值可以检测出图4对应的尖点信息,通过时序预测模型可以较好的找到图(3、6)对应的变化趋势,检测出不符合规律的异常点。
针对统计指标判断是否是异常,可以通过统计指标的检测方法,方法如下:
- N-sigma
- Boxplot(箱线图)
- Grubbs’ Test
- Extreme Studentized Deviate Test
异常检测算法介绍--无监督方法
- 什么是无监督方法:是否有监督(surpervised)主要看待建模的数据是否有标签(label)。若输入数据有标签,则为有监督学习;没标签则为无监督学习。
- 为何需要引入无监督方法;在监督建立的初期,用户的反馈是非常稀少且珍贵的,在没有用户反馈的情况下,为了快速建立可靠的监控策略,因此引入无监督方法。
- 针对单维度指标
采用一些回归方法(Holt-Winters ARMA),利用原始的观测序列学习出预测序列,通过两者之间的残差进行分析得到相关的异常。如下图所述,黑线为某KPI指标,经过去噪、去异常算法,提出基线,做预测建模,计算真实值是否在合理区间,不在合理区间范围内视为异常。其中图中的红点视为异常,在统计学上,误差是符合高斯分布的,将误差进行标准化,3σ以外占据的量是比较少的,视为异常。
- 针对多维度指标
多维度的含义是指,time,cpu,iops,flow的多维度信息。在某一个时刻所能拿到CPU的负载信息以及iops信息和流量信息,在这些信息下判断异常。
iForest(Isolation Forest)作为一种基于集成的异常检测方法。通过选择维度、空间划分的策略将数值信息在空间中做切割,切割的点是稀疏的则视为异常。每次随机的选择某个维度,通过做集成都会产生低密度区,则低密度区所覆盖的时刻点视为异常点。如上图所示,每个树是独立的,可以高效的运行,并且在任何节点都可以建立一颗树,也可以横向扩展。但是不太适合高纬度的数据,因为高维度的数据没有进行去噪音等操作。原始iForest算法仅对全局异常敏感,对局部相对稀疏的点敏感度较低。
- 深度学习异常检测(Donut)
针对论文《Unsupervised Anomaly Detection via Variational Auto-Encoder for Seasonal KPIs in Web Applications》(WWW 2018)做出相关介绍:
目前针对单维度的时序异常通常采用生成模型的方法比较好,针对的数据是具有周期性的,但数据中可能包含一些缺失点和异常点,比如流量信息缺失是因为存在异常,或者CPU不稳定。
上图中橙色线表示的点视为异常点,红色点相当于缺失点。模型训练结构如下图所示。
检测时使用了MCMC填补的技术处理观测窗口中的已知缺失点,核心思想根据已经训练好的模型,迭代逼近边际分布(下图表示MCMC填补的一次迭代示意图)
其中x=(x0,xm)为有缺失序列,x’=(x0,x’m)在缺失模型下认为的合理值。针对较平滑数据的处理是比较好的,但是对于高频数据的处理不是很好。
异常检测算法介绍—有监督方法
如上图所示为打标的链路流程图。标注异常是一件很复杂的事,可以从以下几个方面说明:
- 用户定义的异常往往是从系统或者服务角度出发,对数据进行打标,所关联的底层指标、链路指标繁杂,无法从几个维度出发(更多的是系统的一个Shapshot)
- 在进行架构层设计时,都会进行服务自愈设计,底层的异常并未影响到上层业务
- 异常的溯源很复杂,很多情况下,单一监控数据仅是异常结果的反应,而不是异常本身
- 打标样本数量很少,且异常类型多样,针对小样本的学习问题还有待提高
常用的监督方法有Xgboost、DNN。
SLS中提供的算法能力
阿里云中提供的时序分析算法包括:预测算法、异常检测算法、多周期检测算法以及时序聚类算法,都属于线上算法。
如上图为异常检测图,提供错误量的信息,经过异常检测之后,红点标注的视为异常。模式分析涉及到频繁模式的挖掘和差异模式的挖掘。此外,还有海外文本的智能聚类算法,其优点是速度快,并且不会遗漏任何的模式,会覆盖到全量的数据,对亿级数据可以秒级出结果。模式方面还需要调整,比如提供一些白名单以及针对某些字段做聚类。
四、流量场景实战分析
上图为阿里云服务里的原始日志内容,涉及到几个字段,包括clent_os客户端的操作系统,domain域名,error_message,falled_cnt相当于一分钟之内播放失败的次数,first_play_cnt为首播失败的次数,isp运营商,name留名,net用户网络的介入,province地区,station_isp为哪个运行商提供的服务。业务指标分为各维度的卡顿率(buffer_rate)、各维度的丢帧率(fail_rate)、首帧播放延时。
实时地统计每分钟指标的大小,根据业务算出卡顿率或者失败率,之后得到一组信息,包括每一个时刻的各个维度的信息,展示在如下图中。要得到之前的信息,包括当前某个时间点对应的信息,利用ts_compare方法得到前一天对应的统计值信息,通过log_cnt将统计值拆分出来,做一些解析的策略,可得出下图可视化的图标。
想要查看维度或者卡顿率和失败率,可以通过下图所示的方式。其中show_index作为一个公共替换的变量,下图展示的维度就是show_index,通过下拉框实现更新图表的能力。
异常检测部分在平台中的实现如下图所示。其中vaild_unit是指,当前有1000个域名,100个城市,不是每个城市都很重要,比如有的城市每秒钟播放的数量可能特别少,只有200,其服务质量可以得到保证。Check_window是指关心历史的长度(当前的观测点再向前5个点)。Alpha是用来控制区间的大小。
最核心的代码如下图所示,第一部分代码的作用是指在批量检测中,剔除掉数据量少的省份。第二部分代码的作用是计算相关指标的逻辑代码。第三部分代码的作用是针对得到的批量时序曲线,进行巡检操作,并将检测结果由列转换成行。第四部分代码的作用是通过指导的参数将满足的检测结果过滤出来。
针对单条时序曲线进行异常检测代码如下:
针对N条时序曲线进行批量检测代码如下:
对批量检测结果的格式转换代码如下:
扫描下方二维码,加入开发与运维钉钉交流群,查看更多精彩内容。