作者|梵登、白璵
稽核&校對:白璵
編輯&排版:雯燕
背景
異常檢測作為智慧運維(AIOps)系統中基礎且重要功能,其旨在通過演算法自動地發現 KPI 時間序列資料中的異常波動,為後續的告警、自動止損、根因分析等提供決策依據。那麼,我們該如何在實際場景中使用異常檢測呢,而異常檢測又是什麼,今天我們就進行一次深入講解。
什麼是異常檢測?
在一切開始前,我們首先需要了解什麼是異常檢測。異常檢測是指從時間序列或者事件日誌中,去識別出不正常的事件、現象等。我們這裡講的異常檢測特指時間序列的異常檢測。通過對時間序列的值大小,曲線形態等進行綜合判定,可以發現曲線異常點。異常的表現一般是指時間序列發生了不符合預期的上升、下降或者波動。
舉例來說:某臺機器的記憶體使用率指標一直在 40% 左右的水位波動, 突然飆升至 100%;某個 Redis 資料庫的連線數正常水平一直在 100 數量左右, 突然發生了大規模的下跌至 0 的現象;某個業務的線上人數在 10 萬左右波動,突然下跌到了 5 萬等等。
什麼是時間序列?
時間序列是指一組按照時間發生先後順序進行排列的資料點序列,通常一組時間序列的時間間隔為一恆定值(如 1 分鐘、5 分鐘)。
當前開源 Prometheus 是如何做異常檢測的?
目前開源版本的 Prometheus 檢測能力還是基於設定閾值規則方式進行,而這種依賴閾值設定的方式就引出了以下問題。
常見問題
問題 1:面對數以萬計的指標數量,如何快速又合理的完成檢測配置?
由於不同型別指標的含義差別大,對應設定的合理閾值也不太一樣。哪怕是同一種型別指標,由於業務狀態不一樣,往往不能用相同閾值。因此,在配置閾值時,運維人員需要根據對應的業務情況去配置自認為合理的閾值。由於運維人員認知水平和工作經驗存在差異,因此不同人員配置的閾值也存在差別。其次,很多指標沒有明確合理的範圍定義,這導致很多閾值配置都是“拍腦袋”確定的,隨機性比較強。
舉例來說:某線上人數指標, 必須仔細觀察分析歷史指標曲線的數值分佈和變化趨勢,才能設定出合理的閾值。
問題 2:隨著業務的演化,如何進行檢測規則的維護?
對於相對穩定的業務,業務指標長期處於穩定狀態,這種情況下配置的閾值可以發揮比較長時間作用。但對於時刻變化的業務, 伴隨業務的不斷演化,指標的水位和走勢也是在不斷變化。這些變化很容易導致一開始設定的閾值檢測,經過一段時間則不太滿足檢測現狀。這時候則需要運維專家定期核查檢測閾值是否還符合當前檢測需求,對不合理的配置進行維護與修改。因此,靜態閾值方式存在著維護成本高的問題。
舉例來說:某 IO 吞吐量一開始穩定在 1 萬的量值附近波動,一開始設定了檢測閾值為超過 2 萬則告警。但隨著業務發展,IO 吞吐量已穩定在 2.5 萬左右,這時候一開始設定的閾值就導致了源源不斷的告警叨擾。
問題 3:資料質量不佳如何解決?
資料質量不佳表現為幾種具體現象:採集延遲大、資料缺失值多、資料毛刺點比較多(反應在曲線上則是不夠平滑)。對於前面倆種, 更多的是從採集、聚合側進行鍼對性優化。ARMS-Prometheus 持續在採集能力進行優化。而對於資料毛刺點很多的資料質量問題,靜態閾值方式無法有效的規避。而在 ARMS- 託管版 Prometheus 的智慧運算元中, 我們則針對多毛刺點進行了有效的識別,保證了毛刺點不會形成無效告警, 減少使用者側/運維側形成叨擾。
阿里雲 Prometheus 監控是怎麼解決這些問題
面對以上問題,阿里雲 Prometheus 監控的檢測配置能力除了支援原生的設定閾值檢測方式,全面新增支援模板設定檢測閾值方式與智慧檢測運算元方式。
業務價值 1:高效高質量的告警配置
(1)針對明確的應用場景配置檢測規則,阿里雲 Prometheus 監控提供成熟的告警配置模板化,使用者無需人工設定閾值, 只需要選擇對應的模版即可。
例如:機器指標場景下, 配置“機器指標的 cpu 使用率 >80%”的模板。模板的方式解決了配置中明確異常且業務比較穩定的應用場景痛點。
(2)針對不明確的指標場景或不好設定的業務指標場景,則推薦使用智慧檢測運算元功能。
例如需要對某線上人數指標設定閾值, 這時需要花費很長的時間觀察歷史曲線狀態才能配置出合理的閾值。這種場景下使用者可以直接選擇智慧檢測運算元。
業務價值 2:自適應追蹤業務變化,大大降低檢測閾值維護成本
阿里雲 Prometheus 監控的智慧檢測運算元功能,通過設定參考歷史資料長度的引數,模型可以自適應的追蹤指標趨勢的變化,無需人工定期去審查配置規則。
業務價值 3: 對於質量不佳,缺失值/毛刺點過多的指標也可以實現智慧檢測
在智慧檢測運算元功能中, 如果歷史資料出現了缺失,演算法可以線性插值,多項式插值等多種方式,自動填補缺失值。
對於不平滑的指標曲線檢測,智慧檢測運算元也自適應的選擇針對該場景的最優模型進行檢測,保證整體的檢測效果。
如何應用在具體業務場景裡
水位突增/突降型指標:某業務的 qps 指標
在業務開始設定閾值時, 通過觀察很有可能設定閾值不超過 150。但隨著業務迭代,qps 指標也會發生各種各樣的變化。從指標上則表現為:出現階段性的突增至某個值,然後平穩的狀態。這種情況下,設定的靜態閾值很難持續滿足檢測需求。另外一方面, 穩定情況也會出現突發的下跌, 只設定上限的靜態閾值是檢測出這種下跌情況的。這種情形下, 智慧檢測運算元則可以自適應的跟蹤業務水平的變化,智慧識別業務的突增或突降。
週期性的指標:
在指標畫像模組,如果識別出當前的指標具有一定的週期,則會從中提取出對應的週期值、週期偏移值, 以及整體趨勢曲線。在原始的時間序列去除週期性、趨勢性後,利用殘差進行異常檢測。以上圖的週期指標為例, 11.30 分左右的週期與其他週期出現明顯差別。傳統靜態閾值很難去解這類場景下的檢測問題, 而利用智慧檢測運算元,則可以識別出該種異常。
趨勢破壞型的指標:
此外,還有一種常見型別的指標異常是,在某一階段內, 指標一直呈現上升(或者下降)趨勢。在某一個節點出現突發性的趨勢破壞,區域性呈現了和整體趨勢不一樣。這種異常型別也是很常見的,但是靜態閾值很難設定來解決這種情形。而智慧檢測運算元則針對這種型別可以進行準確了的識別異常。
最佳實踐
阿里雲Prometheus監控內使用流程
目前阿里雲 Prometheus 監控已經支援智慧檢測運算元功能,只需登陸 ARMS-Prometheus/grafana,輸入對應的 PromQL 即可。
運算元定義
"anomaly_detect": {
Name: anomaly_detect",
ArgTypes: []ValueType{ValueTypeMatrix, ValueTypeScalar},
ReturnType: ValueTypeVector,
},
輸入:指標的時間序列,型別為range vector;檢測引數,使用預設的3即可
輸出:異常返回1, 正常返回0
使用 case:
anomaly_detect(node_memory_free_bytes[20m],3)
- 輸入的必須是 range vector,因此需要在指標名稱後增加[180m], 時間範圍預設選擇 180m,引數預設選擇 3
- 如果先進行了其他聚合函式操作,則需要[180m:],使之變為 range vector,如下:anomaly_detect(sum(node_memory_free_bytes)[180m:],3)
使用示例:
step 1: 登陸到 ARMS-Prometheus 或 Grafana 中選擇對應的 Prometheus 資料來源
選擇對應的資料來源:
step 2: 選擇指標, 並檢視
step 3: 輸入異常檢測運算元
關於 Prometheus- 智慧檢測運算元
阿里雲 Prometheus 監控智慧檢測運算元,總結業界數十款領先的演算法方案實踐設計而成。針對常見的指標型別建立了指標畫像,並自適應的選擇最佳模型去進行檢測計算。每一條指標資料輸入模型後, 模型首先會對當前的指標建立指標畫像,包括平穩性,抖動性,趨勢性,週期性,是否為特殊節假日/活動等。根據這些畫像特徵構建之後, 模型自適應選擇最優一種或者多種演算法組合來解當前的指標檢測問題,保證了整體效果最優。目前已經支援的功能包括:突增檢測、毛刺檢測、週期識別(識別週期性、週期的偏移)。
通過阿里雲 Prometheus 監控中整合智慧檢測運算元, 我們希望給使用者可以提供開箱即用、持續迭代更新的智慧檢測服務。目前使用者可以在阿里雲 Prometheus 監控中檢視並使用智慧檢測運算元,而基於 ARMS 的原生配置智慧檢測告警功能和 Grafana 動態展示將在近期推出。
?點選這裡,立即接入 Prometheus 監控!