自定義Prometheus告警規則
Prometheus中的告警規則允許你基於PromQL表達式定義告警觸發條件,Prometheus后端對這些觸發規則進行周期性計算,當滿足觸發條件后則會觸發告警通知。默認情況下,用戶可以通過Prometheus的Web界面查看這些告警規則以及告警的觸發狀態。當Promthues與Alertmanager關聯之后,可以將告警發送到外部服務如Alertmanager中並通過Alertmanager可以對這些告警進行進一步的處理。
定義告警規則
一條典型的告警規則如下所示:
groups: - name: example rules: - alert: HighErrorRate expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5 for: 10m labels: severity: page annotations: summary: High request latency description: description info
在告警規則文件中,我們可以將一組相關的規則設置定義在一個group下。在每一個group中我們可以定義多個告警規則(rule)。一條告警規則主要由以下幾部分組成:
- alert:告警規則的名稱。
- expr:基於PromQL表達式告警觸發條件,用於計算是否有時間序列滿足該條件。
- for:評估等待時間,可選參數。用於表示只有當觸發條件持續一段時間后才發送告警。在等待期間新產生告警的狀態為pending。
- labels:自定義標簽,允許用戶指定要附加到告警上的一組附加標簽。
- annotations:用於指定一組附加信息,比如用於描述告警詳細信息的文字等,annotations的內容在告警產生時會一同作為參數發送到Alertmanager。
為了能夠讓Prometheus能夠啟用定義的告警規則,我們需要在Prometheus全局配置文件中通過rule_files指定一組告警規則文件的訪問路徑,Prometheus啟動后會自動掃描這些路徑下規則文件中定義的內容,並且根據這些規則計算是否向外部發送通知:
rule_files:
[ - <filepath_glob> ... ]
默認情況下Prometheus會每分鍾對這些告警規則進行計算,如果用戶想定義自己的告警計算周期,則可以通過evaluation_interval來覆蓋默認的計算周期:
global: [ evaluation_interval: <duration> | default = 1m ]
模板化
一般來說,在告警規則文件的annotations中使用summary描述告警的概要信息,description用於描述告警的詳細信息。同時Alertmanager的UI也會根據這兩個標簽值,顯示告警信息。為了讓告警信息具有更好的可讀性,Prometheus支持模板化label和annotations的中標簽的值。
通過$labels.<labelname>變量可以訪問當前告警實例中指定標簽的值。$value則可以獲取當前PromQL表達式計算的樣本值。
# To insert a firing element's label values:
{{ $labels.<labelname> }}
# To insert the numeric expression value of the firing element:
{{ $value }}
例如,可以通過模板化優化summary以及description的內容的可讀性:
groups: - name: example rules: # Alert for any instance that is unreachable for >5 minutes. - alert: InstanceDown expr: up == 0 for: 5m labels: severity: page annotations: summary: "Instance {{ $labels.instance }} down" description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 5 minutes." # Alert for any instance that has a median request latency >1s. - alert: APIHighRequestLatency expr: api_http_request_latencies_second{quantile="0.5"} > 1 for: 10m annotations: summary: "High request latency on {{ $labels.instance }}" description: "{{ $labels.instance }} has a median request latency above 1s (current value: {{ $value }}s)"
重啟Prometheus后訪問Prometheus UIhttp://ip:9090/rules可以查看當前以加載的規則文件。

切換到Alerts標簽http://ip:9090/alerts可以查看當前告警的活動狀態。

此時,我們可以手動拉高系統的CPU使用率,驗證Prometheus的告警流程,在主機上運行以下命令:
cat /dev/zero>/dev/null
運行命令后查看CPU使用率情況,如下圖所示:

Prometheus首次檢測到滿足觸發條件后,hostCpuUsageAlert顯示由一條告警處於活動狀態。由於告警規則中設置了1m的等待時間,當前告警狀態為PENDING,如下圖所示:

如果1分鍾后告警條件持續滿足,則會實際觸發告警並且告警狀態為FIRING,如下圖所示:

