告警數下降10倍,攜程實時智能檢測平臺實踐

將實時計算和深度學習相結合,可解決某種特定的業務場景。本次將分享基於tensorflow和flink構建攜程的實時智能檢測平臺。

 

今天分享的主要內容分爲四個部分:

 

  • Background

  • What is Prophet

  • AI and Real Time

  • Challenges and Future

 

一、背景介紹

 

每個公司都會有監控平臺,大部分的監控平臺都是根據規則告警做監控指標的預警,規則告警一般都是根據統計學的方式,例如,某個指標的同比、環比的上升或下降,這就需要設置閾值或者一個衡量的百分比。因此,會出現很多問題:

 

 

  • 規則告警會出現複雜的配置

  • 規則告警的效果比較差

  • 規則維護成本比較高

 

除了以上問題,攜程還有一些其他的問題,公司級別的監控系統有三個,根據不同的業務場景會構建相應的監控平臺,在公司內部大大小小的監控平臺會有十多個,在每個監控平臺構建配置對用戶而言是非常繁瑣的,根據以上的問題,攜程構建了實時平臺Prophet。

 

二、什麼是Prophet?

 

Prophet是一站式異常檢測解決方案,主要的靈感來源是來自Facebook的Prophet,但是所做的內容是有很多區別的。

 

1、Prophet一站式異常檢測解決方案包括

 

 

  • 基於時序類型的數據

  • 以監控平臺爲接入對象,不是以用戶爲目標,將規則告警全部下線,應用智能告警代替

  • 採用深度學習的算法來實現異常的智能告警

  • 基於實時計算的引擎實現異常的實時預警

 

2、Prophet的系統架構

 

 

  • 底層爲Hadoop底層。YARN作爲資源調度引擎,主要運行Flink作業任務,HDFS主要是存儲Tensorflow訓練的模型。

  • 中間層是引擎層。數據要實時必須要存儲在消息隊列當中,使用的是kafka,想要實現實時的異常預警使用的是flink的計算引擎,深度學習的訓練引擎使用的是tensorflow,還會基於時間序列的數據庫存儲數據。

  • 上層是對外提供服務的平臺層。Clog的作用是採集作業日誌,Muise是實時計算平臺,Qconfig是提供作業中需要的配置項,Hickwall簡單的監控告警平臺。

 

 

3、Flink

 

當前有很多實時計算引擎,選擇Flink作爲計算引擎有以下原因:

 

 

  • 高效的狀態管理,在異常檢測中需要很多的狀態信息需要存儲,Flink自帶的state backends能夠很好的存儲中間狀態

  • 提供豐富的窗口,比如滾動窗口、滑動窗口以及其他窗口,攜程使用的是滑動窗口,後續會進一步講解

  • 支持多種時間語義,一般使用的是Event Time

  • 不同級別的容錯語義

 

4、Prophet的操作流程

 

 

對於用戶而言需要做什麼事情?對於用戶而言是無感知的,並不需要在攜程監控平臺配置監控指標,用戶只需要在常用的監控的平臺配置監控告警,選擇智能告警就可以。後續的所有工作都是智能監控平臺與智能告警平臺進行交互。

 

用戶配置監控平臺的指標,監控平臺會把用戶的配置指標同步到Prophet平臺,接收到新的指標就會進行模型訓練,使用tensorflow訓練模型,實時數據導入到kafka中,對於歷史數據,如果用戶能夠提供接口就會使用,沒有就會使用消息隊列中積累的數據集進行訓練,訓練完成就會上傳至HDFS,更新配置,在配置中心會傳到Flink,需要對應的加載模型,推送的實時數據會保存到時序數據庫中,因爲在後面的異常檢測中會需要用到。

 

中間是模型訓練的過程,當模型訓練完成,Flink的作業監聽到配置發生更新,嘗試加載新的模型,實時的消費kafka中的數據,最終產生一個預測結果,異常的告警結果都會寫回到Kafka,各個監控平臺都會消費消息,獲取各自監控平臺的告警消息。整個過程對用戶都無感知的。

 

三、智能化與實時化

 

1、智能化挑戰

 

 

  • 負樣本少,異常發生頻率低

  • 業務指標類型多,訂單、支付等

  • 業務指標形態多,週期波動、穩定、非週期

 

 

針對以上問題嘗試使用了很多種深度學習的算法,如下:

 

RNN和LSTM需要給每個指標訓練一個模型,基於這個模型預測當前數據集的走向,拿預測數據集和當前的數據集進行比對,進行異常檢測。每個指標都需要訓練一個模型,需要消耗比較大的資源,好處就是準確率比較高。

 

DNN模型,一個模型可以搞定所有業務場景,問題是特徵的提取會比較複雜,需要提取特徵不同頻率的指標,對於這個特徵需要用戶對大量數據進行標註,判定那種情況歸屬爲異常,這種情況比較複雜。

 

2、模型訓練的流程

 

攜程的業務基本兩個星期更新一個版本,每個業務指標每兩週都會嘗試訓練一次,模型的訓練數據也是兩週一次。

 

 

數據預處理。比如空值或null值,在數據中會有很多的異常區間,因此需要根據之前的預測值把這些異常區間的異常值進行替換;還有需要把節假日的數據進行替換,節假日的情況會比較複雜,會有相對用的應對方式,這個模型主要是平日的數據的訓練週期。

 

提取特徵。提取不同時序的特徵,或者是頻率特徵,然後訓練一個分類模型,判斷這個特徵是一個什麼類型的指標,比如說週期或者非週期,針對不同的指標會使用不同的模型。

 

3、模型的動態加載

 

 

