跟誤告警說再見,Smart Metrics 幫你用演算法配告警
作者:董善東、陳昆儀
引言
某位資深 SRE 同學表示“一天不收個幾十條告警,我都覺得不安心”,“告警天天告,我們的應用一點事情都沒有”。這都反映了一個非常普遍的現象 -- "誤告警氾濫",而“真”告警容易被淹沒。ARMS AIOps 團隊對超過 6 萬條關於響應時間和錯誤率突增的告警進行了分析,發現其中只有 3.05%的告警是“真”告警。同時發現誤告警氾濫根源在於單靠現有告警產品的能力很難配置出行之有效的告警規則。因此,ARMS 基於託管版 Grafana 推出智慧告警外掛——Smart Metrics,用演算法幫助使用者解決"告警配置難、維護難"的問題。
本文從兩類常見的無效告警規則入手,分析有效告警配置難,誤告警氾濫的原因,介紹 Smart Metrics 是如何幫助使用者解決告警難配的問題的,並介紹一些最佳實踐。最後,歡迎加入 SmartMetrics 交流群,釘釘群號 25125004458。
告警現狀分析
誤告警氾濫
我們通過對 ARMS 告警資料及使用者訪談進行分析,發現許多使用者一天收幾百條告警,但其中真正有用的只有幾條。更可怕的是,那幾條“真”告警往往被淹沒在大量誤告警中,導致使用者沒能在第一時間對真實故障做出處理。這些誤告警往往是由一些不良的告警配置習慣造成的,比較典型的有下面兩種:
“一刀切”式配告警方式:
比如一位 SRE 同學要管理很多介面,但為了節省告警配置時間,所以選擇對所有應用/介面的響應時間、錯誤率和呼叫量配置統一且固定閾值。然而,不同應用/介面正常狀態下的響應時間、呼叫量和錯誤率指標的正常水位本身就不相同,成百上千的應用/介面使用同一閾值自然會產生大量誤告警。
“疏於打理”的告警閾值:
有的告警規則在應用起初是沒有問題的,但隨著業務增長,響應時間、呼叫量等業務指標,以及 CPU 使用率等機器指標的平均水位線已發生變化。但 SRE 沒有及時更新閾值,導致系統正常時也會不斷產生告警。
一般而言,只要針對上述兩種告警策略進行優化,就可以有效避免大量誤告警。但實際上,它們的優化並不簡單。原因在於現有告警產品往往只支援使用者使用靜態閾值配置告警。
我們先來看一下典型告警配置頁面:它提供了很多常用聚合運算元:均值、最大值、最小值、差分等,使用者可以用這些運算元自定義告警規則。
我們再來看看真實的運維指標,比如 qps(每分鐘呼叫量),發現它長這個樣子:
那麼,現在應該 min\max\avg 什麼?閾值該設定成多少?
有效告警配置難、維護難的原因
面對真實多變的運維指標,即使是經驗豐富的運維專家也很難配出有效告警。我們總結有效告警配置難、維護難的主要原因:
1. 許多運維指標起伏不定,很難設定合適的靜態閾值。
它們往往呈現出以小時、天、周為週期的季節性特徵。這些指標本身就起伏不定,導致靜態閾值、同比閾值都不好配。
2. 同一指標,不同應用\介面\主機閾值不同。
以 RT 指標(響應時間)舉例, 有的介面正常時 RT 在 200ms 左右,那麼當 RT 大於 300ms 時,可以判定為異常。然而,有些介面長期訪問量大, 整體指標在 500ms 左右正常波動,合適的告警閾值可能是 600ms 左右。而一個應用可能有幾百個介面,運維同學要對所有介面配置合適的閾值,時間成本非常高。
3. 指標的正常水位會隨著業務的增長變化。
隨著公司業務發展、新應用上線,一些指標正常狀態水位會不斷變化。如果沒有及時更新閾值,就很容易產生大量誤告警。
綜上,靠現有告警產品中依賴靜態閾值方式,需要 SRE 同學投入大量時間成本且難以取得較好效果。 為解決這個問題,ARMS推出基於 Grafana 的智慧告警外掛——SmartMetrics,用演算法來幫助使用者配置有效告警。
更簡單的告警配置方式-SmartMetrics
SmartMetrics 是一款“智慧、易用、效果可見”的告警外掛,能夠從歷史指標資料學習指標的特徵,並對未來一段時間內指標正常變化範圍做出預測,生成上下邊界。這裡的上下邊界圍成的區間預設就是 90 置信區間。也就是按照前面幾天的趨勢,指標沒有發生異常的話,有 90 的概率,它未來的值會落到我們預測得到的上下邊界中。
SmartMetrics 支援 Grafana 原生告警功能,可利用 SmartMetrics 生成的上下邊界作為配置告警的閾值。簡單的配告警策略可以是當指標超過上界或低於下界時發出告警。也可以配置更多複雜策略,如原始曲線高於上邊界 1.5 倍且過去一小時內沒有出現過高於上邊界的情況下才發出告警等。
目前,SmartMetrics 已在託管版 Grafana 上線,未來還將作為附加功能嵌入到 ARMS 的告警能力中。
SmartMetrics 如何生成上下邊界
SmartMetrics 通過多模型融合方式為不同型別指標計算上下邊界。SmartMetrics 先通過 Smart-PLR 演算法捕捉指標關鍵特徵,並利用分類演算法確定該指標曲線型別;根據其型別來選擇最適合時序預測模型與最佳引數;最後生成上下邊界。
SmartMetrics 在採取業界熱門開源演算法 Prophet、STL、ARIMA, BiLSTM 基礎上,基於阿里雲內部大資料實踐進行單週期/多週期識別、趨勢識別、異常點識別、毛刺識別、變點識別等優化, 最終融合成一套多模型 Smart-Prophet 演算法方案。SmartMetrics 具有以下幾個特點:
a. 準確性:演算法在阿里雲內部進行多場景經歷過驗證, 擁有精準、全面的異常點發現能力。配合告警持續時間,起到精準告警效果。
b. 通用性:演算法對於業務指標和基礎指標有比較好支援, 對於週期性、趨勢性、波動性指標進行比較好的曲線分類和模型引數配置。
c. 免維護:使用SmartMetrics的使用者無需隨業務變化對演算法進行動態化調參,演算法可自適應通過對指標變化的規律學習,從而適應業務變化。
SmartMetrics 如何解決有效告警配置難、維護難的問題
1. SmartMetrics 如何應對起伏不定的運維指標配置有效告警的需求
SmartMetrics 會自動根據 7 天曆史資料預測曲線在未來 1 天內曲線在正常狀態下的上下邊界,並實時地寫入指標實際值。使用者可以利用 Grafana 自帶的告警能力配置告警:當指標實際值超出上下邊界時,或是實際值超出上邊界值 1.5 倍時,發出告警。使用者可自定義多種告警規則,更多最佳實踐可以參考 SmartMetrics 的官方文件。
2. SmartMetrics如何應對同一指標,不同應用\介面\主機告警閾值不同的場景
對不同應用\介面\主機的指標分配用 SmartMetrics 生成上下邊界,SmartMetrics 會自動學習各自特徵,生成適合的動態基線,使用者不需要再手工輸入靜態閾值。
3. SmartMetrics如何應對由於業務發展帶來的靜態閾值維護難的問題
SmartMetrics預設每天更新模型,自動學習由於業務變化帶來的指標正常水位線變化,免人工維護。
SmartMetrics 最佳實踐
步驟 1. 建立動態閾值任務
- 選擇合適的資料來源
- 選擇所需要動態監控的指標
注意:目前只支援1條指標的任務, 因此需要明確指標中的 label value, 或者通過運算元如 sum, count,實現單個指標查詢。多指標配置目前規劃中,依據使用者反饋決定是否上線。
- 選擇完成後, 執行 Run Query, 可以查詢到對應的指標曲線。
- 設定合適的模型引數, 選則靈敏度等,建議使用預設配置。
- 填寫正確的名稱及描述。
- 點選建立預測,完成建立。
步驟 2. 檢視指標
- 建立成功任務之後, 可以點選返回任務列表。
注意:建立任務後,任務立即啟動, 完成資料拉取, 計算, 儲存等任務, 該過程需要等待 1-2 分鐘左右。
- 點選檢視大盤, 檢視具體的指標和對應上下邊界情況。
- 大盤提供了原始指標時間序列資料和對應的上下邊界組合成的正常區域。指標值在邊界之內則可以理解為演算法判定正常, 超出上下邊界則可以理解為演算法判定異常。
-
點選 Edit, 進入編輯頁面。
-
當前指標和上下邊界統一儲存在promenthus資料來源cloud_product_prometheus_cn-hangzhou_aiops_userId中。指標名稱即為建立任務時的名稱, 對應的label:smart_metric取不同的值(actual,upper, lower), 則對應著(原始指標, 上邊界指標, 下邊界指標)。例如:如果使用者想單獨檢視上邊界, 則只需要在對應的資料來源cloud_product_prometheus_cn-hangzhou_aiops_userId 中查詢對應的指標。
步驟 3. 異常檢測&配置告警
- 在檢視指標大盤頁面中, 點選 Edit,進入編輯頁面
- 在 Query 頁面, 可以檢視 D 查詢指標中, 預設預置了超過上邊界的指標查詢:
tuyang_test{smart_metric="actual"} > ignoring (smart_metric) tuyang_test{smart_metric="upper"}
-
在 grafana 下方 tab 頁面, 進入到 Alert 頁面,並 Create Alert
-
配置 NULL 的情況下, 為 OK, 同時配置通知人和通知資訊
其他查詢玩法請參考:超出上邊界:
test{smart_metric="actual"} > ignoring (smart_metric) test{smart_metric="upper"}
超出下邊界:
test{smart_metric="actual"} < ignoring (smart_metric) test{smart_metric="lower"}
超出上/下邊界:
test{smart_metric="actual"} > ignoring (smart_metric) test{smart_metric="upper"} or test{smart_metric="actual"} < ignoring (smart_metric) test{smart_metric="lower"}
超出上邊界閾值比例 20%:
test{smart_metric="actual"} > ignoring (smart_metric) test{smart_metric="upper"} *1.2
步驟 4. 告警通知
- 對於發生的告警, 可以在配置的通知方式獲取到告警, 點選連結並跳轉到 grafana 中進行檢視。
步驟 5. 任務管理
- 對於不需要的動態閾值檢測任務, 可以在任務列表中進行刪除。
歡迎加入 SmartMetrics 交流群
Last but not least,歡迎加入 SmartMetrics 交流群並提出更多的需求與指導意見!!
釘釘搜尋群號:25125004458
首月免費,點選此處立即體驗!