螞蟻智能運維: 單指標異常檢測算法初探

背景介紹

AntMonitor:螞蟻集團研發的一款面向雲原生時代的全功能智能運維產品,包含業務監控、應用監控、基礎設施監控、雲原生可觀測、一站式多維分析等功能。其中,智能化的單指標異常檢測是該產品最基礎、最重要的組成部分。算法

針對時序異常檢測,目前螞蟻集團內部基本都在按照如下幾個思路進行研發:segmentfault

  1. 經過時序預測的方法,典型算法爲 ARIMA、LSTM 等,將歷史數據訓練的模型預測當前時刻的幅值,經過與真實值的差別來判斷此刻的異常程度。在屢次嘗試此類模型後發現,其不但算法複雜度較高,還存有隱藏風險,此類模型訓練遵循的是全局最優化策略,所以在預測當前值時沒法保證當前值是單點最優(運氣很差的狀況下,當前點預測值偏差較大)。一種解決的思路是結合其餘算法進行集成學習,將偏差機率儘量的下降;
  2. 採用深度學習的方法,經過大量採集正負樣本,採用一維 CNN、甚至二維 CNN (將時序數據視爲圖像)的方法訓練模型。在嘗試該類方法後發現,雖然其可以解決一些沒法用規則描述的異常場景,但要搭建一個合適的針對時序數據的網絡模型難度較大,此外在當前異常標準沒有徹底統一的狀況下,模型移植性存在着很大的問題,當不一樣的 SRE 對業務容忍閾值不一致時,意味着要針對性地從新訓練模型,這個工做量是十分巨大的;
  3. 經過集成學習的方法,有項目組是將多個弱分類賦予權重後投票來解決異常識別問題,當前的效果是在部分場景中能夠達到很高的準招率。但與傳統 Ensemble Learning 不一樣的是,其各個弱分類器的權重調整並非一個自優化過程,而是須要經過人工調整得到,這在檢測指標數量不大的時候能夠採用,可是針對 AntMonitor 動輒幾十萬個目標指標的場景就無解了;
  4. 經過統計規則與機器學習相結合的方法,須要儘量地將異常場景進行分類剝離(或者對數據進行分類,即算法路由),再針對各個場景進行求解。其中機器學習或深度學習能夠用於描述一些難於公式化的場景,如描述波形類似。此類方法還能夠將模型內部的各個參數進行透傳,能夠兼顧計算效率和模型移植性;

上述幾種思路無所謂優劣,不一樣的方法都有其優點及不足,都有其契合及尷尬的場景,合適的方法纔是最好的方法。針對 AntMonitor 實際面對的運維場景,統計規則和機器學習相結合的方法被選爲最終解決方案。本文將分享研發 AntMonitor 智能檢測算法時的一些想法和思路,歡迎各位交流學習。網絡

異常分類

在作智能異常檢測的過程當中,其中最棘手的問題是得到一個明確的異常判斷標準。比較遺憾的是,針對不一樣的業務、不一樣的指標甚至不一樣的使用方都會有不一樣的判斷標準。所以,本文從另外一個角度出發,先挖掘承認度高的基礎異常波形,再以點到面逐步地解決異常判斷問題。以耗時值上升異常檢測爲例,下圖給出了 AntMonitor 常見異常波形 A-D(各類異常波形均可認爲是如下幾種波形的變種或組合),根據各自不一樣的特性將其概括爲3種不一樣的類型,分別爲衝高異常、趨勢擡升異常和頻率變化異常。其中 A、B 歸爲衝擊異常,從圖中能夠看到其都有一個顯著的幅值突變;C 歸爲緩變擡升異常,相較與衝擊異常,其幅值擡升過程相對較爲平緩;D 歸爲頻率變化異常,主要特徵爲波動頻率出現巨大的變化。下面分別對不一樣類型異常進行求解。架構

常見異常波形
圖1  常見異常波形運維

