準確率89%,攜程酒店大前端智能預警歸因實踐
一、背景
攜程酒店大前端為了監(jiān)測生產用戶運行的穩(wěn)定性和流暢度,對大量的系統(tǒng)指標、業(yè)務場景配置了監(jiān)控。在運作的過程中我們發(fā)現(xiàn),監(jiān)控確實能發(fā)現(xiàn)很多的問題,但由此帶來的排查成本隨著量級的增加也變的不可控。
以系統(tǒng)指標監(jiān)控說明:
目前約有30+類型,如頁面慢加載、白屏等。每種異常監(jiān)控都是獨立的數(shù)據(jù)處理、預警機制、問題排查分析流程,互相之間沒有關聯(lián)。這一現(xiàn)狀導致了一個個的數(shù)據(jù)孤島,管理的高度碎片化,且無法復用,讓維護和新增的成本較高。
同時,問題的原因不盡相同,排查鏈路也各自獨立。舉個例子:頁面白屏異常上漲時,通過白屏的監(jiān)控規(guī)則,觸發(fā)預警后通知相關人員。排查人員從現(xiàn)有的白屏報表中進行badcase分析,排查鎖定初步原因后,需要跨多個報表進行交叉驗證,直至找到根本原因,整個過程中會耗費大量人力和時間成本。
在對頁面白屏問題的深入剖析中,發(fā)現(xiàn)其根本原因往往與服務失敗、服務耗時增長、內存溢出、增量數(shù)據(jù)拉取失敗等因素密切相關。在現(xiàn)有的鏈路繁瑣、異常之間沒有關聯(lián)性、分析效率低下、分析結果也不盡如人意。
基于目前情況,該如何找到解決方案呢?
經(jīng)過對流程及問題的梳理,羅列了一些當前存在的核心痛點
數(shù)據(jù)角度:數(shù)據(jù)源分散,缺少關聯(lián)性,報表過多,監(jiān)控難維護&增加成本高
排查角度:現(xiàn)有流程鏈路長排查不方便,非常依賴人工定位,系統(tǒng)并不能很好的給出實際有問題點的方向。
針對上述問題,優(yōu)化策略已明確成形,聚焦于幾個核心要點:
數(shù)據(jù)整合:整合分散的數(shù)據(jù)源,確保數(shù)據(jù)結構的一致性與準確性,為后續(xù)分析奠定堅實基礎。
統(tǒng)一預警規(guī)則:抽取預警規(guī)則庫,形成統(tǒng)一的規(guī)則,減少重復編寫預警流程和調整規(guī)則,提高預警的效率和準確性
算法歸因分析:引入算法模型,深入挖掘不同數(shù)據(jù)與維度間的內在聯(lián)系,精準歸因問題根源,有效規(guī)避人工判斷的主觀性與不確定性,提高故障排查的效率。
簡化流程:縮短故障排查路徑,通過優(yōu)化聚合排查報表,讓問題定位更加直觀快捷。
二、智能歸因體系實現(xiàn)
2.1 整體方案
基于上述的優(yōu)化方向,我們搭建了酒店前端智能預警歸因系統(tǒng),將多個數(shù)據(jù)預警孤島串聯(lián)起來,形成數(shù)據(jù)池。抽取統(tǒng)一且豐富預警規(guī)則,形成預警規(guī)則庫,保證預警準確性。針對預警的異常,引進算法模型,實現(xiàn)算法模型歸因分析,快速定位問題根源,并生成詳盡的歸因報告,給到開發(fā)明確排查方向。最終,將分析結果轉化為清晰的告警通知郵件&排查報表,助力團隊迅速響應,開展有效的故障排查與解決,大大提高了排查效率。
2.2 數(shù)據(jù)池
在整個體系中,搭建數(shù)據(jù)池是其重要的基石。數(shù)據(jù)池起到整合不同數(shù)據(jù)源的作用,將不同格式、維度的數(shù)據(jù)集中存儲在同一個數(shù)據(jù)池中,對其定義統(tǒng)一的數(shù)據(jù)結構及標準,確保數(shù)據(jù)一致性和準確性。
拆解來看,將數(shù)據(jù)池劃分為六大字段維度:數(shù)據(jù)類型、平臺、指標、核心監(jiān)控維度、基礎字段以及業(yè)務特有字段。細致的數(shù)據(jù)維度分類不僅使得數(shù)據(jù)匯總更加直觀,同時也大大提升了數(shù)據(jù)的結構化處理能力、降低后續(xù)使用成本。
數(shù)據(jù)池的數(shù)據(jù),為以下3個流程,提供了核心的數(shù)據(jù)支持:
1)算法模型的基礎輸入:為算法模型提供必要的輸入數(shù)據(jù),確保模型運算數(shù)據(jù)的準確性和有效性。
2)預警規(guī)則的底表:作為預警系統(tǒng)的基礎數(shù)據(jù),為規(guī)則設定提供堅實的數(shù)據(jù)支撐,確保預警系統(tǒng)的精確性和可靠性。
3)監(jiān)控預警郵件badcase的數(shù)據(jù)來源:針對監(jiān)控預警郵件中的badcase,提供了詳細且多維度的數(shù)據(jù)來源,以便進行深入的分析。
2.3 預警規(guī)則&加權
預警數(shù)據(jù)的準確性,是預警歸因系統(tǒng)中的重要一環(huán),如何讓監(jiān)控保證準確、不遺漏,且降低誤報的概率呢?為了達到這個目標,把數(shù)據(jù)進行流量分級,且構建了多類預警規(guī)則,以權重加權的方式,進行預警判斷,最后把多個規(guī)則的預警結果匯總起來,成為最終的結果。
首先說說流量分級和預警規(guī)則。
從數(shù)據(jù)池獲取數(shù)據(jù)時,把數(shù)據(jù)本身的流量進行分級,分為高、中、低、僅關注四級。根據(jù)類型不同,并針對不同流量級別設置了合理的變化率閾值。流量越大,則對變化率越敏感。
權重計算公式:權重=流量分級系數(shù)*變化率
舉個例子:數(shù)據(jù)變化率上升50%,通過規(guī)則,會計算出高級的權重值為max,中級的權重值為5,低級的權重值則為2,僅關注的權重值則為0。
在預警規(guī)則上,構建了四種不同維度的規(guī)則,以確保數(shù)據(jù)異常&變化的及時發(fā)現(xiàn)與處理:
1)單日同環(huán)比規(guī)則:通過對比當前數(shù)據(jù)與上周同日(同比)或相鄰日期(環(huán)比)的數(shù)據(jù),發(fā)現(xiàn)單日內的顯著變化,如激增、驟減、新增或異常波動。
2)連續(xù)多日(周聚合)趨勢波動規(guī)則:除了關注單日的數(shù)據(jù)變化外,還制定了周維度的數(shù)據(jù)趨勢。通過對比每周的數(shù)據(jù)變化,能夠更準確地評估數(shù)據(jù)的長期或持續(xù)性的趨勢異常。這一預警規(guī)則不僅關注數(shù)據(jù)的變化幅度,還關注數(shù)據(jù)的變化方向和速度,從而更全面地把握數(shù)據(jù)的動態(tài)變化,確保不漏掉那些單日波動中被忽略的異常情況。
3)綜合流量變動規(guī)則:該規(guī)則不僅考慮了數(shù)據(jù)本身的變化,還結合了與其相關指標/大盤流量,從而降低因用戶流量放大、縮小而導致的數(shù)據(jù)變動預警噪音,確保預警的準確性。例如,針對頁面白屏異常,監(jiān)測異常率(異常數(shù)/頁面流量)。
4)分位線預警規(guī)則:針對非報錯類數(shù)據(jù)源,引入了分位線規(guī)則,以天為單位設定最優(yōu)分位線作為基準,實時監(jiān)測高于或低于該基準的數(shù)據(jù)占比變化及波動,確保數(shù)據(jù)的細微變化可以反饋出來。
基于以上四種預警規(guī)則,再結合數(shù)據(jù)本身的流量大小,設置了合理的變動權重。通過對權重進行加權計算后,能夠精準得出每日的預警數(shù)據(jù),確保系統(tǒng)與業(yè)務中的數(shù)據(jù)變動得到及時發(fā)現(xiàn)和處理。
在得到各規(guī)則的對比權重值后,同樣根據(jù)流量分級進行分類加權,對加權結果進行閾值或權重的過濾,以確定在該規(guī)則下是否觸發(fā)預警(具體參考“觸發(fā)預警標準表”)。再根據(jù)不同的業(yè)務需求,疊加多個規(guī)則進行最終的數(shù)據(jù)預警,以確保預警的精準性,并有效降低預警的噪音。
2.4 模型歸因
有了實際預警的類型后,基于預警結果及預警池中全量異常數(shù)據(jù),將其作為算法模型的數(shù)據(jù)輸入,經(jīng)過不同的模型進行歸因分析,最終獲得歸因結果值。
在實踐中,考慮到對異常數(shù)據(jù)進行本身根因的分析、與其相關的其他問題導致情況、趨勢問題等各類問題歸因,使用了以下三種算法模型:
- Adtributor算法
- Pearson相關系數(shù)
- 滑動T檢驗
2.4.1 Adtributor算法
Adtributor算法是微軟研究院于2014年提出的一種多維時間序列異常根因分析方法,在多維度復雜根因的場景下具有良好的可靠性。在任務中,首先對監(jiān)控的各種關鍵性能指標(KPI)進行實時異常檢測,當一個KPI發(fā)生異常時,想要解除異常,定位出其根因所在的位置是非常關鍵的一步。歸因系統(tǒng)需要對檢測到的異常指標進行維度分析和根因定位,而Adtributor算法非常適用于這個場景。
首先對異常指標進行維度拆分,維度拆分意在從預警結果的諸多維度中,分析出哪幾個維度對一條預警造成的影響最大。
使用Adtributor算法來實現(xiàn)維度拆分主要包括以下幾個步驟:
1)數(shù)據(jù)收集:以pv、uv作為參考指標KPI,將預警結果和預警池作為數(shù)據(jù)源,按維度構造原始數(shù)據(jù)集。
2)異常檢測:采用ARMA時間序列模型對KPI進行實時預測,將預測值F和真實值A對比,判斷KPI是否發(fā)生異常。
3)維度分析:Adtributor對異常KPI的所有維度和元素計算EP值和S值,從而定位到影響程度最大的維度。
下面對重要細節(jié)展開闡述:
數(shù)據(jù)收集
對于發(fā)生預警的數(shù)據(jù),通過關聯(lián)預警池,獲取到每條預警在某個維度下,過去60天內每天的明細pv、uv值。
異常檢測
ARMA(auto regressive moving average model,自回歸移動平均)模型是研究時間序列的重要方法,它可以基于歷史數(shù)據(jù)來預測未來的事情。
在每個維度下,基于過去59天的歷史數(shù)據(jù),使用ARMA模型推理得到當天的預測pv、uv值。將預測值與真實值進行對比,可以判斷預警是否發(fā)生異常。
維度分析
將多維分析問題分解為多個單維分析問題,采用EP值和S值定位出每個維度下的異常元素集合,最后根據(jù)每個維度總的S值大小匯總輸出相關維度集合。
1)對于異常KPI,計算所有維度下所有元素的真實值和預測值的差異,即S值(Surprise, 意外性),將每一維度下的元素依據(jù)S值大小降序排列;
2)對于每一維度,從上到下依次對排序后的所有元素計算其變化在KPI變化總量中的占比,即元素對于KPI異常的解釋能力EP值(Explanatory power, 解釋能力)。
EP值
對于每一維度,如果元素的波動變化在異常KPI的波動變化中的占比越大,則認為元素越能解釋KPI異常的發(fā)生。EP值(Explanatory power, 解釋能力)用于衡量元素對異常的解釋能力。EP值計算公式如下:
式中,A為真實值,F(xiàn)為ARMA時間序列模型正常預測值,下標i為維度、j為元素、m為異常指標。EP值可以為正、為負、大于100%,但是每個維度下的所有元素EP之和必須為100%。EP為正表示可能是異常維度,為負表示不是異常維度,大于100%表示與KPI異常有非常明顯的正相關關系。
S值
如果KPI在某一維度下的真實值和預測值相差越大,則越有可能是異常維度。
KPI先驗概率和后驗概率的相似度可以采用相對熵(relative entropy)來衡量,進而判斷維度是否具有意外性。JSD散度(Jensen-Shannnon divergence)是相對熵的一種變形,其對稱性好、對于零值具有適應性、對相似度判別更加準確,這里基于JSD散度,得到S值(Surprise, 意外性)公式如下:
其中,預測概率或先驗概率計算公式為:
真實概率或后驗概率計算公式為:
維度的S值為維度下所有元素的S值之和,即:
在得到維度拆分的分析結果之后,還需要做深度根因的定位,根因定位意在從預警結果中,找出造成該預警的深度原因。例如:預警類型為頁面白屏,而深度原因在于內存溢出,算法需要通過頁面白屏與內存溢出之間的關聯(lián)性,定位到深度原因。
通過計算預警結果所屬類型的uv、pv行為,與其他深度類型uv、pv的相似度,來匹配深度原因。深度歸因的實現(xiàn)是基于維度拆分的結果,具體來說:首先得到了一條告警影響最大的一個或者幾個維度,然后只獲取這些維度下的uv、pv指標作為特征向量,忽略其他影響不大的維度。對于所有的候選深度類型,也獲取相同維度下的特征向量,然后計算向量間的余弦相似度,作為數(shù)據(jù)類型之間的關聯(lián)性指標。相似度最接近的深度類型,即是該條預警關聯(lián)性最高的深度原因。
2.4.2 Pearson相關系數(shù)(Pearson Correlation Coefficient)
考慮到通過 Adtributor算法定位深度原因,沒有充分利用uv、pv的趨勢變化,而事實上趨勢的變化是預警判斷時的重要依據(jù),因此這里補充使用了另外一種基于趨勢的相似度計算方法來定位預警的深度原因。
首先對預警明細表基于每個維度聚合,得到21天的pv、uv值作為特征表。然后對于每一條預警數(shù)據(jù),以及待匹配的深度類型,都從特征表中獲取相關特征,然后計算特征間的相似度。
由于主要考慮特征在趨勢上相似性,因此選擇Pearson相關系數(shù)(Pearson Correlation Coefficient)作為相似度指標。Pearson相關系數(shù)的絕對值越大,相關性越強,正數(shù)表示正相關,負數(shù)表示負相關。
總體相關系數(shù)公式如下:
其中 cov(X,Y)是X,Y的協(xié)方差,σX是X的標準差,σY是Y的標準差。
2.4.3 滑動T檢驗(Moving T test , MTT)
上述兩種方法分別通過維度拆分、考慮趨勢變化來定位預警的深度原因,已經(jīng)比較周全,但仍存在問題,例如:開啟的實驗和頁面的預警不能完全匹配。因此針對實驗維度,啟用了另外一種方案來解決,該方案通過匹配KPI的突變時刻與業(yè)務變更時間來實現(xiàn)。
具體來說,對于每條預警信息,首先獲取當天分鐘級別的pv、uv值,分別作為兩組特征變量。對于每一組特征變量,使用滑動T檢驗(Moving T test , MTT)算法來定位發(fā)生突變的時刻。
滑動t檢驗是通過考察兩組樣本平均值的差異是否顯著來檢驗突變。其基本思想是把序列中兩段子序列均值有無顯著差異看作來自兩個總體均值有無顯著差異的問題來檢驗。如果兩段子序列的均值差異超過了一定的顯著性水平,則可以認為有突變發(fā)生。
找到突變時刻后,可以將其與業(yè)務變更時間點進行匹配。若在時間范圍內匹配成功,則數(shù)據(jù)變化可能與該業(yè)務變更有一定關聯(lián)。如:結合了AB實驗的數(shù)據(jù),獲取了所有AB實驗流量開啟、分流結果等的操作信息。若數(shù)據(jù)突變點前10分鐘內,預警頁面有相關的實驗操作變更,則輸出相應的實驗歸因數(shù)據(jù)。
2.4.4 歸因結果聚合輸出
在得到上邊四個算法的結果后,按照既定的根因分類,根據(jù)根因實際情況,使用單個模型或多個模型的EP值結果限制卡點,進行歸因結果聚合。
接下來,拆解這些根因的實際算法使用考量。
- 核心優(yōu)化的異常深度歸因和相似異常推薦。首先會根據(jù)配置表中的“對該類會有影響的根因類型”和“其他不相關異常推薦類型”,進行算法結果的過濾。在該場景下,主要使用趨勢相似性算法結果,深度歸因結果作為輔助過濾條件。
- 操作系統(tǒng)等不會短期內變化的維度,則會主要使用趨勢相似度模型,再把維度拆分模型的結果作為輔助參考,獲得更準確的歸因結果
- 版本等維度,由于他們的變化情況及異常波動較大,相比之下就并不適合使用相似度模型,因此僅使用維度拆分模型結果,反而會更精確。
- 實驗維度,直接使用突變點與實驗操作變更匹配數(shù)據(jù)進行輸出。
有了歸因結果后,最終會以預警郵件或消息的形式發(fā)送給相關開發(fā),并以監(jiān)控報表的形式,來展示多維度的分布數(shù)據(jù)和異常明細,以提高整體排障效率。
看下實際案例:
案例1:6月9日,某詳情頁白屏上升,歸因到代碼報錯升高導致
該日,通過多天的同環(huán)比規(guī)則權重疊加,監(jiān)控出該頁面白屏上升,報錯率從0.22%上升至0.38%。
通過算法歸因結果輸出:鎖定了操作系統(tǒng)、版本及頻道;且深度歸因發(fā)現(xiàn),該類報錯,是由于底層代碼報錯升高導致,兩者間的關聯(lián)度為97%。
歸因結果給到開發(fā)有指向性的排查方向,提高排障效率。
案例2:5月21日,某頁面圖片慢加載上升,歸因到與業(yè)務實驗開啟有關
該日,通過多天的同環(huán)比規(guī)則閾值限制,監(jiān)控出該頁面圖片慢加載上升,報錯率從24%上升至70%。
通過算法歸因結果輸出,該異常升高與平臺、系統(tǒng)、及實驗開啟有關。
歸因結果直接定位到了實驗,精確到影響該異常的需求改動及關系方,以更好的評估新需求對系統(tǒng)性能是否帶來影響。
三、階段成果&后續(xù)規(guī)劃
3.1 階段成果
1)預警的準確性升高:老版監(jiān)控的準確度約為60%,會有數(shù)據(jù)正常波動的場景也誤觸預警的情況;新版預警歸因系統(tǒng)的準確率約為89%,有比較明顯的改善。
2)從歸因結果提供、排查報表數(shù)據(jù)整合、排查鏈路縮減三個方面來看,整體排查時間縮短約40%。
3)數(shù)據(jù)池中接入40+的數(shù)據(jù)類型。
4)已有19個傳統(tǒng)預警、資源消耗監(jiān)控,接入到新版智能預警歸因系統(tǒng)中。
5)新版歸因系統(tǒng)已發(fā)現(xiàn)問題約70+個,其中圖片相關問題20+、頁面慢加載問題10+、資源消耗問題7個……。預警后系統(tǒng)能直接找到影響的根本原因,如:內存上漲與圖片size變大有關,流量上漲與服務調用次數(shù)變多有關;異常變化與實驗開啟有關。
6)該系統(tǒng)降低了不同數(shù)據(jù)源增加監(jiān)控的開發(fā)成本。
3.2 后續(xù)規(guī)劃
- 豐富預警規(guī)則,提高預警的精確度
- 傳統(tǒng)預警繼續(xù)接入新版歸因系統(tǒng)中
- 多類指標大盤監(jiān)控數(shù)據(jù),接入智能預警歸因系統(tǒng)
- 單日預警接入bug缺陷提交系統(tǒng)