如何規(guī)劃告警路由(路由器告警)
Alertmanager 處理由 Prometheus 服務(wù)器等客戶端應(yīng)用程序發(fā)送的告警。負(fù)責(zé)對它們進(jìn)行分組、靜默、抑制、去重并路由到正確的接收方,例如Email、Wechat、Webhook。
路由分組
在文章《》中我們介紹了告警(Alerts)進(jìn)入Alertmanager后,首先進(jìn)行路由匹配,本篇我們將詳解如何實(shí)現(xiàn)靈活、可擴(kuò)展的路由配置。
Alertmanager的路由設(shè)計(jì)比較新穎,借鑒了Kubernetes的label selector能力,并結(jié)合樹形多層次深度優(yōu)先匹配,實(shí)現(xiàn)了非常靈活和可擴(kuò)展的路由,總結(jié)特點(diǎn)如下:
基于label匹配Alerts,解耦了告警規(guī)則與接收人
基于樹形結(jié)構(gòu)深度優(yōu)先匹配,支持多層次靈活匹配
在支持深度優(yōu)先匹配基礎(chǔ)上,同時(shí)支持是否繼續(xù)匹配兄弟節(jié)點(diǎn)路由
我們將探討如何基于Alertmanger靈活強(qiáng)大的路由設(shè)計(jì)出適應(yīng)組織的告警路由。
從一個(gè)小型團(tuán)隊(duì)開始,Alertmanager能提供很好的能力,只需要配置簡單的業(yè)務(wù)轉(zhuǎn)發(fā)邏輯就可以工作。例如基礎(chǔ)告警轉(zhuǎn)到oncall,業(yè)務(wù)告警轉(zhuǎn)到業(yè)務(wù)負(fù)責(zé)部門。這些基本功能很好配置,不需要太多設(shè)計(jì)。
在一個(gè)更大的組織中,事情并不是那么簡單??赡苡泻芏鄨F(tuán)隊(duì),每個(gè)團(tuán)隊(duì)都有自己的需求,希望將通知以不同的方式發(fā)送到不同的地方。一個(gè)組織通常會(huì)共享一組 Alertmanagers,因此首先要做的是在每個(gè) Prometheus 的規(guī)則上建立一些標(biāo)準(zhǔn)標(biāo)簽,例如service或team作為external_label以標(biāo)識(shí)告警對應(yīng)哪個(gè)團(tuán)隊(duì)或者服務(wù)。
根路由
Alertmanger支持樹形路由,首先我們需要設(shè)置一個(gè)根路由(root route),以接收所有Alerts,并作為默認(rèn)的路由。
需要確保根路由有一個(gè)合理的receiver,以便在未得到其他路由匹配時(shí)也可以及時(shí)處理。
子路由
在根路由下面,每個(gè)團(tuán)隊(duì)都有一條路由,使用team標(biāo)簽來匹配每個(gè)團(tuán)隊(duì)的警報(bào)。每個(gè)團(tuán)隊(duì)的Alerts都會(huì)路由到對應(yīng)的團(tuán)隊(duì)路由下,不會(huì)影響其他團(tuán)隊(duì)。每個(gè)團(tuán)隊(duì)都可以擁有子路由,例如,將非生產(chǎn)環(huán)境的Alerts發(fā)送到oncall,其他Alerts根據(jù)業(yè)務(wù)不同發(fā)給不同的開發(fā)同學(xué)。隨著時(shí)間的推移,可能會(huì)有更多的路線來覆蓋服務(wù)中的細(xì)微之處,例如應(yīng)用不同的通知group_by或group_interval某些通知。
對于給定的組織或者團(tuán)隊(duì),雖然警報(bào)規(guī)則可能會(huì)經(jīng)常更改,但Alertmanager的配置應(yīng)該很少更改,通常最多每隔幾個(gè)月更改一次。因此,將所有內(nèi)容保存在一個(gè)大文件中,可以通過git和Pull Rrequest向運(yùn)行警報(bào)管理器的監(jiān)控團(tuán)隊(duì)完成任何更改申請,有點(diǎn)類似gitops的感覺。
可以在源代碼控制中為每個(gè)團(tuán)隊(duì)提供一個(gè)YAML文件,他們可以使用他們的路由和接收器進(jìn)行編輯,然后自動(dòng)將它們整合在一起。同時(shí)要進(jìn)行必要格式和邏輯檢查以防止破壞,可以借助 Alertmanager的工具實(shí)現(xiàn)解析和check配置。
需要注意的事情是,抑制規(guī)則目前是全局性的,如果沒有設(shè)計(jì)很好的labels方案,很難利用好抑制規(guī)則。
多路由匹配
Alertmanger支持匹配多條路由,可以在路由的每個(gè)節(jié)點(diǎn)開啟或者關(guān)閉,利用該特性,這可以支持特定的組織范圍的路由,只需要將該路由放到其他其他子路由前面,并開啟繼續(xù)匹配后續(xù)兄弟節(jié)點(diǎn)路由的開關(guān)即可。
例如,一些組織喜歡通過webhook記錄所有Alerts,并且不影響繼續(xù)路由到各個(gè)團(tuán)隊(duì),就可以利用該特性實(shí)現(xiàn)。
總結(jié)一下
根路由作為默認(rèn)路由
每個(gè)團(tuán)隊(duì)新建團(tuán)隊(duì)范圍的路由,隔離不同團(tuán)隊(duì)的Alerts
然后在各個(gè)團(tuán)隊(duì)內(nèi),可以根據(jù)需要再細(xì)化出更多的路由