算法總體架構

圖2 爲總體算法架構,其主要由 preFilter、coreUp 和 adapter 三部分組成。preFilter 爲前置過濾器,可以在較少數據輸入的狀況下過濾絕大部分正常信號,極大地下降資源消耗,這是算法可以大規模覆蓋的基礎;coreUp 爲核心檢測層,經過算法路由將不一樣類型數據映射到對應到合適的算法參數或模塊,主要對衝擊、趨勢和頻率三種異常類型進行檢測;adapter 爲適配層,其主要做用是可以容許不一樣對象建立適合自身的異常檢測模型,其中可經過透出的算法進行人工配置,也能夠經過樣本打標來自動訓練最優模型參數。下一章節主要對 coreUp 層幾個核心模塊的具體實現作詳細介紹。機器學習

總體算法架構
圖2 算法總體構架svg

核心模塊介紹

衝擊異常模塊

衝擊異常在波形上表現爲某時刻忽然出現的一個尖峯,每每是局部的幅值極大值。然而直接從幅值觸發判斷當前點是否異常,每每會出現漏報。如圖3所示,因爲原始波形存在着趨勢項,衝擊波形雖然是局部及極大值但每每不是全局視野內的最大值,所以會有被過濾的可能。觀察衝擊異常波形,發現其每每都是瞬時「變化」最大的時刻,其顯著特徵是當前值遠大於前一時刻的值或持續大於前值。所以,本節從尋找瞬時波動幅值突變點的角度出發,開發基於一階差分的異常檢測算法。函數

當間距相等時,用下一個值減去上一個值定義爲「一階差分」。如圖3所示,當帶有趨勢項的時間序列通過一次差分後能夠有效地去除趨勢項,同時衝擊異常點也從局部極大值轉變爲了全局最大值。針對長度爲的時間序列,其對應差分序列能夠表示爲, 其中。若當天時間序列與歷史事件序列分別用表示,分別計算各自差分序列獲得, 同時得到當前時刻差值。若在集合同時被斷定爲異常,則意味着當前時刻存在着衝擊異常可能。考慮到存在着連續上升的狀況,在實際應用中對差分計算稍做修改使其更爲精確,例如當知足時,令學習

時序趨勢的影響
圖3  時序趨勢的影響優化

經常使用的異常檢測方法可參考異常檢測算法綜述類論文。此處採用 Tukey 箱型圖做爲異常檢測算法。選擇箱線圖算法的緣由主要有三點:1)計算簡單; 2)可適用於非正態分佈數據; 3)可調整判斷閾值。

Tukey 箱型圖

此處對 Tukey 箱線圖分析作一下簡單介紹。衆所周知,基於正態分佈的 3σ 法則或 Z 分數方法的異常檢測是以假定數據服從正態分佈爲前提的,但實際數據每每並不嚴格服從正態分佈。應用這種方法於非正態分佈數據中判斷異常值,其有效性是有限的。Tukey 箱型圖是一種用於反映原始數據分佈的特徵經常使用方法,也可用於異常點識別。在識別異常點時其主要依靠實際數據,所以有其自身的優越性。箱線圖的繪製方法是:

  1. 先找出一組數據的最大值、最小值、中位數和兩個四分位數;
  2. 而後,鏈接兩個四分位數畫出箱子;
  3. 再將最大值和最小值與箱子相鏈接,中位數在箱子中間;

箱線圖爲咱們提供了識別異常值的一個標準:異常值被定義爲小於 Q1-1.5IQR 或大於 Q+1.5IQR 的值。雖然這種標準有點任意性,但它來源於經驗判斷,經驗代表它在處理須要特別注意的數據方面表現不錯。

箱線圖示意圖
圖4 箱線圖示意圖

衝擊檢測流程

