干货 | 故障召回率提升34%,携程智能异常检测实践 - 携程技术
作者简介
零一,携程算法工程师,专注于智能告警、容量管理、根因定位等领域。
一、背景
携程作为在线旅游公司,对外提供机票、酒店、火车票、度假等丰富的旅游产品,其系统稳定性关乎用户是否具有顺滑的出行体验。然而,流量激增、代码发布、运维变更等都会给系统稳定性带来挑战。
我们在2020年对生产故障的“发现-定位-解决效率”提出了“1-5-10”的目标(即一分钟发现故障,五分钟定位故障,十分钟解决故障),这无疑对监控告警提出了很高的要求。订单量是生产故障异常检测场景中最核心最显性的指标,订单量在自身形态上具有周期性、规律上升和下降、业务高峰和低谷等特点,影响因素包括节假日、促销等。倘若数以万计的业务线通过人工配置规则的方式来覆盖到所有业务场景,并且做到高准确率和召回率,是非常不现实的。因此,迫切需要一套配置费力度低、普适性强、准确率高、时效性强的智能异常检测算法体系来及时发现异常。
指标异常检测是智能运维领域的重要落地场景,携程AIOPS团队致力于提升告警质量,寻找告警效率、准确率和真实故障召回率三者之间的平衡点。我们将统计学方法和机器学习方法结合,根据指标的历史数据,将训练的多个模型组成一套异常检测系统,在覆盖真实故障的基础上,减少告警数量,产生更有价值的告警。
二、告警质量提升
2.1 更准确的预测
时序类异常检测算法通常是对指标进行预测,通过对比实际值与预测值的偏离情况来判断时刻T是否异常。与其他算法相比,时序类异常检测算法适用于更多的数据类型,并且检测效果也是最优的。
为实现对业务线的精准预测,前期我们尝试了ARIMA、Holt-Winter、LSTM等多种时间序列预测方法。携程订单业务指标具有较强的周期性,LSTM模型捕获序列长期和短期模式的特性导致其在周期性指标上的预测效果优于其他模型。我们以离当前时刻最近的10个时间序列数据作为LSTM模型的输入,采用滑动窗口不断预测未来时刻指标的取值。
在绝大多数场景下,LSTM模型的预测效果是非常好的,然而,当指标出现缓慢下跌时,由于在短时间内很难判断出异常,随着窗口的不断滑动,训练数据中包含了异常值,从而导致预测值被带偏。
为了解决这个问题,采用假设检验的方式对指标当前走势做出判断。我们认为,短期内指标的取值应具有一定的随机性,不会具有明显的上升或下降趋势。当假设检验认为指标在当前时段存在上升或下降的趋势时,不再对LSTM模型的输入数据作更新,依然采用上一个窗口的输入数据进行预测。
当假设检验认为当前数据不存在上升或下降趋势时,才会对LSTM输入数据进行更新。在做趋势分析时,不应将指标自身的趋势性包括进来,所以,我们可以利用的时间序列数据是非常有限的,此场景下,非参数检验方法要优于参数检验,因此,我们采用Mann-Whitney U统计量进行趋势分析。为了评估不同模型的性能,我们选择了三条业务线,并使用平均绝对误差(MAE)作为评估指标进行对比,实验结果表明,经过趋势分析调整的LSTM模型的MAE值最小,说明预测效果最优。
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 |
表1 不同模型的预测效果
趋势分析的引入,加强了LSTM模型的预测精度(如图1),无论是对于点异常(显著有别于其他点的数据异常)的识别还是对于连续性异常(指标在正常范围内波动,但波动模式却发生了显著变化)的识别,均做了较好的铺垫。
图1
2.2 自适应阈值计算
起初,研发人员会基于自己对业务的理解,设置“人为指定规则”的专家体系,同时,为保障故障100%召回,阈值设置的都比较敏感。该体系不仅存在准确率低、维护成本高的问题,还可能产生告警风暴,导致告警接收人警惕性麻痹,产生更严重的故障。
为解决这个问题,我们从数据本身出发,基于数据本身的波动性,构造合适的统计学模型,实现阈值的自适应计算。
为便于对异常程度进行衡量,我们定义统计量Z,假设当前值为,预测值为。当预测值与实际值很接近,Z值接近于0;偏离越大,Z的绝对值也越大(如图2)。异常事件发生的概率是非常小的,一般情况下,预测值与实际值非常接近,也就是说,不同时刻Z统计量的取值围绕X轴上下随机波动。数据分析发现,基于不同时间段计算的Z统计量的均值和方差均是一个与时间T没有关系的常数,这完全符合平稳时间序列的定义,因此,我们认为,时间序列Z属于平稳时间序列。
当数据平稳时,业界一般会对指标的分布情况做出估计,通过上限阈值或下限阈值来实现上升或下降场景的异常检测。对指标的分布情况做出估计的方法称作密度估计。统计学中,密度估计方法包括参数方法和非参数方法两种。参数估计方法假定样本服从某个分布,然后基于假定分布作出区间估计和点估计;而非参数方法一般不利用有关数据分布的先验知识,对数据分布不做任何假设,从数据本身出发做出估计。
实践证明,非参数方法核密度估计(KDE)对指标Z的拟合效果要好于高斯,因此,我们采用KDE方法对指标Z的分布情况进行估计,考虑到异常事件出现的概率远小于正常事件出现的概率,经不断验证和调整,我们一般选择99.99分位数作为异常判断的阈值。
我们发现,指标在一天内不同时间段的波动性存在显著差异,业务低谷期间指标随机性更强,波动性相对也更大一些。倘若不考虑指标在不同时间的波动性,每条业务线仅配置一个阈值,由于阈值被平均,可能导致在业务低谷期间误告增多,业务高峰时段真实故障无法被召回。
在统计学中,采用标准差和变异系数来衡量指标的波动性,相比标准差,变异系数剔除了量纲的影响,便于在不同指标间进行波动性的比较。我们基于指标在不同时段变异系数的取值情况,将一天24小时划分为低波动区和高波动区,也就是说,一条业务线只要适配两组阈值,便可做到7*24小时不间断监控。
图2
通过上述方法,实现了告警体系阈值的自适应计算和优化,告警准确性和故障召回率均有显著提升。与人为指定阈值的方式相比,故障召回率提升了34%。
2.3 业务趋势分析
我们发现,采用单一异常检测算法在多指标上很难实现通用,为进一步提升告警质量,需要结合其他算法实现异常的层层过滤。下面将讲述我们是如何利用线性回归模型对订单业务指标进行异常检测的。
宏观上看,订单随时间周期性波动,倘若将时间窗口圈定在最近的有限分钟内,便可以采用线性模型对业务趋势进行拟合。在业务高峰来临前,观测值随着时间的推移不断增加,高峰过后,观测值随时间的推移不断下降。由于Huber-Regression稳健回归算法为识别为异常点的观测值分配较小的权重,所以,无论训练数据中是否包含异常值,均能得到比较理想的回归线。
因此,我们最终采用Huber-Regression算法对指标短期窗口内的观测值进行预测分析。为了对指标在时刻T的异常情况做出判断,需要对窗口内指标的波动性进行衡量,观测点与拟合直线之间的距离是指标波动性的一种体现。对于强周期性指标,可以设置较为敏感的阈值;当指标整体量纲比较小,用户行为对曲线形态的影响较大,可以适当调低异常检测敏感度。
引入业务趋势分析,可以有效减少指标抖动产生的误报,从而提高告警准确性。业务趋势分析可以帮助我们更好地理解业务当前趋势,从而更准确地判断异常情况。通过业务趋势分析的引入,告警准确率提升了30%。
2.4 周期性异常
周期性异常是指在一定时间范围内,某个或某些指标出现了周期性的波动或变化,通常与正常的趋势和规律不符,表现为短期内突然上升或下降。周期性告警属于一种较为明显的误报,在总告警数量中占有不少比例,如果不进行有针对性解决,将会严重影响用户体验。
为了实现周期性异常的过滤,需要考虑周期性异常在时间维度上的偏移。动态时间规整(DTW)是一种用于比较两个时间序列相似性的算法,它可以对两个时间序列进行时间轴上的对齐,从而消除时间上的偏移,使得它们在时间上的对应点更加接近。为实现周期性异常的检测,可以采用以下步骤:
- 利用DTW算法实现当前时段数据和历史数据的最优匹配,从而消除时间上的偏移,提高周期性异常的检测准确性。
- 基于当前数据和最优匹配数据进行异常特征提取,例如周期、幅度、相位等,这些特征要尽可能描述当前异常。
- 使用分类算法对异常特征进行判断,从而得出当前异常是否处于周期性异常的结论。
通过上述方法,实现了对周期性异常的准确过滤,周期性误报减少80%,对于提升告警质量有非常重要的作用。
三、小结
智能异常检测系统包括线下训练和线上实时检测两部分(如图3)。由于业务变化较快,较远的历史数据参考性不大,因此采用14天的历史数据训练预测模型和自适应计算阈值。
历史数据需要进行预处理,主要包括以下几个方面:
1)异常事件产生的异常数据需要剔除,比如,RCA时间段、秒杀、考试等外面事件引起指标的突升。同时,采用滑动窗口的方式对异常区间进行缺失值补全。
2)为增强模型鲁棒性,消除数据毛刺点产生的影响,使用滑动窗口对数据进行平滑处理。
3)对数据进行归一化处理,保证LSTM预测模型能够快速收敛,提高模型预测精度。
线上检测算法包括:基线预测模块和无监督异常检测方法集。基线预测模块的主要功能是时间序列预测和异常特征提取,无监督异常检测方法集包括一些统计类异常检测算法,如Boxplot、K-sigma、KDE。无论是点异常还是连续性异常,均会基于异常特征集,采用多种无监督检测方法实现检测,最终以投票的方法得出时刻T是否异常的结论。
图3
智能异常检测系统在携程投入使用三年有余。在这期间,我们有遇到各式各样的挑战。经过千锤百炼,取得了不错的效果。告警准确率和召回率均有了显著提升,大部分故障可以在一分钟内被发现。