雪花台湾

時間序列的聯動分析

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

背景介紹

在互聯網公司裡面,通常都會監控成千上萬的時間序列,用於保障整個系統或者平台的穩定性。在這種情況下,如果能夠對多條時間序列之間判斷其是否相關,則對於監控而言是非常有效的。基於以上的實際情況,清華大學與 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 的流程圖如下圖所示:

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

CoFlux 的細節闡述

已知一個長度是 的時間序列 ,對於任意一個 detector,可以得到一條關於 的預測值曲線 。於是針對某個 detector 可以得到一個波動特徵序列 ,其中 。因此,一個detector 可以對應一個波動序列特徵,也是一個時間序列。因此,對於 個 detector,可以對應 條波動特徵序列,並且它們的長度都是

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

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

根據直覺來看,

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

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

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

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

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

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

Step 1:對波動特徵曲線 做 z-score 的歸一化,i.e.

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

放大之後的波動特徵曲線(amplified flux feature)就是:

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

這裡的 0 的個數是 個。其中, 。特別地,當 時, ,那麼我們可以定義 的內積是: 這裡的 指的是向量之間的內積(inner product)。同時可以定義相關性(Cross Correlation)為: 由於波動有可能是反向的,那麼在這裡我們不僅要考慮相關性是大於零的情況,也需要考慮小於零的情況。於是, 則最小值或者最大值的指標分別是

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

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

CoFlux 的實戰效果

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

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

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

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

告警壓縮

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

告警關聯

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

構建告警關係鏈

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

結論

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


推薦閱讀:
相关文章