原文鏈接:時間序列的聯動分析

背景介紹

在互聯網公司裡面,通常都會監控成千上萬的時間序列,用於保障整個系統或者平台的穩定性。在這種情況下,如果能夠對多條時間序列之間判斷其是否相關,則對於監控而言是非常有效的。基於以上的實際情況,清華大學與 Alibaba 集團在2019年一起合作了論文《CoFlux: Robustly Correlating KPIs by Fluctuations for Service Troubleshooting》,並且發表在 IWQos 2019 上。CoFlux 這個方法可以對多條時間序列來做分析,並且主要用途包括以下幾點:

  1. 告警壓縮和收斂;
  2. 推薦與已知告警相關的 Top N 的告警;
  3. 在已有的業務範圍內(例如資料庫的實例)構建異常波動傳播鏈;

CoFlux 的整體介紹

從論文的介紹中來看,CoFlux 的輸入和輸出分別是:

輸入:兩條時間序列

輸出:這兩條時間序列的以下信息

  1. 波動相關性:兩條時間序列是否存在波動相關性?
  2. 前後順序:如果兩條時間序列相關,那麼它們的前後波動順序是什麼?是同時發生異常還是存在固定的前後順序?
  3. 方向性:如果兩條時間序列是波動相關的,那麼它們的波動方向是什麼?是一致還是相反?

Remark. CoFlux 的關鍵點就是並沒有對時間序列做異常檢測演算法,而是直接從時間序列的歷史數據(歷史半個月或者一個月)出發,判斷兩條時間序列之間的波動相關性,並且進一步的分析先後順序與波動方向。

從論文的介紹中來看,CoFlux 的流程圖如下圖所示:

如果兩條時間序列 XY 存在波動相關性,則需要輸出這兩條時間序列的波動先後順序和是否同向波動。如果兩條時間序列 XY 並不存在波動相關性的話,則不需要判斷波動先後順序和是否同向波動。

CoFlux 的細節闡述

已知一個長度是 n 的時間序列 S={s_{1},cdots,s_{n}} ,對於任意一個 detector,可以得到一條關於 S 的預測值曲線 P={p_{1},cdots,p_{n}}。於是針對某個 detector 可以得到一個波動特徵序列 E={epsilon_{1},cdots,epsilon_{n}} ,其中 epsilon_{i} = s_{i} - p_{i}1leq ileq n 。因此,一個detector 可以對應一個波動序列特徵,也是一個時間序列。因此,對於 m 個 detector,可以對應 m 條波動特徵序列,並且它們的長度都是 n

在 CoFlux 演算法的內部,根據不同的參數使用了總共 86 個 detector,大致列舉如下:

  • Difference:根據昨天,七天前的數據來做差分;
  • Holt-Winters: {alpha,eta,gamma} in {0.2,0.4,0.6,0.8}
  • 歷史上的均值 & 歷史上的中位數:1,2,3,4 周;
  • TSD & TSD 中位數:1,2,3,4 周;
  • Wavelet:1,3,5,7 天;
  • 移動平均演算法:MA,WMA,EWMA。PS:根據作者們的說法,在這裡,MA等方法並不適用。

根據直覺來看,

  • 對於任何一條時間序列 kpi,總有一個 detector 可以相對準確地提煉到其波動特徵;
  • 如果兩條時間序列 XY 波動相關,那麼 X 的一個波動特徵序列與 Y 的一個波動特徵序列應該也是相關的;

Remark. 兩條時間序列的波動特徵可以對齊同一個 detector,也可以不做對齊工作。如果是前者的話,時間複雜度低;後者的話,時間複雜度高。

下圖是從時間序列中提取波動特徵曲線的案例:

提煉時間序列的波動曲線特徵只是第一步,後續 CoFlux 還有幾個關鍵的步驟:

  • 特徵工程的擴大(amplify): 對波動序列特徵進行放大,讓某些波動序列特徵更加明顯;
  • Correlation Measurement:用於解決時間序列存在時間前後的漂移,兩條時間序列之間存在 lag 的情況,因此需要對其中一條時間序列做平移操作;
  • CoFlux 考慮了歷史數據(歷史半個月或者一個月)作為參考,並且一個範圍內的 kpi 數量不超過 60 條;

下面來一一講解這些技術方案,對於每一條波動特徵曲線(Flux-Features),按照以下幾個步驟來進行操作:

Step 1:對波動特徵曲線 E={epsilon_{1},cdots,epsilon_{n}} 做 z-score 的歸一化,i.e.

egin{eqnarray*} mu &=& frac{sum_{i=1}^{n}epsilon_{i}}{n}, \ delta &=& sqrt{frac{sum_{i=1}^{n}(epsilon_{i}-mu)^{2}}{n}}. end{eqnarray*}

