关于KPI异常检测,我们应该这样做_离线

各行业信息化程度迅猛发展的今天,各大企业的信息系统也日趋庞大和复杂。

为了保证系统的正常运行,企业的运维人员会通过相应的KPI(Key Performance Indicator, 关键性能指标)对系统进行监控。当某些KPI发生异常时,能够及时发出告警,通知相关人员。

一、监控告警系统的数据检测现状

现有的监控告警系统大部分采用人工设定规则或阈值的方式来实现。

在某些情况下,这些方法确实简单有效,但在中大型业务系统中,我们往往会面临更多的KPI数量,更复杂的KPI间的关联关系,以及更多样性的KPI型态(如下图所示:恒值型、周期型、持续波动型等)。

关于KPI异常检测,我们应该这样做_异常检测_02

不同KPI型态对比

面对这样的场景,若继续采用人工设定规则或阈值的方法进行检测,不仅会消耗大量的时间成本,而且容易导致告警的误报和漏报。

在引入具体检测方案之前,让我们先来了解指标异常检测。

二、单指标检测和多指标检测

在运维领域,指标异常检测根据不同场景和应用需求,可以分为单指标异常检测和多指标异常检测。

1. 单指标异常检测

检测原理:关注的是某个KPI的值是否异常。例如:KPI突变、抖动等。

异常场景:单指标异常主要是KPI值突然发生了较大变化。例如:CPU使用率突然增加、内存突然降低等。

检测方法:在工业界,单指标异常检测主要有基于统计学和预测的两种方法。

基于统计学的方法通常是设定阈值判断是否异常。

例如:3sigma等。若KPI超过阈值,则判断为异常,反之则正常。

基于预测的方法是通过建模并预测KPI曲线,根据预测值与实际值之间的误差大小判断是否异常。

例如:ARIMA等。若误差较大,则判断为异常,反之则正常。

本次,我们对单指标异常检测不做过多探讨。

2. 多指标异常检测

检测原理:关注的是某个实体的状态是否异常。如:服务器、设备等。

异常场景:多指标异常检测场景主要有两种情况。

第一种情况是尽管每个KPI看起来可能并没有异常,但综合多个KPI来看,可能就是异常的。

例如:一个人的身高是185cm,体重是50kg,分别看身高和体重,均是正常的,但这个人脂肪率严重偏低,因此我们判断这个人的身体很可能出现异常。

第二种情况是有些单个KPI表现异常,但整体来看可能又是正常的。

例如:一个人去体检,他在测心率时比较紧张,导致心跳加快,从心率KPI来看,这个人有可能发生了异常,但其他KPI均正常,从医生的角度判断,这个人体检是正常的。

检测方法:与单指标序列相比,多指标序列具有维度高、数据量大、指标间关系复杂等特性。主要有两种思路:

第一种思路是将多指标序列划分成多个单指标序列,利用单指标异常检测方法发现异常;

第二种思路是直接分析多指标序列,如将多指标序列按形状或时间分成多个子序列,同时结合聚类等算法发现异常。

针对多指标异常检测,第一种思路相对成熟,但这种思路会丢失指标间的关联性信息,同时对每个KPI进行建模会带来更高的成本。

因此,检测方案将围绕多指标异常检测的第二种思路进行展开。

三、多指标异常检测分析方案

该分析方案包括离线过程和在线过程,主要是通过判断多指标间的变量关系是否被打破来进行异常检测。

若多指标间的变量关系被打破,则判断为异常,反之则正常。发现异常后,会对异常的KPI进行故障定位。(分析方案流程图如下图)

关于KPI异常检测,我们应该这样做_离线_03

分析方案流程图

方案流程

1. 离线过程

● 基于SBD的DBSCAN聚类

使用基于SBD的DBSCAN聚类算法将相似指标聚类,可以降低分析框架的复杂度,并且将相似形状的指标聚类到同一类中。

● SARIMAX建模

随后,在聚类后的每个簇中,对两两指标建立SARIMAX模型,构建指标间的不变量关系。不变量关系指时间序列间存在着不会随时间变化的关系,如指标1为sin(t)和指标2为sin(3t)的关系。

2. 在线过程

异常检测

通过计算两两指标间的残差得分,再根据指定阈值判断不变量关系是否被打破。若残差得分超过阈值,则认为不变量关系被打破,即该指标对存在异常,反之则不存在异常。

可视化不变量关系图

对离线学习和在线学习的不变量关系图进行绘制,可视化异常检测结果。

故障定位

对所有被打破的不变量关系采用改进的PageRank算法进行故障定位。

验证方案

为保证该方案行之有效,我们获取了某系统多个KPI数据进行验证。

首先,观察历史KPI时序数据,存在部分数据形状相似,在经过聚类后,将具有相似形状的KPI分为一个类型,其他KPI归为噪音簇类。下图中左侧为部分原始时序图,右侧为聚类后的时序图。

关于KPI异常检测,我们应该这样做_聚类_04

原始时序图和聚类时序图

接着,对每个簇类的KPI构建不变量关系模型,根据实时数据判断预测。

如下图中,左侧为在离线过程中,构建变量间的不变量关系图,并对簇类1和簇类2的中心点分别与噪音簇类构建不变量关系图;右侧为在线过程中,判断不变量关系是否被打破,如类簇1中6->4、6->17的不变量关系被打破,并通过PageRank算法将指标6定位为根因。

关于KPI异常检测,我们应该这样做_离线_05

离线不变量关系图和在线不变量关系图

另外噪音簇类的大部分不变量关系均被打破,可根据实际业务确定是否分析噪音簇类

本文介绍了通过构建不变量关系进行多指标异常检测可以处理大部分的异常场景,无论是单个指标异常,整体正常,还是单个指标正常,整体异常,均能有效的检测。 在运维领域中,异常检测是其他AIOps场景建设的基础,异常检测的结果将为后续的告警压缩、故障定位、故障自愈等场景提供重要输入。