天天看點

小姐姐帶你入門Alertmanager與Prometheus告警規則

一、prometheus告警介紹

1. 元件介紹

prometheus整個監控系統中,prometheus隻負責将資料采集和生成告警資訊,而告警資訊的處理是由Alertmanager負責處理。

在Prometheus中定義好告警規則後,Prometheus會周期性的對告警規則進行計算,如果滿足告警觸發條件就會向Alertmanager發送告警資訊。

Alertmanager負責接收并處理來自Prometheus  Server的告警資訊。對這些告警資訊進行進一步的處理,比如當接收到大量重複告警時能夠消除重複的告警資訊,同時對告警資訊進行分組并且路由到正确的通知方,Prometheus内置了對郵件、Slack、webhook等多種通知方式的支援,同時AlertManager還提供了靜默和告警抑制機制來對告警通知行為進行優化。

小姐姐帶你入門Alertmanager與Prometheus告警規則

image.png

2. Alertmanager功能介紹

Alertmanager除了提供基本的告警通知能力以外,還提供了告警分組、告警抑制以及告警靜默等功能:

  • 告警分組

分組機制可以将同個分組下的多個告警合并到一個告警中進行發送,減少通知騷擾。例如在發生了網絡故障,導緻大量的服務間無法通信,此時就會有大量告警發送到Alertmanager,運維人員一次性接受大量的告警通知,反而無法對問題進行快速定位,這并不是使用者希望看到的,此時可以按服務次元進行分組,将這些告警組合成一個通知。

  • 告警抑制

當某一告警發出後,可以停止重複發送由此告警引發的其它告警的機制,避免發生某個故障出現後導緻其他一系列故障一起告警形成告警風暴的問題。例如,當叢集不可通路時觸發了一次告警,通過配置Alertmanager可以忽略與該叢集有關的其它所有告警。這樣可以避免接收到大量與實際問題無關的告警通知。

  • 告警靜默

讓同時間段内的相同告警不再重複發出,根據标簽對告警進行靜默處理。例如對服務進行停機維護期間可設定告警靜默,避免重複多次發送告警。

二、部署alertmanager(略)

  • 關聯Prometheus與Alertmanager
cat prometheus.yaml
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    rule_files:
    - /etc/prometheus/rules/*.yaml
    alerting:
      alertmanagers:
      - static_configs:
        - targets: ["alertmanager:9093"]
    scrape_configs:
       …………      

三、配置prometheus告警規則

1. 告警配置格式

Prometheus中的告警規則是基于PromQL表達式定義告警觸發條件,Prometheus後端對這些觸發規則進行周期性計算,當滿足觸發條件後則會觸發告警通知。預設情況下,使用者可以通過Prometheus的Web界面檢視這些告警規則以及告警的觸發狀态。當Promthues與Alertmanager關聯之後,可以将告警發送到外部服務如Alertmanager中并通過Alertmanager可以對這些告警進行進一步的處理。

groups:
- name: 告警分組名
  rules: 
  - alert: 告警規則的名稱
    expr: PromQL表達式,告警觸發條件,用于計算是否有時間序列滿足該條件。
    for: 評估等待時間,可選參數。用于表示隻有當觸發條件持續一段時間後才發送告警。在等待期間新産生告警的狀态為pending。避免因為網絡擁塞等原因導緻偶爾異常後立即觸發告警
    labels: # 自定義标簽,允許使用者指定要附加到告警上的一組附加标簽。
      severity: 自定義标簽-告警等級
    annotations: # 告警附加資訊,annotations的内容在告警産生時會一同作為參數發送到Alertmanager。
      summary: 描述告警的概要資訊
      description: 用于描述告警的詳細資訊      

2. 告警模闆

為了讓告警資訊具有更好的可讀性,prometheus支援使用變量替換annotations中的告警附加資訊

通過

小姐姐帶你入門Alertmanager與Prometheus告警規則

value則可以擷取目前PromQL表達式計算的樣本值。

groups:
- name: node-alert
  rules:
  - alert: node status is WODN
    expr: up{job="node_exporter"} == 0
    for: 5m
    labels:
      severity: emergency
      instance: "{{ $labels.instance }}"
    annotations:
      summary: "node: {{ $labels.instance }} down"
      description: "{{$labels.instance}} down more than 5 minutes"
      value: "{{ $value      
  • 這個告警的意思是查詢node_exporter的up狀态,如果為0,說明節點當機,發出告警。(目前節點都是up狀态, up{job=“node_exporter”} == 1可以查詢到4台主機up資訊)
小姐姐帶你入門Alertmanager與Prometheus告警規則

image.png

3. prometheus告警配置

  1. 建立rule.yaml檔案用于存放prometheus告警配置
  2. 修改prometheus配置檔案,指定rule檔案路徑
cat prometheus.yaml
    global:
      scrape_interval: 15s
      evaluation_interval: 15s
    rule_files:
    - /etc/prometheus/rules/*.yaml
    alerting:
      alertmanagers:
      - static_configs:
        - targets: ["alertmanager:9093"]
    scrape_configs:
    …………      

4. 驗證測試

  • 通過Prometheus  WEB界面中的Alerts菜單檢視目前Prometheus下的所有告警規則,以及其目前所處的活動狀态。處于INACTIVE  狀态,表示一切正常不會觸發告警。處于 PENDING 狀态,表示已經滿足告警條件,但在評估等待期間,如果持續異常,報警即将被激活。處于  FIRING 狀态,表示報警已經被激活了。
小姐姐帶你入門Alertmanager與Prometheus告警規則

image.png

  • 接下來關閉叢集中一個節點,模拟當機故障
小姐姐帶你入門Alertmanager與Prometheus告警規則

image.png

  • 此時已處于 PENDING 狀态,因為上面設定了for:5m,需要down的狀态持續5分鐘,才會發出告警通知
小姐姐帶你入門Alertmanager與Prometheus告警規則

image.png

  • 此時在Alertmanager中就可以看到詳細的告警資訊
小姐姐帶你入門Alertmanager與Prometheus告警規則

image.png

  • 除了在Alertmanager中檢視告警資訊,Prometheus也會将它們存儲到時間序列ALERTS{}中。

繼續閱讀