前言
对于DEVOPS或者AIOPS来说,对于监控指标的异常检测,大部分公司还处于阈值触发告警,而没办法提前通过指标的突变进行报警,此篇文章针对几款热门的开源devops异常检测项目进行深入的代码级别的学习分析,从而积累足够的知识点去设计自己的将监控异常指标检测模块。
开源软件
# Metis
- 腾讯开源的异常分析组件
- 地址: https://github.com/Tencent/Metis
- 代码结构为经典mvc service dao controller的分层结构,不在做详解因为非核心代码。
* 训练模型service路径 app/service/time_series_detector/detect_service.py
首先介绍一下数据集data_c,data_b,data_a, 代表的含义如下图的一周前、一天前、当天:
process_train方法里定义起一个线程通过__generate_model方法进行训练,__generate_model里定义使用time_series_detector/algorithm/xgboosting.py模块里的xgb_train方法进行训练,在time_series_detector/model路径下生成task_id+'_model'的文件以及task_id+'_features'文件,__calculate_features方法进行features的预处理, 首先标准化normalized时间序列数据,标准化的方法为为当天的data_a的平均值,如果平均值大于1,则所有数据除以平均值,否则返回实际值:
标准化时序数据后,然后就是比较核心的features提取了,具体提取的内容在time_series_detector/feature/下,分别提取statistical features ,fitting_feature,classification_feature,最后使用__save_libsvm_format持久化feature到本地。
在time_series_detector/algorithm/xgboosting.py里的xgb_train方法里经过了刚才的一些列过程使用xgboost模块先训练feature然后训练model代码如下:
预测部分算法如下,分为量值以及率指(百分比)的预测。
- statisc算法
在系统里定义是判断时序数据的(最后一个值 - 时序数据的平均值) > 偏差系数 * 时序数据的标准差abs(X[-1] - np.mean(X[:-1])) >self.index * np.std(X[:-1])
- polynomial+Ridge算法
多项式回归加上岭回归的算法,先计算时间序列平均值,如果大于1则标准化将时序数据除以平均值,然后预测是否大于阈值
- ewma算法
系统里的实现说真的我没看懂,但是指数加权移动平均值算法的做法就是算变指数变化的时候每一项都一个加权系数在里面,主要作用是使得一些近期的数据的影响力大一些。
- IsolationForest算法
关于孤立树的详细文章请看https://www.jianshu.com/p/1b020e2605e2
简单理解的话,就是去随机从一组数据里抽样然后算max,min然后随机冲max到min之间选一个值,然后根据这个值为根将数据分叉成树,然后通过一个计算节点到根距离的函数,算法优点是比较容易发现一组数据的异常孤立的噪点,对于时序数据的话只能说是一个观察点。
量值 经历一下四种算法的预测,详细代码均在time_series_detecotor下。
polynomial+Ridge、ewma、statistic、iforest四种算法里但凡有一种预测算法是超过偏差阈值,将使用xgb再次进行预测,如果四中算法预测都正常,则返回正常。
率值 预测。
只进行statistic的预测
# prophet
- 一个facebook开源的long term anomaly detector,这只是一个库并不是完全的解决方案,如果你的监控是用的prometheus那么你很幸运可以看一下Redhat上面的给出的与prophet结合的解决方案https://events.linuxfoundation.org/wp-content/uploads/2017/12/AIOps-Anomaly-Detection-with-Prometheus-Marcel-Hild-Red-Hat.pdf