只需半分鐘,ARMS 幫你配置出“高質量”告警
背景
某位資深運維工程師A:“一天不收個幾十條告警,我都覺得心里不踏實” 。運維工程師B:“我那幾個告警天天告,我的應用一點問題都沒有,但是我又不敢關”。運維工程師C:“我每天都要花大量的時間,整理已經發生的告警:查它們是什么原因導致的,是故障還是誤報,要不要解決,要不要屏蔽。”運維工程師D:“要不我們給告警數配置一個告警吧,一天收100條告警是正常的,哪天告出來200條估計就是有問題了”。會出現這樣的對話不是因為這幾位運維工程師不專業,實際上,誤告警泛濫,真告警被淹沒,就是大多數團隊,甚至頂尖的互聯網企業的運維團隊的現狀。想要配置出“系統無異常時不誤告,有異常時及時告”的“高質量”的告警規則是非常具有挑戰性的。
所以這些告警都是些什么?為了保證系統和應用的穩定性,工程師們會搭建監控系統以實時地采集比如RT(響應時間)、QPS(調用次數)、Error Rate(錯誤率)、HTTP狀態碼、Full GC次數等關鍵指標,并對核心應用的關鍵指標進行實時地巡檢,當檢測到指標當前值超出“正常水位”時,相關的工程師就會收到對應的告警。
那這些誤告警又是怎么產生的呢?傳統的告警規則主要是靜態閾值告警,當某指標的實際值超出用戶設定的閾值,就認為是系統出現了異常。但是,想要快速選定合適的閾值,配出“高質量”告警,是很難的。阿里云應用實時監控服務ARMS通過對近百位用戶的訪談與調研,發現平均每個用戶每天收到1275條告警。而且,我們對 6 萬條關于響應時間和錯誤率突增的告警進行了分析,發現其中只有 3.05%的告警是“真”告警,剩下的96.95%都是由于閾值設置不當引發的誤告警。
為什么配出”高質量“告警很難?
傳統的告警規則是靜態閾值告警,工程師們會對每個指標設定一個固定的閾值來定義指標的“正常水位”,當指標的實際值超出閾值時,對應的工程師就會收到告警。比如當應用的RT超出1s,就算是異常。但是合適的靜態閾值,是很難定義的。因為:
1. 同一指標,不同應用,不同接口的“正常水位”不同。
現實生活中,SRE(運維工程師)需要對很多應用、很多接口配置告警。即使是同一個指標,不同應用,不同接口的“正常水位”都是是不一樣的。下圖是同一家公司,不同應用的錯誤率指標。
下圖是同一應用,不同接口的平均響應時間指標:
SRE需要為每一個應用、每一個接口的每一個指標來設定“正常水位”。 這對于有幾百個應用、幾十條關鍵指標的公司來說,僅靠人力來不斷地設定和維護指標的“正常水位”需要花費大量的時間。
更可怕的是,隨著業務的發展,代碼不斷變更,各項指標的“正常水位”會不斷地變化。這意味著SRE要不斷地調整告警閾值。
2. 有的指標,不同時段的“正常水位”不一樣
比如某工作網站的訪問量,在10:00-18:00時段內,訪問量低于1000是異常的;但是在夜間,比如22:00-6:00,訪問量超過1000可能是收到了攻擊。在這種場景下,指標的“正常水位”會隨著時間變化而不斷變化。如果我們硬配置一個閾值,比如低于1000就告警,那整個晚上都會受到告警的打擾。
有的SRE可能會表示,那我晚上自動吧告警關掉就好了,但是現實生活中,這種起伏不定的指標,很難有像“1000”這么規整的閾值,現實生活中的調用量指標是下面的樣子,就是會有一些令人意想不到的“大毛刺”。
3. 告警閾值的合理性難以及時驗證
SRE們配好一個告警閾值之后,也很難驗證這個閾值是不是合理的。運維工程師們往往會不斷地被打擾,他們要不斷地調整閾值,才能得到一個較高質量的告警。當指標的正常水位隨著業務變化而變化之后,周而復始,重新調整閾值。
業界是怎么協助用戶配置出”高質量“告警的?
如何有效地幫助客戶配制出“高質量”的告警規則,是每一個APM(應用性能監控)廠商關注的問題。為了解決這個問題,主流的APM廠商都提供了智能告警服務。主要思路就是用統計學算法或者機器學習算法,提取指標的特征,下面介紹業界如何解決上面提到的問題:
問題 1:同一指標,不同應用,不同接口的“正常水位”不同
為了解決閾值難配的問題,一些APM廠商給出了靜態閾值推薦的功能。一般地,他們用算法為各個接口、各個應用,根據對于指標的歷史數據學習指標特征,結合指標歷史平均水位以及波動情況給出一個建議閾值。
但是,廠商給的是通用算法,SRE很難評估算法推薦的閾值是不是符合他的業務,是不是真的“高質量”的閾值。
問題 2:有的指標,不同時段的“正常水位”不一樣
對于波動型指標,一些廠商推出了動態閾值(也稱區間檢測)功能。在這個場景下,指標的實際值不再和單一的靜態閾值比較,而是和一個時間序列做對比。具體地,算法會根據指標歷史數據學習其波動特征,并對未來一段時間指標正常變化范圍進行預測。比如每天00:00對未來一天的指標“正常水位”的上下邊界進行預測,等采集到實際值時,比如10:00時,將實際值與之前的預測值進行比較,實際值超過了邊界就被判定為異常。下面是一個動態閾值功能的示意圖,綠線是指標的實際值,藍色陰影是算法計算出來的,指標在正常情況下的上下邊界。
這里的缺點在于:算法對用戶來說是黑盒,SRE們不敢把關鍵的業務指標放心地交給算法。另外,這些算法是通用的,不一定符合SRE的實際業務需求。而且,很多APM廠商沒有關注到這一點,沒有給用戶調節動態閾值的功能。
問題 3:告警閾值的合理性難以及時驗證
一些APM廠商給出了閾值和指標過去一段時間實際值的對比圖。但是,SRE們往往沒有時間對每個應用、每條指標、每個接口都瀏覽一遍來設置合理的閾值。
另外,對于動態閾值的功能,很少有廠商給出對比圖。SRE沒有足夠的信息來對告警閾值進行調整,只能不斷地受到告警打擾再調節閾值。這樣,有了幾次誤告警之后,SRE們就會把這些“華而不實”的AI功能關掉。
ARMS 是怎么幫用戶實現半分鐘配出”高質量“告警的?
為了解決這些問題,為了給用戶提供“透明的”、“易用的”、“所見即所得”的智能化告警體驗,ARMS對應用性能監控告警功能進行了全面升級。 下面我們介紹ARMS如何解決“高質量”告警難配的問題。
問題 1:同一指標,不同應用,不同接口的“正常水位”不同
實際上,對每一條指標配置一個合適的閾值其實都不算難,難的地方在于每個應用、每個接口、每種指標類型適合的閾值都不一樣。SRE要遍歷所有的指標,為他們設置合適的閾值,這是需要耗費大量時間的地方。
對于配靜態閾值這種重復的工作,ARMS決定交給代碼來做。用戶只需要選擇要配告警的應用、接口和指標類型。
圖片
然后點擊“填入P4建議閾值”,ARMS就會自動拉取每個應用、每個接口對應指標的歷史3天數據,然后用N-sigma算法,計算每個指標歷史3天的均值和方差。當業務沒有發生變化,我們默認指標服從一個正態分布,它偏離它的期望N倍標準差的概率很小。根據這個原理,我們給出一個推薦閾值。這里的"P4"是表示的是最不嚴重的告警,這個建議閾值僅僅表示指標有些許異常。
圖片
當用戶的業務發生了變化,應用正常水位也發生了變化,那么用戶也只需要編輯一下告警規則,再點一次“填入P4建議閾值”即可。真正做到了一次配置,隨處生效。
問題 2:有的指標,不同時段的“正常水位”不一樣
由于靜態閾值告警難以滿足如RT、QPS等波動型指標的監控功能,我們推薦動態閾值,也叫區間檢測功能。這里我們會自動根據指標7天歷史數據,預測指標未來上下邊界。用戶可以根據上下邊界配置告警,當指標實際值超出上邊界或下邊界,觸發告警。
ARMS主要使用了Meta(Facebook)公司2018年公布的Prophet算法[1]。算法會先根據指標歷史7天數據,用時間序列分解算法,將指標分解成季節項、趨勢項和殘差項。舉個例子[2],對于下面圖 1 中的時間序列,Prophet算法會將它分解成有規律的趨勢項(圖2)季節項(圖3)和沒有規律的殘差項。
圖 1
圖 2
圖 3
既然趨勢項和季節項是有規律的,我們就可以對未來一段時間指標的值進行預測。但是還有殘差項的存在,所以如果我們對指標的變化趨勢預測得到的是一個區間,可以看圖 1 中藍色陰影部分。Prophet是一個無領域的,時序預測通用算法。我們對該算法做了一些實驗之后,發現把它應用到APM領域,還需要大量的改造。
當用戶配置區間檢測任務之后,ARMS會在后臺以每24h一次的頻率,學習指標歷史7天數據的特征,提取指標趨勢性、季節性等特征,得到指標未來24h的預測曲線。再根據指標自身的波動情況,也就是誤差方差的大小,為未來一天指標的數據做出一個估計區間。用戶在配置區間檢測告警中,可以對算法計算出來的上下邊界進行預覽。下圖中,藍線是指標的實際值,綠色的陰影是上下邊界。
圖片
與靜態閾值推薦功能不同的地方在于,當用戶業務變化導致指標正常水位發生變化,用戶不需要通過手動編輯告警規則的方式來更新閾值。這是因為ARMS持續地在以每天一次的頻率學習指標的特征,并只預測未來一天的上下邊界。SRE們不需要再一遍一遍來回地調整閾值。ARMS區間檢測告警,一次配置,自適應學習指標特征,持久有效。
問題 3:告警閾值的合理性難以及時驗證
為了幫助用戶及時地驗證告警的合理性,使得用戶能夠根據自身業務調整算法推薦的閾值,ARMS推出了如下的功能:
1. 為了方便用戶根據自己的實際數據對閾值進行調整,我們給出了指標實際值和閾值的對比圖
這里的P1、P2、P3、P4的閾值代表著不同的嚴重程度,當用戶配置好各個閾值之后,ARMS會用不同的顏色標識出4個不同等級的閾值。
2.提供了告警數預測功能
我們會根據指標歷史24h數據,計算指標會超出每個閾值的次數來預測在該設定下告警的數量。并且,ARMS提供了指標詳情信息,用戶可以看到具體是哪些時刻,指標的實際值超出了當前的閾值。用戶可以根據這些信息調整閾值,以適配實際業務需求。
3. 無論是靜態閾值還是推薦閾值,ARMS都支持用戶手動調節推薦閾值
在靜態閾值配置的界面下, 用戶可以按需地修改閾值;在區間檢測功能中,用戶可以滑動靈敏度按鈕,從0到200挑選任意整數作為靈敏度。并且,圖中標識著指標上下邊界的綠色區間也會隨著靈敏度的變化而變化。
總結
為了幫助用戶快速配出“高質量“告警,ARMS提供了“靜態推薦閾值”來幫助用戶快速地計算指標的“正常水位”;并且,針對不同時間段“正常水位”不一樣的指標,ARMS提供了“區間檢測”功能。另外,ARMS提供了告警數預測功能,使得運維工程師們可以及時地評估告警規則的合理性。也讓他們有足夠的信息,根據自身業務來調節告警閾值以及區間檢測中的靈敏度,一次性配出“高質量”告警。
運維工程師D表示:"用ARMS確實比給告警數配告警靠譜哈",運維工程師A、B、C:“趕緊上阿里云開通ARMS吧,我再也不想半夜被告警電話吵醒了”。
參考文獻:
[1] Prophet算法
Taylor S J, Letham B. Forecasting at scale[J]. The American Statistician, 2018, 72(1): 37-45.
[2] 舉個例子