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