简介
随着公司发展,网络设备面临数量增多、设备老化、结构复杂等,告警数量也随之越来越多,为了达到“喝着咖啡做运维”的最高境界,对告警质量的要求也更高。公司网管系统之前做的出口流量、CPU、内存等时间序列的告警场景,算法都过于简单,导致经常出现误报的情况,有时候在值班过程中遇到告警多,误报实在是一种干扰,比如cpu抖动、小流量波动、周期性波动等等,系统都会傻乎乎的弹出告警。所以花费了几个周末时间,结合自己的认识,开发了一个基于机器学习的时间序列异常检测系统。
传统阈值算法弊端
传统监控算法有很多弊端,这里举例了2个场景。
解决思路
如果抛开设定的告警规则,让大脑来判断一个时序数据是否异常,我们通常的判断依据是:看和之前的数据(环比)是否有较大波动差异(注意不是是否有波动,而是是否有波动差异);从绝对值上和昨天、上周(同比)数据进行比较,看是否有偏差。简而言之,就是看当前这个点的数据,和以前的数据是否存在“我们不一样“的地方。这实际上就是个解决分类的问题,是否可以使用机器学习等算法的方式去准确判断一个点是否异常呢?
当然,上图只是一个简单的二维平分类的示例图,实际上分类算法非常多,各有各的特点,比较典型的分类算法有决策树、KNN、朴素贝叶斯、SVM、回归、各种Boots等等。分类的特征也需要根据实际情况从原始数据中挖掘,比如方差、极值、最大值、最小值等等。
算法过程
经验分享
fool bot系统随着样本录入逐渐增多,模型库不断扩展,并多次训练模型,最终使整套异常检测算法越来越准确。目前系统接入了流量、cpu、波分光功率等。系统上线之后,告警准确度大大增加,质量确实上了个不小的凳次。
另外样本库逐渐增加,样本打标也是个麻烦事情,需要花费不少时间进行样本的人工打标。所以把该系统和告警值班视图系统(Tmp Robot)做了整合,后面文章会说到该系统,当系统弹出告警时,让值班同事处理告警时顺便进行打标记,然后隔几天自动进行模型的训练。
当然系统在开过过程中免不了算法的调参,也是个麻烦事,直接关乎模型的使用效果,这个只能参考前人的一些文章和自己积累的一些经验不断优化。系统用到的都是比较常用和流行的算法,比如pauta、grubbs、ewma、IsolationForest等等无监督算法,有监督算法尝试过gbdt、xgBoosting、tenserflow等。算法这个东西原理确实很枯燥,但好在一些机器学习库有现成的实现方法和代码示例。
另外对于机器学习的基础知识,这里推荐google开放的官方课程,链接如下:https://developers.google.cn/machine-learning/crash-course/prereqs-and-prework