衝擊異常檢測的簡要流程以下:

  • 當日序列和歷史序列,得到差分序列,已經當前差分值
  • 採用Turkey箱線圖得到集合的上限,判斷是否超限,若否返回「正常」,如果進入下一步;
  • 判斷異常時刻是否超過預設異常持續時長,若否返回「正常」,如果進入下一步;
  • 中截取以當前時刻爲中心且長度爲的子集合,採用 Turkey 箱線圖得到其上限,判斷是否超限,若否返回「正常」,如果進入下一步;
  • 判斷在當日前序時間序列中是否也存在衝高異常點,若不存在返回「異常」結果;若存在進入下一步;
  • 判斷是否大於,如果返回「異常」結果,若不然返回「正常」結果;

衝擊檢測流程
圖5 衝擊檢測流程

存在的問題

採用上述方法存在兩個問題,第一個以下左圖所示,若出現大幅度下跌回升(至關於下跌檢測中的衝高回落)的狀況,當前點的差分值必然會超限告警,這種誤報當前經過相似「衝高回落」的方法進行過濾,本文再也不具體介紹;第二種,在總體波動幅度較大的狀況下,出現這種小幅緩變擡升的小凸起,採用衝擊異常檢測是無能爲力的。針對這種異常類型,本文經過趨勢異常模塊來進行解決。

存在的漏報場景
圖6 存在的漏報場景

趨勢異常模塊

當波形緩慢上升時,因爲差值大小是基本穩態的,上述衝擊異常模塊是沒法有效識別的。所以,必需要有方法支持此類緩慢變化異常識別。在嘗試各類算法模型後,本文最終選擇 AugmentedDickey–FullerTest 和 Mann-Kendall Test 相結合的方式來求解此類問題。

ADF Test

Mann-Kendall 非參數秩次檢驗原理以下,對長度爲的時間序列, 統計假設:未經調整修正的數據系列是一個由個元素組成的獨立的具備相同分佈的隨機變量。備擇假設是雙邊檢測:對全部的,當時和的分佈不相同。計算時,對每個,與其後的進行比較,記錄出現的次數。定義 Mann-Kendall 統計量 :

其中, 爲符號函數。當小於、等於或者大於零時,分別爲-一、0或者1;對於假設統計,當時,的分佈爲正態分佈,的均值爲,方差爲。當時,便可應用近似正態分佈進行檢驗分析。

標準總體統計變量能夠用下式計算:

這樣,在雙邊的趨勢檢驗中,在給定的置信水平上,若是則原假設是不可接受的。爲正值表示增長趨勢,負值表示減小趨勢。的絕對值在大於等於1.2八、1.6四、2.32時表示分別經過了信度爲90%、95%、99%的顯著性檢驗。

Mann-Kendall 非參數秩次檢驗在數據趨勢檢測中極爲有用,其特色表現爲:

  • 無需對數據系列進行特定的分佈檢驗,對於極端值也可參與趨勢檢驗;
  • 容許系列有缺失值;
  • 主要分析相對數量級而不是數字自己,這使得微量值或低於檢測範圍的值也能夠參與分析;
  • 在時間序列分析中,無需指定是不是線性趨勢;

趨勢檢測流程

趨勢檢測並非直接檢測當日數據是否存在上漲趨勢,理論上若歷史數據與當天數據同步上漲,那麼該波形趨勢不該該識別爲異常。換句話說,須要去除當日數據相對於歷史的趨勢。此處採用相對差值的方式來實現該目的。假設當日數據爲 = ,某天曆史數據爲 = ,那麼二者之間的差值序列能夠表示爲,在此基礎上再進行趨勢分析。

詳細流程以下:

  • 計算當日數據與某歷史數據的相對差值序列
  • 採用 Mann-Kendall 檢驗判斷是否存在上漲趨勢,若無上漲趨勢返回「正常」結果,反之進入下一步;
  • 計算趨勢上漲的起始點,採用最小二乘法擬合上漲段波形,得到上漲絕對幅值, 計算當日數據點對應的基礎值,計算實際上漲比率;
  • 判斷是否大於設定漲幅比率閾值,若不大於設定閾值則返回「正常」結果,反之則進入下一步;
  • 採用T檢驗判斷前序數據是否存在相似的上漲波形,若存在則返回「正常」結果,若不存在則返回「異常」結果;

