只需半分鐘,ARMS 幫你配置出“高質(zhì)量”告警

背景
某位資深運維工程師A:“一天不收個幾十條告警,我都覺得心里不踏實” 。運維工程師B:“我那幾個告警天天告,我的應(yīng)用一點問題都沒有,但是我又不敢關(guān)”。運維工程師C:“我每天都要花大量的時間,整理已經(jīng)發(fā)生的告警:查它們是什么原因?qū)е碌模枪收线€是誤報,要不要解決,要不要屏蔽。”運維工程師D:“要不我們給告警數(shù)配置一個告警吧,一天收100條告警是正常的,哪天告出來200條估計就是有問題了”。會出現(xiàn)這樣的對話不是因為這幾位運維工程師不專業(yè),實際上,誤告警泛濫,真告警被淹沒,就是大多數(shù)團隊,甚至頂尖的互聯(lián)網(wǎng)企業(yè)的運維團隊的現(xiàn)狀。想要配置出“系統(tǒng)無異常時不誤告,有異常時及時告”的“高質(zhì)量”的告警規(guī)則是非常具有挑戰(zhàn)性的。
所以這些告警都是些什么?為了保證系統(tǒng)和應(yīng)用的穩(wěn)定性,工程師們會搭建監(jiān)控系統(tǒng)以實時地采集比如RT(響應(yīng)時間)、QPS(調(diào)用次數(shù))、Error Rate(錯誤率)、HTTP狀態(tài)碼、Full GC次數(shù)等關(guān)鍵指標(biāo),并對核心應(yīng)用的關(guān)鍵指標(biāo)進行實時地巡檢,當(dāng)檢測到指標(biāo)當(dāng)前值超出“正常水位”時,相關(guān)的工程師就會收到對應(yīng)的告警。
那這些誤告警又是怎么產(chǎn)生的呢?傳統(tǒng)的告警規(guī)則主要是靜態(tài)閾值告警,當(dāng)某指標(biāo)的實際值超出用戶設(shè)定的閾值,就認為是系統(tǒng)出現(xiàn)了異常。但是,想要快速選定合適的閾值,配出“高質(zhì)量”告警,是很難的。阿里云應(yīng)用實時監(jiān)控服務(wù)ARMS通過對近百位用戶的訪談與調(diào)研,發(fā)現(xiàn)平均每個用戶每天收到1275條告警。而且,我們對 6 萬條關(guān)于響應(yīng)時間和錯誤率突增的告警進行了分析,發(fā)現(xiàn)其中只有 3.05%的告警是“真”告警,剩下的96.95%都是由于閾值設(shè)置不當(dāng)引發(fā)的誤告警。
為什么配出”高質(zhì)量“告警很難?
傳統(tǒng)的告警規(guī)則是靜態(tài)閾值告警,工程師們會對每個指標(biāo)設(shè)定一個固定的閾值來定義指標(biāo)的“正常水位”,當(dāng)指標(biāo)的實際值超出閾值時,對應(yīng)的工程師就會收到告警。比如當(dāng)應(yīng)用的RT超出1s,就算是異常。但是合適的靜態(tài)閾值,是很難定義的。因為:
1. 同一指標(biāo),不同應(yīng)用,不同接口的“正常水位”不同。
現(xiàn)實生活中,SRE(運維工程師)需要對很多應(yīng)用、很多接口配置告警。即使是同一個指標(biāo),不同應(yīng)用,不同接口的“正常水位”都是是不一樣的。下圖是同一家公司,不同應(yīng)用的錯誤率指標(biāo)。

下圖是同一應(yīng)用,不同接口的平均響應(yīng)時間指標(biāo):

