視頻監(jiān)控落地四要素:預(yù)測、檢測、報警及定位
圖4 均值漂移原理
從上圖可以看到,均值漂移模型的算法原理,實際上是把程序不容易識別的陰跌趨勢,轉(zhuǎn)換成CUSUM時間序列,它的趨勢很明顯,在變點左側(cè)單調(diào)增、右側(cè)單調(diào)減,CUSUM時間序列描述了被監(jiān)測時間序列每個點偏離均值的累積變化量,它的規(guī)律是從S0=0開始,到Sn=0結(jié)束,變點兩側(cè)單調(diào)變化。
CUSUM=Cumulative Sum。累積和用以在某個相對穩(wěn)定的數(shù)據(jù)序列中,檢測出開始發(fā)生異常的數(shù)據(jù)點。累積和最典型的應(yīng)用是在“改變檢測”(Change Detection)中對參量變化的檢測問題轉(zhuǎn)化了以后,用程序求CUSUM序列上每個點的一階導(dǎo)數(shù),從持續(xù)增變?yōu)槌掷m(xù)減即可判定為變點,至于持續(xù)增、減多少個點,由自己來設(shè)定。
關(guān)于變點檢測使用的mean-shift模型,大家可以去網(wǎng)上找找paper,我這臺電腦上找不到了,上面主要說明了發(fā)現(xiàn)變點的原理,通俗地講,就是把問題轉(zhuǎn)化成程序容易解決的狀態(tài)陰跌線程序不容易量化衡量、判斷,那么就用CUSUM控制圖里的“富士山”形狀去尋找,這是我個人的通俗解釋。
上面說到我們使用CUSUM序列上每個點的一階導(dǎo)數(shù)來判斷拐點(變點)是否到來,其實圖上這個例子是比較理想的情況,在我應(yīng)用mean-shift模型時,遇到了一些復(fù)雜情況,比如這個圖上就一個“山頭尖”,但是也時候會有多個,這種情況下就要再次轉(zhuǎn)化問題,比如可以把CUSUM再差分,或者以我們的做法,記錄一階導(dǎo)數(shù)的狀態(tài)值,從連續(xù)N個正值變?yōu)槌掷m(xù)N個負(fù)值時可以判定。
另外,變點檢測的算法實現(xiàn)我這里不方便詳細(xì)說明,其中變點在反復(fù)迭代時自己可以根據(jù)實際情況設(shè)定迭代次數(shù)和置信度,有助于提高變點發(fā)現(xiàn)的準(zhǔn)確性。
4、智能全景
變點檢測彌補(bǔ)了動態(tài)閾值對細(xì)微波動的檢測不足,這兩種方式結(jié)合起來,基本可以達(dá)到不漏報和不誤報的平衡,同時也不需要人工長期維護(hù),這是智能全景監(jiān)控的基礎(chǔ)。當(dāng)監(jiān)控的人力成本節(jié)省了以后,理論上我們可以依賴智能監(jiān)控?zé)o限制的開拓監(jiān)控視野,并將這些監(jiān)控報警連結(jié)起來分析。
監(jiān)控項的自動發(fā)現(xiàn)規(guī)則,比如對維度D的指標(biāo)M做實時監(jiān)控,維度D下可能由1000種維度值,而且是不斷變化的1000種,如何讓程序自動維護(hù)監(jiān)控項?你可以制定一個規(guī)則,比如指標(biāo)M>X則認(rèn)為需要監(jiān)控(畢竟不是所有的都需要監(jiān)控報警,至少在目前故障定位處理沒有完全自動化的狀況下,報警處理也是需要一定人力的)。在滿足M>X的條件下,為了提高報警準(zhǔn)確性,我們還需要根據(jù)重要性區(qū)分報警靈敏度,也就是對于宏觀、核心的維度值我們希望能夠非常靈敏的監(jiān)控波動,而對于非重要的維度值我們預(yù)測閾值可以寬松一些,這些可以通過上面說的閾值參數(shù)來設(shè)定。
(說明:這個規(guī)則我這里只是舉一個例子,各位同仁可以根據(jù)自己的實際場景去實現(xiàn)一些規(guī)則,比如系統(tǒng)運維層面的監(jiān)控,有些是按照距離故障發(fā)生的速度或風(fēng)險系數(shù)來判斷,那么就可以圍繞這種指標(biāo)來制定,假如是對磁盤利用率的監(jiān)控,就是容量增長速度與剩余資源比例作為參考等等)
以上條件都滿足了之后,智能全景監(jiān)控基本可以運行,不過我們也曾遇到一些其他的問題,比如業(yè)務(wù)方需要接入監(jiān)控,但是不一定是必須要我們解析日志,他們有自己的數(shù)據(jù),可能是數(shù)據(jù)庫、接口返回、消息中間件里的消息等等。所以,我們在數(shù)據(jù)接入上采用分層接入,可以從日志標(biāo)準(zhǔn)輸出格式、存儲的時間序列schema約定、閾值預(yù)測的接口三個層次接入使用,這個內(nèi)容將在下一次分享時由我的同事單獨介紹。這里之所以提到,是因為全景監(jiān)控接入的數(shù)據(jù)比較多,所以接入途徑要有層次、靈活性。
5、輔助定位
報警的最終目的是減少損失,所以定位問題原因尤為重要。Goldeneye嘗試著用程序去執(zhí)行人工定位原因時的套路,當(dāng)然這些套路目前是通過配置生成的,還沒有達(dá)到機(jī)器學(xué)習(xí)得出來的地步,不過當(dāng)業(yè)務(wù)監(jiān)控指標(biāo)接入的越來越多,指標(biāo)體系逐漸完善以后,通過統(tǒng)計學(xué)的相關(guān)性分析,這些套路的生成也有可能讓程序去完成。這里我介紹一下,程序可以執(zhí)行的人工總結(jié)處的幾個套路。
(1)全鏈路分析
從技術(shù)架構(gòu)、業(yè)務(wù)流程的角度,我們的監(jiān)測指標(biāo)是否正常,從外部因素分析,一般會受到它的上游影響。按照這個思路,逐一分析上游是否正常,就形成了一條鏈路。這種例子很多,比如系統(tǒng)架構(gòu)的模塊A,B,C,D,E的QPS。
圖5 全鏈路tracing
(插一句,全鏈路分析有兩種數(shù)據(jù)記錄方式,要么鏈路每個節(jié)點內(nèi)部透傳,拼接成完整鏈路處理信息記錄到最終的節(jié)點日志;要么異步地每個節(jié)點各自將信息push到中間件)
(2)報警時間點上發(fā)生了什么?
這是收到監(jiān)控報警后大多數(shù)人的反應(yīng),我們把運維事件、運營調(diào)整事件盡可能地收集起來,將這些事件地散點圖和監(jiān)測報警的控制圖結(jié)合起來,就能看出問題。如果程序自動完成,就是將事件發(fā)生的時間點也按相同的方式歸一化到固定周期的時間點,檢查與報警時間點是否吻合。
圖6 生產(chǎn)事件與時間序列
(3)A/B test或TopN
有些人定位問題,使用排除法縮小出問題的范圍。比如在維度D上指標(biāo)M有異常波動,可以將D拆分成D1,D2,D3來對比,常見的具體情況比如機(jī)房對照、分組對照、版本對照、終端類型對照等等,如果在監(jiān)測數(shù)據(jù)層級清晰的基礎(chǔ)上,我們可以一層一層的鉆取數(shù)據(jù)做A/B test,直到定位到具體原因。還有一種方式,不是通過枚舉切分做A/B test,而是直接以指標(biāo)M為目標(biāo),列出維度D的子維度D1,D2,D3,……中指標(biāo)M的TopN,找出最突出的幾項重點排查。
圖7 A/B test or TopN
topn也是類似的。大家可以也能看出來,智能監(jiān)控和輔助定位是需要一個清晰的數(shù)據(jù)層級和元數(shù)據(jù)管理系統(tǒng)來支撐的,這一點很基礎(chǔ)。
(4)關(guān)聯(lián)指標(biāo)
不同的指標(biāo)在監(jiān)控中都是持續(xù)的時間序列,有些指標(biāo)之間是函數(shù)關(guān)系,比如ctr=click/pv,click和pv的變化必然帶來ctr的變化,這種聯(lián)系是函數(shù)直接描述的。還有一些指標(biāo)的關(guān)聯(lián),無法用函數(shù)公式描述,它們之間的相關(guān)性用統(tǒng)計學(xué)指標(biāo)來衡量,比如皮爾遜系數(shù)。Goldeneye的指標(biāo)關(guān)聯(lián)依據(jù),目前還沒有自動分析,暫時是人工根據(jù)經(jīng)驗設(shè)置的,只是視圖讓程序去完成追蹤定位的過程,比如指標(biāo)M1出現(xiàn)異常報警后能夠觸發(fā)相關(guān)指標(biāo)RMG1/RMG2/RMG3的檢測(因為這些指標(biāo)可能平時不需要7*24小時監(jiān)控報警,僅在需要的時候check),以此類推逐級檢測定位。
圖8 關(guān)聯(lián)指標(biāo)
這些方式或許大家平時也嘗試著去做過一些程序化的處理,我個人認(rèn)為關(guān)聯(lián)指標(biāo)的方式,基礎(chǔ)在于構(gòu)建指標(biāo)體系,這個構(gòu)建過程可以是人工經(jīng)驗和程序統(tǒng)計分析的結(jié)合,指標(biāo)體系至少能夠描述指標(biāo)的分類、數(shù)據(jù)出處、具體含義、影響相關(guān)指標(biāo)的權(quán)重等等,有了這些基礎(chǔ)才能應(yīng)用統(tǒng)計學(xué)的分析方法完成。
四、難點
1、時間序列平穩(wěn)化
平穩(wěn)化的時間序列,對預(yù)測準(zhǔn)確性有非常重要的意義,可是我們的業(yè)務(wù)監(jiān)測時間序列恰好大多數(shù)都不是平穩(wěn)化的,以5分鐘的監(jiān)測周期為力,除了大盤及核心監(jiān)測序列,其他的時間序列都是在一定范圍內(nèi)正常波動但總體趨勢卻是穩(wěn)定的。我們目前采用的方法是:
(1)滑動平均,比如波動鋸齒明顯,容易造成誤報干擾的化,則加大監(jiān)控監(jiān)測周期,將5分鐘提高到30分鐘,相當(dāng)于擬合6個時間窗口的數(shù)據(jù)來平滑時間序列。
(2)持續(xù)報警判斷,如果覺得30分鐘發(fā)現(xiàn)問題會比較晚,可以按5分鐘檢測,鋸齒波動容易發(fā)生報警,但可以連續(xù)3次報警再發(fā)通知,這樣就避免了鋸齒波動的誤報。
(3)對于需要均值漂移來檢測細(xì)微波動的情況,24小時的時間序列本身有流量高峰和低谷,這種情況一般采用差分法做平滑處理,使用幾階差分自己掌握。Goldeneye沒有直接使用差分法,因為我們已經(jīng)預(yù)測了基準(zhǔn)值,所以我們使用實際監(jiān)測值與基準(zhǔn)值的gap序列作為變點監(jiān)測的輸入樣本。
2、埋點代價
業(yè)務(wù)監(jiān)控的監(jiān)測數(shù)據(jù)來源主要是日志、業(yè)務(wù)系統(tǒng)模塊吐出到中間件、采集接口被push,從系統(tǒng)各模塊吐出數(shù)據(jù)到中間件似乎比直接寫入磁盤的IO開銷小很多,不過對于請求壓力比較大的系統(tǒng),開旁路寫出數(shù)據(jù)即使是內(nèi)存級也是有一定開銷的。
解決這個問題的辦法是數(shù)據(jù)采樣,對于在時間上分布均勻的監(jiān)測數(shù)據(jù),直接按百分比采樣。
3、數(shù)據(jù)標(biāo)準(zhǔn)化
雖然數(shù)據(jù)接入是分層開放的,但是我們還是制定了標(biāo)準(zhǔn)的數(shù)據(jù)格式,比如時間序列數(shù)據(jù)存儲schema,可擴(kuò)展的日志消息proto格式,在這些結(jié)構(gòu)化數(shù)據(jù)的定義中,可以區(qū)分出業(yè)務(wù)線、產(chǎn)品、流量類型、機(jī)房、版本等一些標(biāo)準(zhǔn)的監(jiān)控維度信息,這樣做的目的是以后可以將這些監(jiān)測數(shù)據(jù)和故障定位的指標(biāo)相關(guān)性分析銜接起來。
但是,這些標(biāo)準(zhǔn)化的推進(jìn)需要很多參與者的認(rèn)可和支持,甚至需要他們在系統(tǒng)架構(gòu)上的重構(gòu),看似是比較困難的。
目前可以想到的辦法,就是在旁路吐出監(jiān)測數(shù)據(jù)時,以標(biāo)準(zhǔn)化的消息格式封裝,然后保證在Goldeneye的存儲層有標(biāo)準(zhǔn)的schema和接口訪問。
五、今后的優(yōu)化方向
時間序列預(yù)測模型,目前的模型只考慮了日期、節(jié)假日/周末、時間段的因素,沒有年同比趨勢、大促活動影響、運營調(diào)整影響的因素,需要抽象出來。
指標(biāo)相關(guān)性由統(tǒng)計分析程序來確定。
評論