模型訓練完成上傳,通知到配置中心,Flink作業收到信息,會從HDFS中拉取模型,爲了將每一個模型均勻的分佈在每個Task Manager中,所有的監控指標會根據id均勻的分佈在Task Manager。

 

4、數據實時消費與預測

 

 

要做一個實時的異常檢測,從kafka消息隊列中消費一個當前的實時數據,Flink Event Time+滑動窗口,監控的時間粒度很多種,例如選取分鐘的力度,選取十分鐘,Flink作業中會開一個窗口,長度爲10個時間點,當數據積累到十分鐘就可以進行數據的實時預測,會使用前面的五個數據來預測下一個數據,採用平滑的方式依次向後移動,從而獲得五個實際值和預測值的對比。

 

 

然而在實際情況下並非這樣簡單。現實情況下會出現很多的數據缺失,這些數據有可能再也不能消費,比如說由於網絡抖動的原因再也找回這些數據。需要對這些確實的數據進行插補,使用均值或者標準差替換缺失數據。如果在一個區間內的數據是異常值,需要使用上一批次訓練出來的預測值,將異常數據進行替換,作爲模型的輸入,得到一個新的預測值。

 

5、實時異常檢測

 

 

① 基於異常類型與敏感度判斷。不同指標會有不同的異常類型,有的是下降的異常,有的是上升的異常。其次會有一個敏感度,分爲中高低,對於高敏感度異常,發生簡單抖動就會認爲會有一個異常,對於中敏感度連續出現這樣的抖動纔會認爲是異常。

 

② 基於預測集與實際集的偏差判斷。判斷爲某個區間爲異常區間,需要同上週期的同一時間做對比,如果偏差較大,則認爲這是一個異常區間。

 

③ 基於歷史同期數據均值與標準差判斷。潛在異常還需與歷史週期數據比較來最終確認是否存在異常。

 

 

上面所說的技術都能夠應用於這樣的場景:

 

常見問題:對於用戶來說,監控指標太多,監控的維度也比較多。比如一個指標可能有 max、min 等不同的統計方式,監控指標的數量就會比較多。其次,用戶能力有限,很難每日查看監控告警。

異常原因:發生異常的原因一般會是技術性問題。如發佈新版本上線時可能存在的 bug 導致業務出現下跌。少數的情況是由於外部因素的影響,比如調用外部鏈接或者服務,外部服務宕掉導致自己的服務出現問題。

 

解決方案:用戶爲 Prophet 提供的檢測結果進行標註,選擇檢測結果的正確性。用戶的標註數據會用到 Prophet 以後的模型訓練中用於優化數據集。

 

6、節假日場景

 

 

節假日場景的問題如下:

 

① 不同業務間上漲或下跌的趨勢不同。比如攜程的機票或者火車票基本在節前會上升到一定量,到節假期的期間會逐漸下降;對於酒店,節假期間會上升很多。因此不同業務的趨勢是不一樣的。

 

② 上漲幅度大,容易產生漏報。針對圖中上升較大的部分可能會產生漏報,例如上週最高的訂單量爲1000單,但是本週作爲節假日最高訂單量爲2000單,下降50%也會和上週持平,這樣模型可能會檢測不到。

 

③ 下跌幅度大,容易產生誤報。上週爲1000單,這周跌到500單,這是個正常值,但是繼續下跌就會產生誤報。

 

④ 小業務活動多,波動劇烈。

 

 

針對節假日場景出現的問題,攜程也做了很多的應對準備。維護每年的節假日信息表。程序會自動判斷距離下個節假日還有一週的時候,自動提取某個指標過去兩年內的不同節假日的數據,然後統計跟當前時段的數值的相似度,使用當前數據擬合過去的數據。基於當前和歷史的數據訓練一個新的模型。

 

 

當前基本覆蓋了攜程的所有的業務線。覆蓋了大部分重要的業務指標,把公司級別的系統監控平臺都已經接入,可以覆蓋95%的異常,報警的準備率達到75%。每個數據過來都會觸發數據的實時消費和預測,告警的延遲是毫秒級別的,告警的數量較以前下降十倍左右。

 

 

上面的效果對比基於2019年4月-5月的數據。左邊的Prophet的命中達到90%,規則告警只達到74%。

 

 

上圖是告警數量的對比。Prophet的告警數量比規則降低了5倍到10倍左右。

 

四、挑戰與展望

 

1、遭遇挑戰

 

 

  • 資源消耗大,單指標單模型,模型數量等同於指標數量

  • 節假日影響大,業務指標節假日趨勢不同告警準確性受影響

  • 無法適用於全部場景,波動劇烈的非週期性指標hold不住,比如遇到大促、活動等。

 

對於上面的遇到的挑戰,我們陸陸續續進行了改進。

 

2、未來展望

 

 

① 在通用模型中,並沒用着重分析DNN模型的應用,前面的所有流程和處理的邏輯都是針對LSTM。DNN模型可以一個模型通用於各個監控指標的,準確率相對LSTM要低,但是是能夠涵蓋一個比較多的場景。對於重要的指標,比如訂單、支付等重要的業務指標,使用LSTM,對於其它而言可以使用DNN模型。

 

② 節假日算法上線,採用節假日對齊方式依據上個節假日的數據加權作爲訓練數據,當前節假日算法已經運行半年多。

 

③ 覆蓋全部監控平臺,接入更多的監控平臺與指標當前已經覆蓋了70%-80%的監控平臺。

 

④ Flink作業會有一些性能的指標,未來打算用智能告警做一個自我監測的平臺,自我預警,從而帶來更好的效果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章