SRE需要為每一個應(yīng)用、每一個接口的每一個指標(biāo)來設(shè)定“正常水位”。 這對于有幾百個應(yīng)用、幾十條關(guān)鍵指標(biāo)的公司來說,僅靠人力來不斷地設(shè)定和維護指標(biāo)的“正常水位”需要花費大量的時間。
更可怕的是,隨著業(yè)務(wù)的發(fā)展,代碼不斷變更,各項指標(biāo)的“正常水位”會不斷地變化。這意味著SRE要不斷地調(diào)整告警閾值。
2. 有的指標(biāo),不同時段的“正常水位”不一樣
比如某工作網(wǎng)站的訪問量,在10:00-18:00時段內(nèi),訪問量低于1000是異常的;但是在夜間,比如22:00-6:00,訪問量超過1000可能是收到了攻擊。在這種場景下,指標(biāo)的“正常水位”會隨著時間變化而不斷變化。如果我們硬配置一個閾值,比如低于1000就告警,那整個晚上都會受到告警的打擾。
有的SRE可能會表示,那我晚上自動吧告警關(guān)掉就好了,但是現(xiàn)實生活中,這種起伏不定的指標(biāo),很難有像“1000”這么規(guī)整的閾值,現(xiàn)實生活中的調(diào)用量指標(biāo)是下面的樣子,就是會有一些令人意想不到的“大毛刺”。

3. 告警閾值的合理性難以及時驗證
SRE們配好一個告警閾值之后,也很難驗證這個閾值是不是合理的。運維工程師們往往會不斷地被打擾,他們要不斷地調(diào)整閾值,才能得到一個較高質(zhì)量的告警。當(dāng)指標(biāo)的正常水位隨著業(yè)務(wù)變化而變化之后,周而復(fù)始,重新調(diào)整閾值。
業(yè)界是怎么協(xié)助用戶配置出”高質(zhì)量“告警的?
如何有效地幫助客戶配制出“高質(zhì)量”的告警規(guī)則,是每一個APM(應(yīng)用性能監(jiān)控)廠商關(guān)注的問題。為了解決這個問題,主流的APM廠商都提供了智能告警服務(wù)。主要思路就是用統(tǒng)計學(xué)算法或者機器學(xué)習(xí)算法,提取指標(biāo)的特征,下面介紹業(yè)界如何解決上面提到的問題:
問題 1:同一指標(biāo),不同應(yīng)用,不同接口的“正常水位”不同
為了解決閾值難配的問題,一些APM廠商給出了靜態(tài)閾值推薦的功能。一般地,他們用算法為各個接口、各個應(yīng)用,根據(jù)對于指標(biāo)的歷史數(shù)據(jù)學(xué)習(xí)指標(biāo)特征,結(jié)合指標(biāo)歷史平均水位以及波動情況給出一個建議閾值。
但是,廠商給的是通用算法,SRE很難評估算法推薦的閾值是不是符合他的業(yè)務(wù),是不是真的“高質(zhì)量”的閾值。
問題 2:有的指標(biāo),不同時段的“正常水位”不一樣
對于波動型指標(biāo),一些廠商推出了動態(tài)閾值(也稱區(qū)間檢測)功能。在這個場景下,指標(biāo)的實際值不再和單一的靜態(tài)閾值比較,而是和一個時間序列做對比。具體地,算法會根據(jù)指標(biāo)歷史數(shù)據(jù)學(xué)習(xí)其波動特征,并對未來一段時間指標(biāo)正常變化范圍進行預(yù)測。比如每天00:00對未來一天的指標(biāo)“正常水位”的上下邊界進行預(yù)測,等采集到實際值時,比如10:00時,將實際值與之前的預(yù)測值進行比較,實際值超過了邊界就被判定為異常。下面是一個動態(tài)閾值功能的示意圖,綠線是指標(biāo)的實際值,藍色陰影是算法計算出來的,指標(biāo)在正常情況下的上下邊界。

