異常檢測(cè)作為智能運(yùn)維(AIOps)系統(tǒng)中基礎(chǔ)且重要功能,其旨在通過(guò)算法自動(dòng)地發(fā)現(xiàn) KPI 時(shí)間序列數(shù)據(jù)中的異常波動(dòng),為后續(xù)的告警、自動(dòng)止損、根因分析等提供決策依據(jù)。那么,我們?cè)撊绾卧趯?shí)際場(chǎng)景中使用異常檢測(cè)呢,而異常檢測(cè)又是什么,今天我們就進(jìn)行一次深入講解。
背景
異常檢測(cè)作為智能運(yùn)維(AIOps)系統(tǒng)中基礎(chǔ)且重要功能,其旨在通過(guò)算法自動(dòng)地發(fā)現(xiàn) KPI 時(shí)間序列數(shù)據(jù)中的異常波動(dòng),為后續(xù)的告警、自動(dòng)止損、根因分析等提供決策依據(jù)。那么,我們?cè)撊绾卧趯?shí)際場(chǎng)景中使用異常檢測(cè)呢,而異常檢測(cè)又是什么,今天我們就進(jìn)行一次深入講解。
什么是異常檢測(cè)?
在一切開始前,我們首先需要了解什么是異常檢測(cè)。異常檢測(cè)是指從時(shí)間序列或者事件日志中,去識(shí)別出不正常的事件、現(xiàn)象等。我們這里講的異常檢測(cè)特指時(shí)間序列的異常檢測(cè)。通過(guò)對(duì)時(shí)間序列的值大小,曲線形態(tài)等進(jìn)行綜合判定,可以發(fā)現(xiàn)曲線異常點(diǎn)。異常的表現(xiàn)一般是指時(shí)間序列發(fā)生了不符合預(yù)期的上升、下降或者波動(dòng)。
舉例來(lái)說(shuō):某臺(tái)機(jī)器的內(nèi)存使用率指標(biāo)一直在 40% 左右的水位波動(dòng), 突然飆升至 100%;某個(gè) Redis 數(shù)據(jù)庫(kù)的連接數(shù)正常水平一直在 100 數(shù)量左右, 突然發(fā)生了大規(guī)模的下跌至 0 的現(xiàn)象;某個(gè)業(yè)務(wù)的在線人數(shù)在 10 萬(wàn)左右波動(dòng),突然下跌到了 5 萬(wàn)等等。
什么是時(shí)間序列?
時(shí)間序列是指一組按照時(shí)間發(fā)生先后順序進(jìn)行排列的數(shù)據(jù)點(diǎn)序列,通常一組時(shí)間序列的時(shí)間間隔為一恒定值(如 1 分鐘、5 分鐘)。
當(dāng)前開源 Prometheus 是如何做異常檢測(cè)的?
目前開源版本的 Prometheus 檢測(cè)能力還是基于設(shè)定閾值規(guī)則方式進(jìn)行,而這種依賴閾值設(shè)定的方式就引出了以下問(wèn)題。
常見問(wèn)題
問(wèn)題 1:面對(duì)數(shù)以萬(wàn)計(jì)的指標(biāo)數(shù)量,如何快速又合理的完成檢測(cè)配置?
由于不同類型指標(biāo)的含義差別大,對(duì)應(yīng)設(shè)定的合理閾值也不太一樣。哪怕是同一種類型指標(biāo),由于業(yè)務(wù)狀態(tài)不一樣,往往不能用相同閾值。因此,在配置閾值時(shí),運(yùn)維人員需要根據(jù)對(duì)應(yīng)的業(yè)務(wù)情況去配置自認(rèn)為合理的閾值。由于運(yùn)維人員認(rèn)知水平和工作經(jīng)驗(yàn)存在差異,因此不同人員配置的閾值也存在差別。其次,很多指標(biāo)沒(méi)有明確合理的范圍定義,這導(dǎo)致很多閾值配置都是“拍腦袋”確定的,隨機(jī)性比較強(qiáng)。
舉例來(lái)說(shuō):某在線人數(shù)指標(biāo), 必須仔細(xì)觀察分析歷史指標(biāo)曲線的數(shù)值分布和變化趨勢(shì),才能設(shè)置出合理的閾值。
問(wèn)題 2:隨著業(yè)務(wù)的演化,如何進(jìn)行檢測(cè)規(guī)則的維護(hù)?
對(duì)于相對(duì)穩(wěn)定的業(yè)務(wù),業(yè)務(wù)指標(biāo)長(zhǎng)期處于穩(wěn)定狀態(tài),這種情況下配置的閾值可以發(fā)揮比較長(zhǎng)時(shí)間作用。但對(duì)于時(shí)刻變化的業(yè)務(wù), 伴隨業(yè)務(wù)的不斷演化,指標(biāo)的水位和走勢(shì)也是在不斷變化。這些變化很容易導(dǎo)致一開始設(shè)定的閾值檢測(cè),經(jīng)過(guò)一段時(shí)間則不太滿足檢測(cè)現(xiàn)狀。這時(shí)候則需要運(yùn)維專家定期核查檢測(cè)閾值是否還符合當(dāng)前檢測(cè)需求,對(duì)不合理的配置進(jìn)行維護(hù)與修改。因此,靜態(tài)閾值方式存在著維護(hù)成本高的問(wèn)題。
舉例來(lái)說(shuō):某 IO 吞吐量一開始穩(wěn)定在 1 萬(wàn)的量值附近波動(dòng),一開始設(shè)定了檢測(cè)閾值為超過(guò) 2 萬(wàn)則告警。但隨著業(yè)務(wù)發(fā)展,IO 吞吐量已穩(wěn)定在 2.5 萬(wàn)左右,這時(shí)候一開始設(shè)定的閾值就導(dǎo)致了源源不斷的告警叨擾。
問(wèn)題 3:數(shù)據(jù)質(zhì)量不佳如何解決?
數(shù)據(jù)質(zhì)量不佳表現(xiàn)為幾種具體現(xiàn)象:采集延遲大、數(shù)據(jù)缺失值多、數(shù)據(jù)毛刺點(diǎn)比較多(反應(yīng)在曲線上則是不夠平滑)。對(duì)于前面?zhèn)z種, 更多的是從采集、聚合側(cè)進(jìn)行針對(duì)性優(yōu)化。ARMS-Prometheus 持續(xù)在采集能力進(jìn)行優(yōu)化。而對(duì)于數(shù)據(jù)毛刺點(diǎn)很多的數(shù)據(jù)質(zhì)量問(wèn)題,靜態(tài)閾值方式無(wú)法有效的規(guī)避。而在 ARMS- 托管版 Prometheus 的智能算子中, 我們則針對(duì)多毛刺點(diǎn)進(jìn)行了有效的識(shí)別,保證了毛刺點(diǎn)不會(huì)形成無(wú)效告警, 減少用戶側(cè)/運(yùn)維側(cè)形成叨擾。
阿里云 Prometheus 監(jiān)控是怎么解決這些問(wèn)題
面對(duì)以上問(wèn)題,阿里云 Prometheus 監(jiān)控的檢測(cè)配置能力除了支持原生的設(shè)定閾值檢測(cè)方式,全面新增支持模板設(shè)定檢測(cè)閾值方式與智能檢測(cè)算子方式。
業(yè)務(wù)價(jià)值 1:高效高質(zhì)量的告警配置
(1)針對(duì)明確的應(yīng)用場(chǎng)景配置檢測(cè)規(guī)則,阿里云 Prometheus 監(jiān)控提供成熟的告警配置模板化,用戶無(wú)需人工設(shè)定閾值, 只需要選擇對(duì)應(yīng)的模版即可。例如:機(jī)器指標(biāo)場(chǎng)景下, 配置“機(jī)器指標(biāo)的 cpu 使用率 >80%”的模板。模板的方式解決了配置中明確異常且業(yè)務(wù)比較穩(wěn)定的應(yīng)用場(chǎng)景痛點(diǎn)。
(2)針對(duì)不明確的指標(biāo)場(chǎng)景或不好設(shè)定的業(yè)務(wù)指標(biāo)場(chǎng)景,則推薦使用智能檢測(cè)算子功能。
例如需要對(duì)某在線人數(shù)指標(biāo)設(shè)定閾值, 這時(shí)需要花費(fèi)很長(zhǎng)的時(shí)間觀察歷史曲線狀態(tài)才能配置出合理的閾值。這種場(chǎng)景下用戶可以直接選擇智能檢測(cè)算子。
業(yè)務(wù)價(jià)值 2:自適應(yīng)追蹤業(yè)務(wù)變化,大大降低檢測(cè)閾值維護(hù)成本
阿里云 Prometheus 監(jiān)控的智能檢測(cè)算子功能,通過(guò)設(shè)定參考?xì)v史數(shù)據(jù)長(zhǎng)度的參數(shù),模型可以自適應(yīng)的追蹤指標(biāo)趨勢(shì)的變化,無(wú)需人工定期去審查配置規(guī)則。
業(yè)務(wù)價(jià)值 3: 對(duì)于質(zhì)量不佳,缺失值/毛刺點(diǎn)過(guò)多的指標(biāo)也可以實(shí)現(xiàn)智能檢測(cè)
在智能檢測(cè)算子功能中, 如果歷史數(shù)據(jù)出現(xiàn)了缺失,算法可以線性插值,多項(xiàng)式插值等多種方式,自動(dòng)填補(bǔ)缺失值。對(duì)于不平滑的指標(biāo)曲線檢測(cè),智能檢測(cè)算子也自適應(yīng)的選擇針對(duì)該場(chǎng)景的最優(yōu)模型進(jìn)行檢測(cè),保證整體的檢測(cè)效果。
如何應(yīng)用在具體業(yè)務(wù)場(chǎng)景里
水位突增/突降型指標(biāo):某業(yè)務(wù)的 qps 指標(biāo)
在業(yè)務(wù)開始設(shè)定閾值時(shí), 通過(guò)觀察很有可能設(shè)定閾值不超過(guò) 150。但隨著業(yè)務(wù)迭代,qps 指標(biāo)也會(huì)發(fā)生各種各樣的變化。從指標(biāo)上則表現(xiàn)為:出現(xiàn)階段性的突增至某個(gè)值,然后平穩(wěn)的狀態(tài)。這種情況下,設(shè)定的靜態(tài)閾值很難持續(xù)滿足檢測(cè)需求。另外一方面, 穩(wěn)定情況也會(huì)出現(xiàn)突發(fā)的下跌, 只設(shè)置上限的靜態(tài)閾值是檢測(cè)出這種下跌情況的。這種情形下, 智能檢測(cè)算子則可以自適應(yīng)的跟蹤業(yè)務(wù)水平的變化,智能識(shí)別業(yè)務(wù)的突增或突降。
周期性的指標(biāo):
在指標(biāo)畫像模塊,如果識(shí)別出當(dāng)前的指標(biāo)具有一定的周期,則會(huì)從中提取出對(duì)應(yīng)的周期值、周期偏移值, 以及整體趨勢(shì)曲線。在原始的時(shí)間序列去除周期性、趨勢(shì)性后,利用殘差進(jìn)行異常檢測(cè)。以上圖的周期指標(biāo)為例, 11.30 分左右的周期與其他周期出現(xiàn)明顯差別。傳統(tǒng)靜態(tài)閾值很難去解這類場(chǎng)景下的檢測(cè)問(wèn)題, 而利用智能檢測(cè)算子,則可以識(shí)別出該種異常。
趨勢(shì)破壞型的指標(biāo):
此外,還有一種常見類型的指標(biāo)異常是,在某一階段內(nèi), 指標(biāo)一直呈現(xiàn)上升(或者下降)趨勢(shì)。在某一個(gè)節(jié)點(diǎn)出現(xiàn)突發(fā)性的趨勢(shì)破壞,局部呈現(xiàn)了和整體趨勢(shì)不一樣。這種異常類型也是很常見的,但是靜態(tài)閾值很難設(shè)定來(lái)解決這種情形。而智能檢測(cè)算子則針對(duì)這種類型可以進(jìn)行準(zhǔn)確了的識(shí)別異常。
最佳實(shí)踐
阿里云Prometheus監(jiān)控內(nèi)使用流程
目前阿里云 Prometheus 監(jiān)控已經(jīng)支持智能檢測(cè)算子功能,只需登陸 ARMS-Prometheus/grafana,輸入對(duì)應(yīng)的 PromQL 即可。
算子定義
"anomaly_detect": { Name: anomaly_detect",ArgTypes: []ValueType{ValueTypeMatrix, ValueTypeScalar},ReturnType: ValueTypeVector,},輸入:指標(biāo)的時(shí)間序列,類型為range vector;檢測(cè)參數(shù),使用默認(rèn)的3即可輸出:異常返回1, 正常返回0 使用 case:
anomaly_detect(node_memory_free_bytes[20m],3)
輸入的必須是 range vector,因此需要在指標(biāo)名稱后增加[180m], 時(shí)間范圍默認(rèn)選擇 180m,參數(shù)默認(rèn)選擇 3
如果先進(jìn)行了其他聚合函數(shù)操作,則需要[180m:],使之變?yōu)?range vector,如下:anomaly_detect(sum(node_memory_free_bytes)[180m:],3)
使用示例:
step 1: 登陸到 ARMS-Prometheus 或 Grafana 中選擇對(duì)應(yīng)的 Prometheus 數(shù)據(jù)源
選擇對(duì)應(yīng)的數(shù)據(jù)源:
step 2: 選擇指標(biāo), 并查看
step 3: 輸入異常檢測(cè)算子
關(guān)于 Prometheus- 智能檢測(cè)算子
阿里云 Prometheus 監(jiān)控智能檢測(cè)算子,總結(jié)業(yè)界數(shù)十款領(lǐng)先的算法方案實(shí)踐設(shè)計(jì)而成。針對(duì)常見的指標(biāo)類型建立了指標(biāo)畫像,并自適應(yīng)的選擇最佳模型去進(jìn)行檢測(cè)計(jì)算。每一條指標(biāo)數(shù)據(jù)輸入模型后, 模型首先會(huì)對(duì)當(dāng)前的指標(biāo)建立指標(biāo)畫像,包括平穩(wěn)性,抖動(dòng)性,趨勢(shì)性,周期性,是否為特殊節(jié)假日/活動(dòng)等。根據(jù)這些畫像特征構(gòu)建之后, 模型自適應(yīng)選擇最優(yōu)一種或者多種算法組合來(lái)解當(dāng)前的指標(biāo)檢測(cè)問(wèn)題,保證了整體效果最優(yōu)。目前已經(jīng)支持的功能包括:突增檢測(cè)、毛刺檢測(cè)、周期識(shí)別(識(shí)別周期性、周期的偏移)。
通過(guò)阿里云 Prometheus 監(jiān)控中集成智能檢測(cè)算子, 我們希望給用戶可以提供開箱即用、持續(xù)迭代更新的智能檢測(cè)服務(wù)。目前用戶可以在阿里云 Prometheus 監(jiān)控中查看并使用智能檢測(cè)算子,而基于 ARMS 的原生配置智能檢測(cè)告警功能和 Grafana 動(dòng)態(tài)展示將在近期推出。
1)系統(tǒng)架構(gòu)面臨的三大挑戰(zhàn),看 Kubernetes 監(jiān)控如何解決?
2)面對(duì)疾風(fēng)吧,如何搭建高協(xié)同的精準(zhǔn)告警系統(tǒng)