天天看點

日志服務在CDN流量名額中的異常檢測實戰(下)

本次專題主要包括四個方面内容,第一部分介紹AIOps平台,以及具備的能力和功能。第二部分講解阿裡雲日志服務平台的作用,以及支撐AIOps的應用。第三部分為目前關注的異常檢測算法的介紹。第四部分以一個實際的場景作為案例介紹流量場景中的實戰,并加以分析。

本文為第三部分和第四部分,

點選這裡,檢視第一部分和第二部分。 想看精彩直播回放, 請點選這裡。 以下為精彩直播内容整理:

三、異常檢測算法

相關算法研究

日志服務在CDN流量名額中的異常檢測實戰(下)

起初的異常檢測是使用統計的方法,比如統計确定時間點的流量變化。大部分人是基于名額來做,其中包括一些複雜的算法,比如局部低密度的異常點的檢測算法,以及孤立森林的方法,還比如基于聚類的異常檢測以及基于統計的異常檢測。這些都是通過統計量分析目前統計量的偏差和機率的方法。

基于預測進行異常檢測指的是,時序異常檢測作為一條實際的線,線上的每個點都有值,比如一天或一個月的值,通過将過去的行為模式與目前的行為模式相比較,檢視是否有偏差,如果偏差較大,則存在異常。同時,用各種各樣的方法對任一條輸入的序列提出一條基線,用基線的方法對比殘差,通過殘差的大小判别目前是否有異常。

比較新的一種方法是基于生成進行異常檢測,其優勢在于可以處理更複雜的形态和更大的資料量。基于預測的方法是要對資料進行一些回歸的模組化,但回歸的模組化在實際場景中不是很好用,因為實際場景中越底層的資訊會有高頻的噪音存在,很難得到每個曲線的趨勢,基于這種情況是采用生成的方法,利用生成類似的資料,将生成正常資料與異常資料相比較,比較方式可以使基于殘差的比較或者是基于重構機率的比較,進而衍生出一些模型。

由上圖中的RNN和LSTM是基于預測方法所實作,VAE和WGAN是基于生成方法所實作。圖中列舉了一些可以查到的開源工具,Yahoo-EGADS是比較早的內建檢測方法,Prophet為Facebook的預測包,主要針對統計方法所實作。Opprentice是一種學徒的方法,它內建30多種檢測器用于異常檢測,Anomaly Detection是Twitter開源的算法包,hawkular是Redhat的檢測算法,Donut是采用生成的方法實作異常檢測,Metis是Tencent的開源架構,YADING是采用異常聚類算法,能解決超大規模基于異常的問題,MoogSoft是一家海外公司,主要是做異常檢測的。

異常檢測算法介紹--統計方法

基于統計的方法對時序資料進行不同名額(均值、方差、散度、峰度等)結果的判别,通過一定人工經驗設定門檻值進行告警。同時可以引入時序曆史資料利用環比、同比等政策,通過一定的人工經驗設定門檻值進行告警。

日志服務在CDN流量名額中的異常檢測實戰(下)

比如上圖所指的是CPU的曲線圖,出現的六種異常現象,分别為CPU變高、頻率加快、峰度變化、存在間點、均值不斷變換、穩定向上等現象。這些異常是可以通過檢測和統計的方法解決的。通過建立不同的統計名額;視窗均值變化、視窗方差變化等可以較好的解決上圖中(1、2、5)所對應的異常點檢測;通過局部極值可以檢測出圖4對應的尖點資訊,通過時序預測模型可以較好的找到圖(3、6)對應的變化趨勢,檢測出不符合規律的異常點。

針對統計名額判斷是否是異常,可以通過統計名額的檢測方法,方法如下:

  • N-sigma
  • Boxplot(箱線圖)
  • Grubbs’ Test
  • Extreme Studentized Deviate Test

異常檢測算法介紹--無監督方法

  • 什麼是無監督方法:是否有監督(surpervised)主要看待模組化的資料是否有标簽(label)。若輸入資料有标簽,則為有監督學習;沒标簽則為無監督學習。
  • 為何需要引入無監督方法;在監督建立的初期,使用者的回報是非常稀少且珍貴的,在沒有使用者回報的情況下,為了快速建立可靠的監控政策,是以引入無監督方法。
  • 針對單次元名額

采用一些回歸方法(Holt-Winters ARMA),利用原始的觀測序列學習出預測序列,通過兩者之間的殘差進行分析得到相關的異常。如下圖所述,黑線為某KPI名額,經過去噪、去異常算法,提出基線,做預測模組化,計算真實值是否在合理區間,不在合理區間範圍内視為異常。其中圖中的紅點視為異常,在統計學上,誤差是符合高斯分布的,将誤差進行标準化,3σ以外占據的量是比較少的,視為異常。

日志服務在CDN流量名額中的異常檢測實戰(下)
  • 針對多元度名額

多元度的含義是指,time,cpu,iops,flow的多元度資訊。在某一個時刻所能拿到CPU的負載資訊以及iops資訊和流量資訊,在這些資訊下判斷異常。

日志服務在CDN流量名額中的異常檢測實戰(下)

iForest(Isolation Forest)作為一種基于內建的異常檢測方法。通過選擇次元、空間劃分的政策将數值資訊在空間中做切割,切割的點是稀疏的則視為異常。每次随機的選擇某個次元,通過做內建都會産生低密度區,則低密度區所覆寫的時刻點視為異常點。如上圖所示,每個樹是獨立的,可以高效的運作,并且在任何節點都可以建立一顆樹,也可以橫向擴充。但是不太适合高緯度的資料,因為高次元的資料沒有進行去噪音等操作。原始iForest算法僅對全局異常敏感,對局部相對稀疏的點敏感度較低。

  • 深度學習異常檢測(Donut)