Step 2:對歸一化之後的波動特徵曲線做特徵放大(feature amplification):定義函數 f_{alpha,eta}(x) 如下:

 f_{alpha,eta}(x)= egin{cases} e^{alphamin(x,eta)} - 1, 	ext{ when } xgeq 0,\ -e^{alphamin(|x|,eta)} + 1, 	ext{ when } x< 0. end{cases} E={epsilon_{1},cdots,epsilon_{n}} 放大之後的波動特徵曲線(amplified flux feature)就是: hat{E}={f(epsilon_{1}), cdots,f(epsilon_{n})}.

Step 3:對於兩條放大之後的波動特徵曲線(amplified flux features) G={g_{1},cdots,g_{ell}}H={h_{1},cdots,h_{ell}} ,可以計算它們之間的相關性,先後順序,是否同向。

egin{eqnarray*} G_{s}= egin{cases} {0,cdots,0,g_{1},cdots, g_{ell-s}}, 	ext{ when } sgeq 0, \ {g_{1-s},cdots,g_{ell},0,cdots,0}, 	ext{ when } s< 0. end{cases} end{eqnarray*} 這裡的 0 的個數是 |s| 個。其中, -ell<s<ell 。特別地,當 s=0 時, G_{0}={g_{1},cdots,g_{s}}=G ,那麼我們可以定義 G_{s}H 的內積是: egin{eqnarray*} R(G_{s},H) = G_{s}cdot H, end{eqnarray*} 這裡的 cdot 指的是向量之間的內積(inner product)。同時可以定義相關性(Cross Correlation)為: egin{eqnarray*} CC(G_{s},H) = frac{R(G_{s},H)}{sqrt{R(G_{s},G_{s})cdot R(H,H)}}. end{eqnarray*} 由於波動有可能是反向的,那麼在這裡我們不僅要考慮相關性是大於零的情況,也需要考慮小於零的情況。於是, egin{eqnarray*} minCC &=& min_{-ell<s<ell}CC(G_{s},H), \ maxCC &=& max_{-ell<s<ell}CC(G_{s},H). end{eqnarray*} 則最小值或者最大值的指標分別是 egin{eqnarray*} s_{1}&=&argmin_{-ell<s<ell}CC(G_{s},H), \ s_{2}&=&argmax_{-ell<s<ell}CC(G_{s},H). end{eqnarray*}

egin{eqnarray*} FCC(G,H) = egin{cases} (minCC, s_{1}), 	ext{ when } |maxCC|<|minCC|, \ (maxCC, s_{2}), 	ext{ when } |maxCC|geq|minCC|. end{cases} end{eqnarray*}

從定義中可以看出, FCC(G,H) 是一個元組,裡面蘊含著三個信息,分別是相關性,波動方向,前後順序。 FCC(G,H) in [-1,1] ,越接近 1 或者 -1 就表示放大之後的波動特徵曲線 GH 越相關。正值的 FCC(G,H) 表示 GH 的波動方向相同,是正相關;負值的 FCC(G,H) 表示 GH 的波動方向想法,是負相關。通過對 s<0 或者 sgeq 0 的分析就可以判斷先後順序。因此,CoFlux 方法的是通過對 FCC(G,H) 的分析來得到最終結果的。

在最後的相關性分析裡面,其實偽代碼正如論文中所示。先考慮是否存在相關性,再考慮基於相關性下的先後順序和波動方向。

CoFlux 的實戰效果

從論文中看,CoFlux 的數據集基本上是小於 60 條時間序列曲線。其中包括 CPU,錯誤率,錯誤數,內存使用率,成功率等不同的指標。

從運行時間上來看,對於一周的時間序列集合(< 60條)而言,CoFlux 基本上能夠在 30 分鐘內計算完畢,得到最終的運算結果。

其效果的評價指標基本上就是機器學習中的常見評價指標了,準確率,召回率之類的。

從 F1-Score 的評價指標來看,CoFlux 的效果優於其他演算法。

告警壓縮

如果對時間序列之間進行告警壓縮的話,其實可以大量減少運維人員的工作量。在 CoFlux 裡面,時間序列曲線被分成了三類,也就是三個顏色最深的模塊。因此 21 條時間序列的告警量在實際中有可能只有三條告警。

告警關聯

在實際運維場景中,除了對告警進行壓縮之外,也需要對告警進行關聯性的分析。例如一條告警發生了,運維人員都希望知道與它相關的其他告警是什麼,這樣可以方便運維人員定位問題。

構建告警關係鏈

在一些相對封閉的場景下,例如 mysql 資料庫,通過對它裡面的時間序列進行分析。不僅可以得到告警之間是否存在相關性,還可以對先後順序,波動順序進行分析。

結論

時間序列之間的聯動分析是在運維領域場景下的常見技術,不僅可以做告警的壓縮,也能夠做告警的關聯,還能夠構建告警的關係鏈。在未來的工作中,作者們提到將會用深度學習的方法來進行關聯和告警的分析,從而進一步加深對時間序列的研究。


推薦閱讀:
相关文章