专栏名称: HULK一线技术杂谈
HULK是360的私有云平台,丰富的一线实战经验,为你带来最有料的技术分享
目录
相关文章推荐
中金固定收益研究  ·  【中金·REITs】公募REITs周报(3. ... ·  4 天前  
中金固定收益研究  ·  【中金固收】地产仍是拖累项,政策有待发力,债 ... ·  4 天前  
格上财富  ·  日本经济为什么发展发展着就不行了? ·  3 天前  
格上财富  ·  中部大省,正在“夺”回省会 ·  3 天前  
51好读  ›  专栏  ›  HULK一线技术杂谈

AI如何动态设置报警阀值

HULK一线技术杂谈  · 公众号  ·  · 2017-06-29 18:46

正文

女主宣言

该文章出自于ADDOPS团队,是一篇关于机器学习在监控报警的阀值设置方面的实战性文章。该文章针对我们日常监控报警中(必须设置)的静态阀值的弊端,利用机器学习设置动态阀值的思路,极大的解放了运维的人力负担,能够非常有效的降低运维的误报率。所以希望能给大家有所启发。

PS:丰富的一线技术、多元化的表现形式,尽在“ HULK一线技术杂谈 ”,点关注哦!

前言

传统的异常检测系统通过设置一个固定的阈值来保证监控项处于正常水平,一旦超过设定的阈值,就会触发报警来提醒人们的注意。


静态阈值法适用于在一定范围内波动的监控项,比如磁盘使用率,CPU使用率等,但是如果遇到网络流量这种不具有明显上限,波动比较剧烈的情况,单纯利用静态阈值法如果设置的阈值比较小,会出现很多误报的情况,增加人工成本;而如果将阈值设置的比较大,又会出现漏报的情况。


所以我们提出了一个应对复杂场景的异常检测算法,它不仅考虑同期数据的情况,也会将周期性纳入考虑范围,通过设置动态阈值的方法来对异常数据进行检测。


异常检测算法

基于曲线拟合的检测方法

对于时间序列(是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列)来说,T时刻的数值对于T-1时刻有很强的依赖性。比如某个游乐园人数在8:00很多,在8:01时刻的人数很多的概率是很大的,但是如果07:01时刻人数对于8:01时刻影响不是很大。


针对最近时间窗口内的数据遵循某种趋势的现象,我们使用一条曲线对该趋势进行拟合,如果新的数据打破了这种趋势,使曲线变得不平滑,则该点就出现了异常。


曲线拟合的方法有很多,比如回归、moving average……。在这篇文章中,我们使用EWMA,即指数权重移动平均方法来拟合曲线。EWMA的递推公式是:

EWMA(1) = p(1)  // 有时也会取前若干值的平均值。α越小时EWMA(1)的取值越重要。

EWMA(i) = α * p(i) + (1-α) * EWMA(i – 1) //α是一个0-1间的小数,称为smoothing factor.

可以从上面公式得出,下一点的平均值是由上一点的平均值,加上当前点的实际值修正而来。对于每一个EWMA值,每个数据的权重是不一样的,最近的数据将拥有越高的权重。


有了平均值之后,我们就可以使用3-sigma理论来判断新的input是否超过了容忍范围。比较实际的值是否超出了这个范围就可以知道是否可以告警了。超出了上界,可能是流量突然增加了;低于下界,可能是流量突然降低了,这两种情况都需要告警。


我们可以使用pandas库中的ewma函数来实现我们上面的计算过程,代码如下:

def EWMA(timeseries):

flag = ""

series = pandas.Series([x[1] for x in timeseries])

expAverage = pandas.stats.moments.ewma(series, com=50)

stdDev = pandas.stats.moments.ewmstd(series, com=50)


if abs(series.iget(-1) - expAverage.iget(-1)) > 3 * stdDev.iget(-1) and series.iget(-1) - expAverage.iget(-1) > 0:

flag = "突增"

if abs(series.iget(-1) - expAverage.iget(-1)) > 3 * stdDev.iget(-1) and series.iget(-1) - expAverage.iget(-1) > 0:

flag = "突减"

return flag

EWMA由于其时效性被广泛应用在时间序列的预测,


它的优势在于:

  • 可以检测到一个异常较短时间后发生的另一个(不太高的突变型)异常;

  • 因为它更多的是参考突变之前的点,所以能更快对异常作出反应;

  • 非常敏感,历史如果波动很小,方差就很小,容忍的波动范围也会非常小;


而劣势则是

  • 对渐进型而非突发型的异常检测能力较弱;

  • 异常持续一段时间后可能被判定为正常;

  • 业务曲线可能自身有规律性的陡增和陡降;

  • 过于敏感,容易误报。因为方差会随着异常点的引入而变大,所以很难使用连续三点才告警这样的策略;


所以我们需要引入周期性的检测方法,来针对性处理具有周期性趋势的曲线。


基于同期数据的检测方法

很多监控项都具有一定的周期性,其中以一天为周期的情况比较常见,比如VIP流量在早上4点最低,而在晚上11点最高。为了将监控项的周期性考虑进去,我们选取了某个监控项过去14天的数据。对于某个时刻,将得到14个点可以作为参考值,我们记为xi,其中i=1,...,14。


我们先考虑静态阈值的方法来判断input是否异常(突增和突减)。如果input比过去14天同一时刻的最小值乘以一个阈值还小,就会认为该输入为异常点(突减);而如果input 比过去14天同一时刻的最大值乘以一个阈值还大,就会认为该输入为异常点(突增)。我们将上面的计算过程用代码来表示:







请到「今天看啥」查看全文