針對論文《Unsupervised Anomaly Detection via Variational Auto-Encoder for Seasonal KPIs in Web Applications》(WWW 2018)做出相關介紹:

目前針對單次元的時序異常通常采用生成模型的方法比較好,針對的資料是具有周期性的,但資料中可能包含一些缺失點和異常點,比如流量資訊缺失是因為存在異常,或者CPU不穩定。

日志服務在CDN流量名額中的異常檢測實戰(下)

上圖中橙色線表示的點視為異常點,紅色點相當于缺失點。模型訓練結構如下圖所示。

日志服務在CDN流量名額中的異常檢測實戰(下)

檢測時使用了MCMC填補的技術處理觀測視窗中的已知缺失點,核心思想根據已經訓練好的模型,疊代逼近邊際分布(下圖表示MCMC填補的一次疊代示意圖)

日志服務在CDN流量名額中的異常檢測實戰(下)

其中x=(x0,xm)為有缺失序列,x’=(x0,x’m)在缺失模型下認為的合理值。針對較平滑資料的處理是比較好的,但是對于高頻資料的處理不是很好。

異常檢測算法介紹—有監督方法

日志服務在CDN流量名額中的異常檢測實戰(下)

如上圖所示為打标的鍊路流程圖。标注異常是一件很複雜的事,可以從以下幾個方面說明:

  • 使用者定義的異常往往是從系統或者服務角度出發,對資料進行打标,所關聯的底層名額、鍊路名額繁雜,無法從幾個次元出發(更多的是系統的一個Shapshot)
  • 在進行架構層設計時,都會進行服務自愈設計,底層的異常并未影響到上層業務
  • 異常的溯源很複雜,很多情況下,單一監控資料僅是異常結果的反應,而不是異常本身
  • 打标樣本數量很少,且異常類型多樣,針對小樣本的學習問題還有待提高

常用的監督方法有Xgboost、DNN。

SLS中提供的算法能力

阿裡雲中提供的時序分析算法包括:預測算法、異常檢測算法、多周期檢測算法以及時序聚類算法,都屬于線上算法。

日志服務在CDN流量名額中的異常檢測實戰(下)

如上圖為異常檢測圖,提供錯誤量的資訊,經過異常檢測之後,紅點标注的視為異常。模式分析涉及到頻繁模式的挖掘和差異模式的挖掘。此外,還有海外文本的智能聚類算法,其優點是速度快,并且不會遺漏任何的模式,會覆寫到全量的資料,對億級資料可以秒級出結果。模式方面還需要調整,比如提供一些白名單以及針對某些字段做聚類。

四、流量場景實戰分析

日志服務在CDN流量名額中的異常檢測實戰(下)

上圖為阿裡雲服務裡的原始日志内容,涉及到幾個字段,包括clent_os用戶端的作業系統,domain域名,error_message,falled_cnt相當于一分鐘之内播放失敗的次數,first_play_cnt為首播失敗的次數,isp營運商,name留名,net使用者網絡的介入,province地區,station_isp為哪個運作商提供的服務。業務名額分為各次元的卡頓率(buffer_rate)、各次元的丢幀率(fail_rate)、首幀播放延時。

實時地統計每分鐘名額的大小,根據業務算出卡頓率或者失敗率,之後得到一組資訊,包括每一個時刻的各個次元的資訊,展示在如下圖中。要得到之前的資訊,包括目前某個時間點對應的資訊,利用ts_compare方法得到前一天對應的統計值資訊,通過log_cnt将統計值拆分出來,做一些解析的政策,可得出下圖可視化的圖示。

日志服務在CDN流量名額中的異常檢測實戰(下)

想要檢視次元或者卡頓率和失敗率,可以通過下圖所示的方式。其中show_index作為一個公共替換的變量,下圖展示的次元就是show_index,通過下拉框實作更新圖表的能力。

日志服務在CDN流量名額中的異常檢測實戰(下)

異常檢測部分在平台中的實作如下圖所示。其中vaild_unit是指,目前有1000個域名,100個城市,不是每個城市都很重要,比如有的城市每秒鐘播放的數量可能特别少,隻有200,其服務品質可以得到保證。Check_window是指關心曆史的長度(目前的觀測點再向前5個點)。Alpha是用來控制區間的大小。

日志服務在CDN流量名額中的異常檢測實戰(下)

最核心的代碼如下圖所示,第一部分代碼的作用是指在批量檢測中,剔除掉資料量少的省份。第二部分代碼的作用是計算相關名額的邏輯代碼。第三部分代碼的作用是針對得到的批量時序曲線,進行巡檢操作,并将檢測結果由列轉換成行。第四部分代碼的作用是通過指導的參數将滿足的檢測結果過濾出來。

日志服務在CDN流量名額中的異常檢測實戰(下)

針對單條時序曲線進行異常檢測代碼如下:

日志服務在CDN流量名額中的異常檢測實戰(下)

針對N條時序曲線進行批量檢測代碼如下:

日志服務在CDN流量名額中的異常檢測實戰(下)

對批量檢測結果的格式轉換代碼如下:

日志服務在CDN流量名額中的異常檢測實戰(下)

掃描下方二維碼,加入開發與運維釘釘交流群,檢視更多精彩内容。

日志服務在CDN流量名額中的異常檢測實戰(下)

繼續閱讀