這里的缺點在于:算法對用戶來說是黑盒,SRE們不敢把關(guān)鍵的業(yè)務(wù)指標(biāo)放心地交給算法。另外,這些算法是通用的,不一定符合SRE的實際業(yè)務(wù)需求。而且,很多APM廠商沒有關(guān)注到這一點,沒有給用戶調(diào)節(jié)動態(tài)閾值的功能。
問題 3:告警閾值的合理性難以及時驗證
一些APM廠商給出了閾值和指標(biāo)過去一段時間實際值的對比圖。但是,SRE們往往沒有時間對每個應(yīng)用、每條指標(biāo)、每個接口都瀏覽一遍來設(shè)置合理的閾值。
另外,對于動態(tài)閾值的功能,很少有廠商給出對比圖。SRE沒有足夠的信息來對告警閾值進行調(diào)整,只能不斷地受到告警打擾再調(diào)節(jié)閾值。這樣,有了幾次誤告警之后,SRE們就會把這些“華而不實”的AI功能關(guān)掉。
ARMS 是怎么幫用戶實現(xiàn)半分鐘配出”高質(zhì)量“告警的?
為了解決這些問題,為了給用戶提供“透明的”、“易用的”、“所見即所得”的智能化告警體驗,ARMS對應(yīng)用性能監(jiān)控告警功能進行了全面升級。 下面我們介紹ARMS如何解決“高質(zhì)量”告警難配的問題。
問題 1:同一指標(biāo),不同應(yīng)用,不同接口的“正常水位”不同
實際上,對每一條指標(biāo)配置一個合適的閾值其實都不算難,難的地方在于每個應(yīng)用、每個接口、每種指標(biāo)類型適合的閾值都不一樣。SRE要遍歷所有的指標(biāo),為他們設(shè)置合適的閾值,這是需要耗費大量時間的地方。
對于配靜態(tài)閾值這種重復(fù)的工作,ARMS決定交給代碼來做。用戶只需要選擇要配告警的應(yīng)用、接口和指標(biāo)類型。
圖片
然后點擊“填入P4建議閾值”,ARMS就會自動拉取每個應(yīng)用、每個接口對應(yīng)指標(biāo)的歷史3天數(shù)據(jù),然后用N-sigma算法,計算每個指標(biāo)歷史3天的均值和方差。當(dāng)業(yè)務(wù)沒有發(fā)生變化,我們默認指標(biāo)服從一個正態(tài)分布,它偏離它的期望N倍標(biāo)準(zhǔn)差的概率很小。根據(jù)這個原理,我們給出一個推薦閾值。這里的"P4"是表示的是最不嚴重的告警,這個建議閾值僅僅表示指標(biāo)有些許異常。
圖片
當(dāng)用戶的業(yè)務(wù)發(fā)生了變化,應(yīng)用正常水位也發(fā)生了變化,那么用戶也只需要編輯一下告警規(guī)則,再點一次“填入P4建議閾值”即可。真正做到了一次配置,隨處生效。
問題 2:有的指標(biāo),不同時段的“正常水位”不一樣
由于靜態(tài)閾值告警難以滿足如RT、QPS等波動型指標(biāo)的監(jiān)控功能,我們推薦動態(tài)閾值,也叫區(qū)間檢測功能。這里我們會自動根據(jù)指標(biāo)7天歷史數(shù)據(jù),預(yù)測指標(biāo)未來上下邊界。用戶可以根據(jù)上下邊界配置告警,當(dāng)指標(biāo)實際值超出上邊界或下邊界,觸發(fā)告警。
ARMS主要使用了Meta(Facebook)公司2018年公布的Prophet算法[1]。算法會先根據(jù)指標(biāo)歷史7天數(shù)據(jù),用時間序列分解算法,將指標(biāo)分解成季節(jié)項、趨勢項和殘差項。舉個例子[2],對于下面圖 1 中的時間序列,Prophet算法會將它分解成有規(guī)律的趨勢項(圖2)季節(jié)項(圖3)和沒有規(guī)律的殘差項。

圖 1

圖 2

