天天看點

Prometheus監控運維實戰九:告警規則

在上篇的文章中,我們通過grafana實作了監控可視化。而對于運維監控而言,除了監控展示以外,另一個重要的需求無疑就是告警了。良好的告警可以幫助運維人員及時的發現問題,處理問題并防範于未然,是運維工作中不可或缺的重要手段。

在prometheus的架構中,告警功能由prometheus server和alertmanager 協同完成,prometheus server負責收集目标執行個體的名額,定義告警規則以及産生警報,并将相關的警報資訊發送到alertmanager。alertmanager則負責對告警資訊進行管理 ,根據配置的接收人資訊,将告警發送到對應的接收人與媒體 。

Prometheus監控運維實戰九:告警規則

告警規則配置在獨立的檔案中,檔案格式為yml,并在prometheus.yml檔案的rule_files子產品中進行引用。如下

引用的檔案路徑支援正規表達式方式,如果有多個檔案時,可以用下列的方式比對

預設情況下,prometheus會每隔一分鐘對這些告警規則進行計算,如果使用者想定義自己的告警計算周期,可在global 子產品中配置evaluation_interval參數來控制。

如下:

在告警規則檔案中, 可以将一組相關的規則設定定義在一個group下,在每一個group中我們可以定義多個告警規則。

如下是一條标準的告警規則,用于檢測執行個體狀态是否正常。

一條告警規則由以下幾部分組成:

alert: 告警規則的名稱,在每一個group中,規則名稱必須是唯一的。

expr: 基于promql表達式配置的規則條件,用于計算相關的時間序列名額是否滿足規則。

for :評估等待時間,可選參數。當相關名額觸發規則後,在for定義的時間區間内該規則會處于pending狀态,在達到該時間後規則狀态變成firing,并發送告警資訊到alertmanager。

labels: 自定義标簽, 允許使用者指定要添加到告警資訊上的一組附加标簽。

annotations: 用于指定一組附加資訊,如用于描述告警的資訊文字等,本示例中 summary用于描述主要資訊,description用于描述詳細的告警内容。

模闆(template)是一種在警報中使用時間序列資料的标簽和值的方法,可用于告警中的注解和标簽。模闆使用标準的go模闆文法,并暴露一些包含時間序列的标簽和值的變量。

通過{{ $lable.<lablename>}}變量可以通路目前告警執行個體中指定标簽的值,{{ $value }}則可以擷取目前promql表達式計算的樣本值。

在實際使用中,可以通過模闆的方式優化summary與description内容的可讀性。比如,在描述中插入了執行個體資訊以及promql表達式計算的樣本值。

配置好規則檔案後,可以使用 curl -xpost ​​http://localhost:9090/-/reload​​ 或者重新開機prometheus的方式讓規則更新。當順利加載規則後,可以在prometheus的“status”- “rules”頁面檢視到相關的規則狀态資訊。

Prometheus監控運維實戰九:告警規則

當告警規則生效後,可以在alerts頁面檢視警報狀态。

Prometheus監控運維實戰九:告警規則

prometheus的警報有如下幾種狀态:

inactive : 警報未被觸發。

pending: 警報已被觸發,但還未滿足for參數定義的持續時間。

firing:警報被觸發警,并滿足for定義的持續時間的

告警規則的狀态變化如下所示,預設狀态為inactive,當規則被觸發後将變為pending,在達到持續時間後變成firing狀态。如果配置的規則沒有for子句,那麼當規則觸發時,警報會自動從inactive轉換為firing,而沒有任何的等待周期。

如果配置了alertmanager的位址,當警報狀态為firing時,prometheus會将相關的告警資訊轉發到alertmanager,并由其進行告警資訊的發送。在恢複正常後,警報狀态重新變回inactive。

Prometheus監控運維實戰九:告警規則

本文介紹了關于prometheus告警規則的配置,到目前為止,我們隻能通過prometheus ui檢視目前警報的活動狀态。prometheus自身并不提供告警發送功能,其需要與alertmanager結合,才能實作警報的管理與發送。限制篇幅原因,alertmanager的講解放到下一篇文章中介紹。

繼續閱讀