【监控杂谈之异常检测】什么是异常

写在系列开头

集团在异常检测方面做了很多积淀,本系列将开始总结一些常见的问题以及解决办法,为后来人或者感兴趣的人快速上手,权当抛砖引玉,如有兴趣或者问题可以留言或@冷愁

本章作为整体概述,站在运维的角度、日常应急处理的视角,描述现有遇到的问题,在后续的篇章中会针对每一个遇到的问题提供响应的解决方案

什么是异常检测

在开始之前,我们需要聊聊什么是异常检测。

引用*的说法

In data mining, anomaly detection (also outlier detection) is the identification of items, events or observations which do not conform to an expected pattern or other items in a dataset.
-Wikipedia Anomaly Detection

在数据挖掘领域,异常检测(异常点检测)是在某个数据集中区分出不服从于已知或预期的模式(或分布)的条目、事件或者观测点。

Hawkins [Hawkins 1980]的定义:

"An outlier is an observation which deviates so much from the other observations as to arouse suspicions that it was generated by a different mechanism "

异常点就是相对于其他观测点来看有明显偏离的点,以至于怀疑其与正常点来说不属于同一个产生来源。

上述是较为直观的异常点定义,但是如何转换成机器语言或者监控方法?

主流的异常检测方案大体有以下几种:

  1. 基于密度的异常检测(LOF)
  2. 基于统计的异常检测(Holt-Winters、Confidence Interval)
  3. 基于偏差的异常检测(同比、环比、基线比)
  4. 基于距离的异常检测(KNN、Isolation Forest)

目前主要还是根据下面的统计学定义来的:

正常的数据基于一个已知分布,例如一些给定的统计学分布(泊松分布、正态分布)

异常就是明显偏离这个已知的分布的部分或点

再思考一个点,异常的本质是什么?

监控指标(就是一条曲线)的本质实际上是一个信息集合,大致分为两部分的信息

  1. 基于时间维度的(自身历史的数据)
  2. 基于同系列的维度(例如各个银行渠道,互相之间存在着信息,一个曲线下跌,其他曲线没跌,即为异常)

而以上两个维度中,2的信息不一定存在,如果仅仅从1看,那么可以通俗的理解为:

1. 历史上发生过的,今天再次发生了,认为是正常的
2. 历史上未发生的,今天发生了,那就是异常

有人要问了,我刚做了变更、重启操作,报警报出来了,这就是无效的报警呀?

所以我们为了后续的工作,必须要将此分解开来:

从数据集中获取信息进行检测我们称之为异常
人的超集经验对于报警的判定我们称之为报警订阅

从而将监控系统分为1. 异常检测 2. 报警订阅两部分

集团监控中异常检测的难点以及要解决的问题

一、季节性或周期性(Seasonality)

在实际应用当中,季节性是非常普遍存在的,例如下图中,红标的地方是否是异常呢?

【监控杂谈之异常检测】什么是异常

貌似看起来是下跌了。但是再看过去几日的数据:

【监控杂谈之异常检测】什么是异常

发现每天的时间点都会下跌,也就是说,这并不是异常。

这就是季节性或是周期性。

季节周期是我们监控中首先要解决的第一个问题,因为如果季节性解决不好,会导致我们的监控有大量的误报,具体表现就是每天固定的时间点都会报警,但并不是异常

二、异方差性(Heteroscedasticity)

什么是异方差?

方差我们可以直观的理解为曲线的抖动(波动)幅度,异方差就是指根据时间的不同,曲线或数据集的方差是不相同的。

我们还是从图上来看:

【监控杂谈之异常检测】什么是异常

每天凌晨和白天的抖动幅度不一致,明显晚上抖动幅度比白天大。

大家应该能看出来问题了,如果异方差性存在,就会导致报警策略在白天、晚上的报警效果不同,这也是现在遇到的很大的问题,明明白天报警效果很好,但是到了晚上报警就非常多!

三、复杂周期性(Complex Cyclic)

什么叫复杂周期性?跟(1)的周期性有什么区别?
【监控杂谈之异常检测】什么是异常
在日常监控中,我们会有类似的经验,曲线具有显著的天周期性(1440个点为一个周期),也会有星期周期性(1440*7 个点为一个周期),那两者都有呢?我们就有了2个周期。

除了天周期和星期周期,我们还会有月周期(例如月初冲话费、缴费的人明显增多),可是每个月的周期都是不固定的呀?有的月有28天,有的有29天,有的由30天或31天,这怎么办呢?

甚至一年也不是稳定的365天,也会有366天,平均下来就是365.25天,非整数周期什么鬼.....

这就是我们所说的『复杂周期性』

四、报警抑制(Alarm Suppression)

现在集团监控业务在飞速扩张,监控指标数也在迅猛增长,例如监控值班关注的监控指标都有几千个,每日处理报警近千条....

为了报警准确率和高效处理,我们的常规做法是不停的提高发现率、误报率,这样真的是有效的么?

五、故障原因定位(Root Cause)

故障定位可以说是重点,但是在内部一度成为谁做谁死的状态....这是什么鬼?

【监控杂谈之异常检测】什么是异常

  1. 在集团内部,关系调用复杂,甚至有效的链路调用图关系都很难梳理。
  2. 某个中间件异常,导致若干业务收到影响,同时发送了大量的报警,如果在这么多报警中甄选有价值的信息?

在这种情况下如何引入统计过程分析来解决故障定位的问题呢?

参考文献

1.Hawkins, DM:Identification of Outliers

2.非监督学习算法:异常检测

上一篇:Unity使用 UnityVS+VS2013 调试脚本


下一篇:中国HBase技术社区第一届MeetUp-HBase2.0研讨圆桌会