前言
對(duì)于DEVOPS或者AIOPS來(lái)說(shuō)浮庐,對(duì)于監(jiān)控指標(biāo)的異常檢測(cè),大部分公司還處于閾值觸發(fā)告警乎婿,而沒(méi)辦法提前通過(guò)指標(biāo)的突變進(jìn)行報(bào)警今阳,此篇文章針對(duì)幾款熱門的開(kāi)源devops異常檢測(cè)項(xiàng)目進(jìn)行深入的代碼級(jí)別的學(xué)習(xí)分析,從而積累足夠的知識(shí)點(diǎn)去設(shè)計(jì)自己的將監(jiān)控異常指標(biāo)檢測(cè)模塊逊躁。
開(kāi)源軟件
# Metis
- 騰訊開(kāi)源的異常分析組件
- 地址: https://github.com/Tencent/Metis
- 代碼結(jié)構(gòu)為經(jīng)典mvc service dao controller的分層結(jié)構(gòu)似踱,不在做詳解因?yàn)榉呛诵拇a。
* 訓(xùn)練模型service路徑 app/service/time_series_detector/detect_service.py
首先介紹一下數(shù)據(jù)集data_c,data_b核芽,data_a, 代表的含義如下圖的一周前囚戚、一天前、當(dāng)天:
?? process_train方法里定義起一個(gè)線程通過(guò)__generate_model方法進(jìn)行訓(xùn)練轧简,__generate_model里定義使用time_series_detector/algorithm/xgboosting.py模塊里的xgb_train方法進(jìn)行訓(xùn)練驰坊,在time_series_detector/model路徑下生成task_id+'_model'的文件以及task_id+'_features'文件,__calculate_features方法進(jìn)行features的預(yù)處理, 首先標(biāo)準(zhǔn)化normalized時(shí)間序列數(shù)據(jù)哮独,標(biāo)準(zhǔn)化的方法為為當(dāng)天的data_a的平均值拳芙,如果平均值大于1,則所有數(shù)據(jù)除以平均值,否則返回實(shí)際值:
標(biāo)準(zhǔn)化時(shí)序數(shù)據(jù)后皮璧,然后就是比較核心的features提取了舟扎,具體提取的內(nèi)容在time_series_detector/feature/下,分別提取statistical features ,fitting_feature,classification_feature,最后使用__save_libsvm_format持久化feature到本地悴务。
在time_series_detector/algorithm/xgboosting.py里的xgb_train方法里經(jīng)過(guò)了剛才的一些列過(guò)程使用xgboost模塊先訓(xùn)練feature然后訓(xùn)練model代碼如下:
預(yù)測(cè)部分算法如下睹限,分為量值以及率指(百分比)的預(yù)測(cè)。
- statisc算法
在系統(tǒng)里定義是判斷時(shí)序數(shù)據(jù)的(最后一個(gè)值 - 時(shí)序數(shù)據(jù)的平均值) > 偏差系數(shù) * 時(shí)序數(shù)據(jù)的標(biāo)準(zhǔn)差abs(X[-1] - np.mean(X[:-1])) >self.index * np.std(X[:-1])
- polynomial+Ridge算法
多項(xiàng)式回歸加上嶺回歸的算法讯檐,先計(jì)算時(shí)間序列平均值羡疗,如果大于1則標(biāo)準(zhǔn)化將時(shí)序數(shù)據(jù)除以平均值,然后預(yù)測(cè)是否大于閾值
- ewma算法
系統(tǒng)里的實(shí)現(xiàn)說(shuō)真的我沒(méi)看懂,但是指數(shù)加權(quán)移動(dòng)平均值算法的做法就是算變指數(shù)變化的時(shí)候每一項(xiàng)都一個(gè)加權(quán)系數(shù)在里面裂垦,主要作用是使得一些近期的數(shù)據(jù)的影響力大一些顺囊。
- IsolationForest算法
關(guān)于孤立樹(shù)的詳細(xì)文章請(qǐng)看http://www.reibang.com/p/1b020e2605e2
簡(jiǎn)單理解的話,就是去隨機(jī)從一組數(shù)據(jù)里抽樣然后算max,min然后隨機(jī)沖max到min之間選一個(gè)值蕉拢,然后根據(jù)這個(gè)值為根將數(shù)據(jù)分叉成樹(shù)特碳,然后通過(guò)一個(gè)計(jì)算節(jié)點(diǎn)到根距離的函數(shù),算法優(yōu)點(diǎn)是比較容易發(fā)現(xiàn)一組數(shù)據(jù)的異常孤立的噪點(diǎn)晕换,對(duì)于時(shí)序數(shù)據(jù)的話只能說(shuō)是一個(gè)觀察點(diǎn)午乓。
量值 經(jīng)歷一下四種算法的預(yù)測(cè),詳細(xì)代碼均在time_series_detecotor下闸准。
polynomial+Ridge益愈、ewma、statistic夷家、iforest四種算法里但凡有一種預(yù)測(cè)算法是超過(guò)偏差閾值蒸其,將使用xgb再次進(jìn)行預(yù)測(cè),如果四中算法預(yù)測(cè)都正常库快,則返回正常摸袁。
率值 預(yù)測(cè)。
只進(jìn)行statistic的預(yù)測(cè)
# prophet
- 一個(gè)facebook開(kāi)源的long? term anomaly detector义屏,這只是一個(gè)庫(kù)并不是完全的解決方案靠汁,如果你的監(jiān)控是用的prometheus那么你很幸運(yùn)可以看一下Redhat上面的給出的與prophet結(jié)合的解決方案https://events.linuxfoundation.org/wp-content/uploads/2017/12/AIOps-Anomaly-Detection-with-Prometheus-Marcel-Hild-Red-Hat.pdf