單次趨勢檢測流程
圖7 單次趨勢檢測流程

實際應用中流程會稍複雜一點,而且作了部分假設:1)若當天相對於昨日不存在上漲趨勢,便可認爲不存在緩變上漲異常;2)若當天相對於昨日存在上漲趨勢,那麼需考察當天相對與剩餘歷史是否也存在上漲趨勢,此處設定如有大於image天不存在相對趨勢,即認爲不存在緩變趨勢。考慮到算法須要得到準確的告警時間點,並用來計算精確的漲幅比率,此處對按不一樣長度前後進行趨勢判斷。大體的判斷流程如圖13所示,此處再也不展開。

趨勢上漲異常檢測總體流程
圖8 趨勢上漲異常檢測總體流程

頻率異常模塊

頻率異常在實際場景中並很少見,可是做爲一類異常類型,此處也對其進行了覆蓋。針對頻率異常數據類型,本文采用分位數聚合特徵來進行求解,主要步驟以下:

DoulbeRollingAggregate

分位數定義:對一個有着連續分佈函數的樣本集,分位數是將一個機率分佈切分爲有着相同機率的連續區間的切分點。用數學公式表達的話:,則稱爲隨機變量分位數。

分位數聚合特徵計算流程以下:

  • 長度爲的時間序列,分別擴展獲得的時間序列,具體爲:;
  • 對時間序列進行滑窗截取操做,窗口長度爲,得到長度爲的子序列集合,其中;一樣的,得到時間序列對應的子序列;
  • 計算集合中各個子序列的個分位數,用表示子序列分位數;一樣的,計算集合中各個子序列的對應的分位數,用表示;
  • 經過得到當前時刻的分位數聚合特徵,具體公式以下:

分位數聚合特徵計算示意圖以下所示:

分位數聚合特徵計算示意圖
圖9 分位數聚合特徵計算示意圖

實際檢測效果

在頻率異常檢測的應用中,須要對數據類型進行區分。針對稀疏類型數據直接進行「分位數聚合」算法計算,而對於存在趨勢項的非稀疏數據,必須先對其進行一階差分操做後纔可使用當前算法。圖10給出了二者不一樣類型的頻率異常檢測模型,分別給出了「分位數聚合」特徵曲線,從圖中能夠看到能夠準確地識別此類異常波形。在實際使用中還須要根據具體場景添加一些規則限制,此處再也不具體展開。

不一樣類型異常數據檢測效果
圖10 不一樣類型異常數據檢測效果

類似性檢測模塊

類似性誤報在時序異常檢測中佔有不小的比例。以下圖時序在檢測時刻出現異常衝高時,若不考慮歷史同期波形,每每會出現類似性誤報現象。實際在波形進行類似性檢測時,每每須要考慮時序長短不一致和波形偏移的問題。通常來說,時序長短不一致和波形偏移主要表現爲:

  • 以下圖所示,當日波形$$T_0$$與歷史波形的衝高部分出現一段先後偏移;
  • 爲提升實時檢測的時效性,通常參考將歷史參考波形相對於當前檢測時刻延後幾分鐘;

類似性誤報
圖11 類似性誤報

因爲時序長短不一致和波形偏移的狀況,皮爾遜相關係數、餘弦類似度、歐式距離等類似性評價指標就再也不適用。動態時間規整(DTW)是一種經常使用的模板匹配算法,其能夠有效的解決對比長度不一致的時間序列類似性問題,圖12給出了DTW算與傳統歐式距離評價的差別,此處再也不展開描述。但實際應用中,DTW 算法更多的是一種搜索匹配算法,即其返回結果是目標庫中的最優匹配對象,而在時間序列實時監測過程當中,須要的是能給出一個可量化的類似度參考值作爲判斷依據,所以 DTW 也不能直接使用。本文給出了一種基於動態時間規整(DTW)及T檢驗的時序波形類似性評估方法,不但可以有效評估長度不一樣、發生偏移序列的類似度,還能夠返回可量化的類似性度量值,可以應用於時間序列實時異常檢測。

