作者简介
零一,携程算法工程师,专注于智能告警、容量管理、根因定位等领域。
一、背景
二、告警质量提升
2.1 更准确的预测
时序类异常检测算法通常是对指标进行预测,通过对比实际值与预测值的偏离情况来判断时刻T是否异常。与其他算法相比,时序类异常检测算法适用于更多的数据类型,并且检测效果也是最优的。
为实现对业务线的精准预测,前期我们尝试了ARIMA、Holt-Winter、LSTM等多种时间序列预测方法。携程订单业务指标具有较强的周期性,LSTM模型捕获序列长期和短期模式的特性导致其在周期性指标上的预测效果优于其他模型。我们以离当前时刻最近的10个时间序列数据作为LSTM模型的输入,采用滑动窗口不断预测未来时刻指标的取值。
在绝大多数场景下,LSTM模型的预测效果是非常好的,然而,当指标出现缓慢下跌时,由于在短时间内很难判断出异常,随着窗口的不断滑动,训练数据中包含了异常值,从而导致预测值被带偏。
为了解决这个问题,采用假设检验的方式对指标当前走势做出判断。我们认为,短期内指标的取值应具有一定的随机性,不会具有明显的上升或下降趋势。当假设检验认为指标在当前时段存在上升或下降的趋势时,不再对LSTM模型的输入数据作更新,依然采用上一个窗口的输入数据进行预测。
ARIMA |
Holt-Winter |
LSTM |
LSTM-Adjust |
|
AA业务线 |
0.01519 |
0.02024 |
0.01995 |
0.01483 |
BB业务线 |
0.02975 |
0.03064 |
0.02919 |
0.02612 |
CC业务线 |
0.02314 |
0.02542 |
0.02108 |
0.01690 |
趋势分析的引入,加强了LSTM模型的预测精度(如图1),无论是对于点异常(显著有别于其他点的数据异常)的识别还是对于连续性异常(指标在正常范围内波动,但波动模式却发生了显著变化)的识别,均做了较好的铺垫。
当数据平稳时,业界一般会对指标的分布情况做出估计,通过上限阈值或下限阈值来实现上升或下降场景的异常检测。对指标的分布情况做出估计的方法称作密度估计。统计学中,密度估计方法包括参数方法和非参数方法两种。参数估计方法假定样本服从某个分布,然后基于假定分布作出区间估计和点估计;而非参数方法一般不利用有关数据分布的先验知识,对数据分布不做任何假设,从数据本身出发做出估计。
实践证明,非参数方法核密度估计(KDE)对指标Z的拟合效果要好于高斯,因此,我们采用KDE方法对指标Z的分布情况进行估计,考虑到异常事件出现的概率远小于正常事件出现的概率,经不断验证和调整,我们一般选择99.99分位数作为异常判断的阈值。
我们发现,指标在一天内不同时间段的波动性存在显著差异,业务低谷期间指标随机性更强,波动性相对也更大一些。倘若不考虑指标在不同时间的波动性,每条业务线仅配置一个阈值,由于阈值被平均,可能导致在业务低谷期间误告增多,业务高峰时段真实故障无法被召回。
在统计学中,采用标准差和变异系数来衡量指标的波动性,相比标准差,变异系数剔除了量纲的影响,便于在不同指标间进行波动性的比较。我们基于指标在不同时段变异系数的取值情况,将一天24小时划分为低波动区和高波动区,也就是说,一条业务线只要适配两组阈值,便可做到7*24小时不间断监控。
图2
通过上述方法,实现了告警体系阈值的自适应计算和优化,告警准确性和故障召回率均有显著提升。与人为指定阈值的方式相比,故障召回率提升了34%。
2.3 业务趋势分析
我们发现,采用单一异常检测算法在多指标上很难实现通用,为进一步提升告警质量,需要结合其他算法实现异常的层层过滤。下面将讲述我们是如何利用线性回归模型对订单业务指标进行异常检测的。
宏观上看,订单随时间周期性波动,倘若将时间窗口圈定在最近的有限分钟内,便可以采用线性模型对业务趋势进行拟合。在业务高峰来临前,观测值随着时间的推移不断增加,高峰过后,观测值随时间的推移不断下降。由于Huber-Regression稳健回归算法为识别为异常点的观测值分配较小的权重,所以,无论训练数据中是否包含异常值,均能得到比较理想的回归线。
因此,我们最终采用Huber-Regression算法对指标短期窗口内的观测值进行预测分析。为了对指标在时刻T的异常情况做出判断,需要对窗口内指标的波动性进行衡量,观测点与拟合直线之间的距离是指标波动性的一种体现。对于强周期性指标,可以设置较为敏感的阈值;当指标整体量纲比较小,用户行为对曲线形态的影响较大,可以适当调低异常检测敏感度。
引入业务趋势分析,可以有效减少指标抖动产生的误报,从而提高告警准确性。业务趋势分析可以帮助我们更好地理解业务当前趋势,从而更准确地判断异常情况。通过业务趋势分析的引入,告警准确率提升了30%。
2.4 周期性异常
周期性异常是指在一定时间范围内,某个或某些指标出现了周期性的波动或变化,通常与正常的趋势和规律不符,表现为短期内突然上升或下降。周期性告警属于一种较为明显的误报,在总告警数量中占有不少比例,如果不进行有针对性解决,将会严重影响用户体验。
为了实现周期性异常的过滤,需要考虑周期性异常在时间维度上的偏移。动态时间规整(DTW)是一种用于比较两个时间序列相似性的算法,它可以对两个时间序列进行时间轴上的对齐,从而消除时间上的偏移,使得它们在时间上的对应点更加接近。为实现周期性异常的检测,可以采用以下步骤:
-
利用DTW算法实现当前时段数据和历史数据的最优匹配,从而消除时间上的偏移,提高周期性异常的检测准确性。 -
基于当前数据和最优匹配数据进行异常特征提取,例如周期、幅度、相位等,这些特征要尽可能描述当前异常。 -
使用分类算法对异常特征进行判断,从而得出当前异常是否处于周期性异常的结论。
三、小结
智能异常检测系统包括线下训练和线上实时检测两部分(如图3)。由于业务变化较快,较远的历史数据参考性不大,因此采用14天的历史数据训练预测模型和自适应计算阈值。
历史数据需要进行预处理,主要包括以下几个方面:
1)异常事件产生的异常数据需要剔除,比如,RCA时间段、秒杀、考试等外面事件引起指标的突升。同时,采用滑动窗口的方式对异常区间进行缺失值补全。
2)为增强模型鲁棒性,消除数据毛刺点产生的影响,使用滑动窗口对数据进行平滑处理。
3)对数据进行归一化处理,保证LSTM预测模型能够快速收敛,提高模型预测精度。
线上检测算法包括:基线预测模块和无监督异常检测方法集。基线预测模块的主要功能是时间序列预测和异常特征提取,无监督异常检测方法集包括一些统计类异常检测算法,如Boxplot、K-sigma、KDE。无论是点异常还是连续性异常,均会基于异常特征集,采用多种无监督检测方法实现检测,最终以投票的方法得出时刻T是否异常的结论。
智能异常检测系统在携程投入使用三年有余。在这期间,我们有遇到各式各样的挑战。经过千锤百炼,取得了不错的效果。告警准确率和召回率均有了显著提升,大部分故障可以在一分钟内被发现。
【推荐阅读】
“携程技术”公众号
分享,交流,成长
本篇文章来源于微信公众号: 携程技术
本文来自投稿,不代表TakinTalks稳定性技术交流平台立场,如若转载,请联系原作者。