实时异常预警

时间:2024-04-01 10:48:05

前言

线上业务的快速发展对系统稳定性提出了更高的要求。每次在系统出现异常波动时,如何及时、准确的发现并提醒业务方,显得尤其重要。

这里有很关键的两个要求:

  • 及时:告警对实时性要求较高,必须尽可能尽早发现问题,才能最大程度上减小损失。
  • 准确:准确的告警能提高业务方对于告警的敏感性,如果存在大量的误报,则为导致业务方对告警已经麻木,不能及时处理异常。

实时异常检测

异常识别基于历史数据,获取当前时间点的可能数值范围,当实际值在该范围以外时,即认为数据异常。

1. 同比 & 环比

最最简单的方式当然是当同比或环比变化超出某一阈值时,即认为数据异常。但是这两种方式存在一些问题:

  • 环比:仅使用当前值的上一个值,当数据出现周期性变化时,可能会出现周期性告警(如每天的4点05分有某一活动,数据周期性陡增)。
  • 同比:仅使用当前值上一周期的一个值,当某一周期数据整体性上涨时,则会持续告警(如淘宝双十一的数据比前一天同比增长很大比例)

如果将这两种方式的优势结合起来,同时考虑数据的整体变化和周期性变化,甚至考虑到历史所有的数据对于当前值的影响,预测结果的误差将会更小。

2. 预测器 & 比较器

异常检测模型分为两个部分,预测器和比较器。历史数据作为预测器的输入,输出当前时间点的预测值,并将当前时间点的预测值和真实值通过比较器检测数据是否异常。

Hot-Winters预测器

Hot-Winters又称三次指数平滑,基于历史时间序列预测当前值。它将时间序列分为三个部分,残差分量(s),趋势分量(t),周期分量(p),使用(x)表示预测值。累加式公式如下:
实时异常预警

其中,趋势分量主要表达时间序列有保持上一个变化态势的趋势,而周期分量主要表达时间序列周期性变化。

趋势变化图:
实时异常预警

周期变化图:
实时异常预警

在我们的业务中,数据存在明显的周期行变化,但不存在明显的趋势变化,所以我们考虑去除趋势分量(其中k表示周期内时间点个数,(i-k)表示上一周期当前时间点的值)
实时异常预警

α和γ则代表了历史时间序列对于当前值的影响比重,越大则表示影响越小。

最终的预测结果如下:
实时异常预警


比较器

得到预测值和真实值之后,如果检测数据异常呢?

首先猜想误差应该集中在某一个范围,通过画出误差的直方分布图发现,误差值近似于正态分布
实时异常预警

95%预测区间

对于正态分布,在统计学中有一个95%预测区间的概念,即有95%的可能性数值落在预测区间中。

95%预测区间的范围为 [μ - 1.96*δ, μ + 1.96*δ],其中μ表示期望值,δ表示标准差。

  • [μ - 1.96*δ, μ + 1.96*δ]:95%区间
  • [μ - 2*δ, μ + 2*δ]:95.44%区间
  • [μ - 2.58*δ, μ + 2.58*δ]:99%区间

所以最终采用前50个时间点的误差值来计算当前值的预测区间,超出部分则认为数据异常。


关于Hot-Winters公式,将在下一篇博客详细说明