DTW 算法與歐式距離對比
圖12 DTW 算法與歐式距離對比

類似性檢測流程

  • 截取當日數據,記時間序列爲 = , 表示當前時刻的實時數據;
  • 截取歷史同時刻對比數據,記爲 = , 爲了刻畫數據偏移特性,歷史對比數據比當天數據日後多取個數據點;
  • 爲消除時序常數項對距離度量的影響,對時序作「拉平」預處理,即將各個時間序列減去其自身中位數,得到新的序列分別記爲
  • 定義時序到時序距離定義爲,分別計算當日與各個歷史距離,得到距離集合,此處 的長度分別爲
  • 分別計算內兩兩時序的距離,得到距離集合,爲與上一步驟保持一致,此處中波形取數據前個點,個點;
  • 採用STest算法判斷集合中的距離均值是否存在顯著性差別,設原假設:,備擇假設:,檢驗水準
  • 計算得到pValue,若pValue>,不拒絕原假設,代表當日波形與歷史波形類似; 反之,當日波形與歷史波形不類似;

實際檢測效果

下圖給出了「類似性檢測模塊」的實際檢測效果,圖13中的4例告警都爲未配置「類似性檢測」模塊前的上升告警樣例,採用上述算法回跑後均可以有效地識別爲類似性誤報。從實際使用狀況來看,該模塊評估爲誤報的案例基本都是類似的,反之存在着必定的誤差,但對於一個後置過濾模塊來說是徹底可接受的。整體來說,對較爲規整的波形判斷效果不錯,當歷史數據自己趨勢不相關、波形太過雜亂,上述算法效果通常。

類似性檢測效果
圖13 類似性檢測效果

算法過濾場景

經過上述總體算法判斷後,下圖中的潛在異常場景,如單點衝高、衝高前序類似、衝高歷史類似、擡升歷史類似等均可以被有效過濾。在實際應用中,此類過濾項都配置有相應的開關,由業務人員來確認是否開啓。

典型過濾場景  
圖14 典型過濾場景

總結與展望

本文算法整體思路是對單指標波形異常檢測問題進行拆解,將其概括爲衝高異常、趨勢上漲異常和頻率變化異常三個模式。在此基礎上,輔以一些過濾模塊來減小特定誤報的產生,如利用基於 DTW 的算法來求解諸如"波形類似性"的誤報場景。此外,本文中的異常判斷標準相對統一,都以箱線圖分析爲標準,各個超參數均可以進行透傳,後期針對不一樣的應用場景不一樣的閾值均可以快速調整。當前根據以上思路設計的模型主要應用在 JVM&System 指標監測上,約 5w 條 key 整體異常告警量小於5條/分鐘。

基本上,上述算法能夠覆蓋絕大部分的場景,但每每會有各類意想不到的誤報漏報狀況出現,後期的一部分工做要重點解決此類問題;另外一方面,針對一些偏明確的場景,在後期能夠用機器學習或者深度學習模型來進行代替,如「波形類似性」問題,在積累足夠樣本量後可嘗試經過深度學習模型進行覆蓋。同時,也能夠嘗試集成算法,以往從事機器學習的項目經驗代表,每每集成後會有意想不到的精度提高。

做者簡介

徐劍,花名輅遠,螞蟻集團高級開發工程師,工學博士,長期從事智能運維、機器學習和信號處理等領域的研究及開發工做,當前爲 AntMonitor 算法開發人員。

相關文章
相關標籤/搜索