圖 3
既然趨勢項和季節(jié)項是有規(guī)律的,我們就可以對未來一段時間指標(biāo)的值進行預(yù)測。但是還有殘差項的存在,所以如果我們對指標(biāo)的變化趨勢預(yù)測得到的是一個區(qū)間,可以看圖 1 中藍色陰影部分。Prophet是一個無領(lǐng)域的,時序預(yù)測通用算法。我們對該算法做了一些實驗之后,發(fā)現(xiàn)把它應(yīng)用到APM領(lǐng)域,還需要大量的改造。
當(dāng)用戶配置區(qū)間檢測任務(wù)之后,ARMS會在后臺以每24h一次的頻率,學(xué)習(xí)指標(biāo)歷史7天數(shù)據(jù)的特征,提取指標(biāo)趨勢性、季節(jié)性等特征,得到指標(biāo)未來24h的預(yù)測曲線。再根據(jù)指標(biāo)自身的波動情況,也就是誤差方差的大小,為未來一天指標(biāo)的數(shù)據(jù)做出一個估計區(qū)間。用戶在配置區(qū)間檢測告警中,可以對算法計算出來的上下邊界進行預(yù)覽。下圖中,藍線是指標(biāo)的實際值,綠色的陰影是上下邊界。
圖片
與靜態(tài)閾值推薦功能不同的地方在于,當(dāng)用戶業(yè)務(wù)變化導(dǎo)致指標(biāo)正常水位發(fā)生變化,用戶不需要通過手動編輯告警規(guī)則的方式來更新閾值。這是因為ARMS持續(xù)地在以每天一次的頻率學(xué)習(xí)指標(biāo)的特征,并只預(yù)測未來一天的上下邊界。SRE們不需要再一遍一遍來回地調(diào)整閾值。ARMS區(qū)間檢測告警,一次配置,自適應(yīng)學(xué)習(xí)指標(biāo)特征,持久有效。
問題 3:告警閾值的合理性難以及時驗證
為了幫助用戶及時地驗證告警的合理性,使得用戶能夠根據(jù)自身業(yè)務(wù)調(diào)整算法推薦的閾值,ARMS推出了如下的功能:
1. 為了方便用戶根據(jù)自己的實際數(shù)據(jù)對閾值進行調(diào)整,我們給出了指標(biāo)實際值和閾值的對比圖
這里的P1、P2、P3、P4的閾值代表著不同的嚴重程度,當(dāng)用戶配置好各個閾值之后,ARMS會用不同的顏色標(biāo)識出4個不同等級的閾值。

2.提供了告警數(shù)預(yù)測功能
我們會根據(jù)指標(biāo)歷史24h數(shù)據(jù),計算指標(biāo)會超出每個閾值的次數(shù)來預(yù)測在該設(shè)定下告警的數(shù)量。并且,ARMS提供了指標(biāo)詳情信息,用戶可以看到具體是哪些時刻,指標(biāo)的實際值超出了當(dāng)前的閾值。用戶可以根據(jù)這些信息調(diào)整閾值,以適配實際業(yè)務(wù)需求。
  
  
3. 無論是靜態(tài)閾值還是推薦閾值,ARMS都支持用戶手動調(diào)節(jié)推薦閾值
在靜態(tài)閾值配置的界面下, 用戶可以按需地修改閾值;在區(qū)間檢測功能中,用戶可以滑動靈敏度按鈕,從0到200挑選任意整數(shù)作為靈敏度。并且,圖中標(biāo)識著指標(biāo)上下邊界的綠色區(qū)間也會隨著靈敏度的變化而變化。

總結(jié)
為了幫助用戶快速配出“高質(zhì)量“告警,ARMS提供了“靜態(tài)推薦閾值”來幫助用戶快速地計算指標(biāo)的“正常水位”;并且,針對不同時間段“正常水位”不一樣的指標(biāo),ARMS提供了“區(qū)間檢測”功能。另外,ARMS提供了告警數(shù)預(yù)測功能,使得運維工程師們可以及時地評估告警規(guī)則的合理性。也讓他們有足夠的信息,根據(jù)自身業(yè)務(wù)來調(diào)節(jié)告警閾值以及區(qū)間檢測中的靈敏度,一次性配出“高質(zhì)量”告警。
運維工程師D表示:"用ARMS確實比給告警數(shù)配告警靠譜哈",運維工程師A、B、C:“趕緊上阿里云開通ARMS吧,我再也不想半夜被告警電話吵醒了”。
參考文獻:
[1] Prophet算法
Taylor S J, Letham B. Forecasting at scale[J]. The American Statistician, 2018, 72(1): 37-45.
[2] 舉個例子















 
 
 







 
 
 
 