天天看點

Prometheus監控運維實戰十:告警管理

在上篇文章中,我們學習了prometheus告警規則的配置,但由于其不提供告警發送功能,我們隻能在ui界面檢視到相關的告警情況。在prometheus架構中,告警管理功能主要通過alertmanager來完成,本文将接着上篇,講解通過alertmanager來實作警報的發送與管理 。

alertmanager作為一個獨立的元件,負責接收并處理來自prometheus server(也可以是其它的用戶端程式)的告警資訊。alertmanager可以對這些告警資訊進行進一步的處理,比如當接收到大量重複告警時能夠消除重複的告警資訊,同時對告警資訊進行分組并且路由到正确的通知方,prometheus内置了對郵件,slack等多種通知方式的支援,同時還支援通過webhook的方式接入企業微信、釘釘等國内im工具。

Prometheus監控運維實戰十:告警管理

alertmanager除了提供基本告警通知能力以外,還具有以下幾個特點:

1. 分組

分組機制可以将相同性質的警報合并為一個通知,在某些情況下,比如由于系統當機導緻大量的告警被同時觸發,在這種情況下分組機制可以将這些被觸發的告警合并 為一個告警通知,避免一次性接受大量的告警通知,而無法對問題進行快速定位。

例如,當一台主控端上運作着數十個虛拟機,如果機器發生網絡或硬體故障,運維人員可能收到數十個告警,包括實體機與上面的所有虛拟機。而逐個檢視這些故障本身是個耗時的工作,也容易導緻對主要問題的忽略。

作為告警接收人,可能隻希望能夠在一個通知中就能檢視到受影響的執行個體資訊,這時可以按照告警名稱或所有主控端對告警進行分組,而将這些告警合并到一個通知中查收。

告警分組,告警時間,以及告警的接受方式可以通過alertmanager的配置檔案進行配置。

2. 抑制:

抑制是指當某一告警發出後,可以停止重複發送由此告警引發的其它告警的機制。

例如,當叢集不可通路時觸發了一次告警,通過配置alertmanager可以忽略與該叢集有關的其它所有告警。這樣可以避免接收到大量與實際問題無關的告警通知。

抑制機制同樣通過alertmanager的配置檔案進行設定。

3. 靜默:

靜默提供了一種簡單的方法對特定的告警在特定時間内進行靜音處理,它根據标簽進行比對。如果alertmanager接收到的告警資訊符合靜默的配置,它将不會發送告警通知。靜默功能适合在機器進行維護等場景下,暫時屏蔽告警通知。

靜默設定需要在alertmanager的wer頁面上進行設定。

下載下傳安裝包并解壓

拷貝檔案到bin目錄 

注:amtool是一個alertmanager管理工具,支援用指令行方式進行管理。

檢視版本号驗證安裝是否正常

alertmanager與prometheus  server一樣,也是通過yml格式的配置檔案進行配置。下面是一個基本的配置檔案模闆:

該配置檔案總共定義了四個子產品,global、templates、route和receivers。

global 

用于定義alertmanager的全局配置。

在示例中我們隻配置幾個參數,其中resolve_timeout定義持續多長時間未接收到告警标記後,就将告警狀态标記為resolved。而smtp_smarthost指定smtp伺服器位址,smtp_from定義了郵件發件的的位址,smtp_require_tls配置禁用tls的傳輸方式。

templates

用于指定告警通知時的模闆,如郵件模闆等。

由于alertmanager的資訊可以發送到多種接收媒體,如郵件、slack等,我們通常需要能夠自定義警報所包含的資訊,這個就可以通過模闆來實作。

限于篇幅原因,相關模闆的配置方式本文不做介紹,有興趣的朋友可上官網檢視:https://prometheus.io/docs/alerting/latest/notifications/。

route

用于定義alertmanager接收警報的處理方式,根據規則進行比對并采取相應的操作。

路由是一個基于标簽比對規則的樹狀結構,所有的告警資訊都會從配置中的頂級路由(route)進入路由樹。從頂級路由開始,根據标簽比對規則進入到不同的子路由,并且根據子路由設定的接收者發送告警。在示例配置中隻定義了頂級路由,并且配置的接收者為admin,是以,所有的告警都會發送給到admin的接收者。

group_by用于定義分組規則,前面講過alertmanager支援告警分組功能,這裡使用告警名稱做為規則,滿足規則的告警将會被合并到一個通知中;group_wait配置分組等待的時間間隔,在這個時間内收到的告警,會根據前面的規則做合并;group_interval定義相同group間發送告警通知的時間間隔;如果警報已經成功發送通知, 如果想設定發送告警通知之前要等待時間,則可以通過repeat_interval參數進行設定。

receivers

用于定義相關接收者的位址資訊。

由于我們示例配置是郵件告警的方式,這裡email_configs參數配置相關的郵件位址資訊,另外還支援wechat_configs、webhook_configs等方式。

啟動alertmanager時可使用參數修改相關配置,--config.file用于指定配置檔案路徑,--storage.path用于指定資料存儲路徑。

啟動完成後,打開浏覽器,通路http://$ip:9093,可看到ui界面

Prometheus監控運維實戰十:告警管理

prometheus的配置檔案中,alerting子產品用于配置alertmanager位址。當配置完成後,prometheus會将觸發告警規則的警報發送到alertmanager。

我們可以試着将上篇文章中的cpu告警規則調低,觸發prometheus告警規則來驗證配置,此處我們改為cpu使用率大于1%觸發告警。

在prometheus界面可看到已成功觸發告警規則

Prometheus監控運維實戰十:告警管理

打開alertmanager,可看到接收到的警報資訊

Prometheus監控運維實戰十:告警管理

在前面的示例中,我們隻定義了一個頂級路由,這意味着所有的告警都由admin的接收者擷取。但在實際環境中,告警的需求往往要比這個來得複雜。

例如,我們需要根據資源類型,将資料庫的告警發送給dba團隊,将伺服器的告警發送給運維團隊;或者根據告警的嚴重級别,普通告警發送給技術人員,嚴重告警還需要通知到上司層等等。

對于此類需求,我們可以使用子路由的方式來實作,這些route支援通過标簽的方式進行比對,并發送給相關的receiver。

在上面的這個示例中,我們配置了頂級路由,然後又根據不同的标簽,定義了兩個子路由和相關的接收者。其中continue的值如果為false,那麼告警在比對到第一個子節點之後就直接停止,如果continue為true,報警則會繼續進行後續子節點的比對。

對于告警資訊的比對,可以通過match和match_re進行标簽的比對,其中match比對字元,而match_re支援正規表達式的方式。

在某些情況下,我們可能希望對告警資訊進行屏蔽,不收到相關的告警資訊,例如對伺服器進行關機維護、執行個體重新開機等場景。對此,alertmanager提供了靜默功能,用于處理此類需求。

靜默功能的配置可以ui界面上進行,在頁面上點選 "slience"按鍵。

Prometheus監控運維實戰十:告警管理

在"new slience“頁面進行配置,matchers通過标簽配置需要屏蔽的告警,如果勾上regex,則可以在value處使用正規表達式做比對。在start處填寫開始時間,然後在end或duration中填寫一處即可,另外一個會自動計算出來。

Prometheus監控運維實戰十:告警管理

配置完成後,點選 "create”完成建立。此時點選”sliences”,可看到已經生成的slience。當需要提前中止該slience時,可點選旁邊的expire紅色字型,讓其過期即可。

Prometheus監控運維實戰十:告警管理

繼續閱讀