分組(Grouping)及路由(route)
簡介
分組将類似性質的警報分類為單個通知。當許多系統同時發生故障并且可能同時觸發數百到數千個警報時,這在較大的中斷期間尤其有用。
示例:當發生網絡分區時,叢集中正在運作數十個或數百個服務執行個體。您的一半服務執行個體無法再通路資料庫。Prometheus 中的警報規則被配置為在每個服務執行個體無法與資料庫通信時發送警報。是以,數百個警報被發送到 Alertmanager。
作為使用者,您隻想獲得一個頁面,同時仍然能夠準确檢視哪些服務執行個體受到影響。是以,可以将 Alertmanager 配置為按叢集和警報名稱對警報進行分組,以便它發送單個緊湊通知。
警報分組、分組通知的時間以及這些通知的接收者由配置檔案中的路由樹進行配置。
配置項
配置項如下:
# 設定預設接收人
[ receiver: <string> ]
# 用于将傳入警報分組在一起的标簽。
[ group_by: '[' <labelname>, ... ']' ]
# 警報是否應繼續比對後續同級節點。
[ continue: <boolean> | default = false ]
# 不推薦使用下面的比對器。
# 警報必須滿足的一組相等比對器來比對節點。
match:
[ <labelname>: <labelvalue>, ... ]
# 不推薦,警報必須滿足的一組正規表達式比對器來比對節點。
match_re:
[ <labelname>: <regex>, ... ]
# 警報必須完成以比對節點的比對器清單。
matchers:
[ - <matcher> ... ]
# 為組發送通知的初始等待時間
# 警報數量。允許等待禁止警報到達或收集,同一組的更多初始警報。(通常為~0到幾分鐘。)
[ group_wait: <duration> | default = 30s ]
# 在發送有關新警報的通知之前需要等待多長時間
[ group_interval: <duration> | default = 5m ]
# 如果已發送通知,則在再次發送通知之前要等待多長時間,通常約3小時或更長時間
[ repeat_interval: <duration> | default = 4h ]
# 應禁用路由的時間。這些檔案必須與檔案名比對
mute_time_intervals:
[ - <string> ...]
# 零個或多個子路由。
routes:
[ - <route> ... ]
流程分析
路由塊定義路由樹中的一個節點及其子節點。如果未設定,其可選配置參數将從其父節點繼承。
每個警報在配置的頂級路由處進入路由樹,該路由樹必須比對所有警報(即沒有任何配置的比對器)。然後周遊子節點。如果continue設定為 false,它會在第一個比對的孩子之後停止。如果continue在比對節點上為 true,則警報将繼續與後續兄弟節點比對。如果警報與節點的任何子節點都不比對(沒有比對的子節點或不存在),則根據目前節點的配置參數處理警報。
抑制( Inhibition)
概念
抑制是一個概念,如果某些其他警報已經觸發,則抑制某些警報的通知,可以有效的防止告警風暴。
配置項
通過 Alertmanager 的配置檔案進行配置,配置項為inhibit_rules,很多配置項已經過時,是以這裡隻有三個配置項,可以配置的内容如下:
# 要禁用的目标警報必須滿足的比對器清單。
target_matchers:
[ - <matcher> ... ]
# 必須存在一個或多個警報才能使抑制生效的比對器清單。
source_matchers:
[ - <matcher> ... ]
# 要使抑制生效,源警報和目标警報中必須具有相等值的标簽。
[ equal: '[' <labelname>, ... ']' ]
案例示範
1. 模拟環境
首先我們部署了伺服器和Nacos的監控,如果伺服器當機,此時Nacos肯定也挂掉了,這個時候就應該抑制Nacos告警。之前案例中,我們已經接入了Naocs和Windows伺服器。
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLkFWZ2IWZiZWM2M2YlRGZiRmNwQjMxcTNhNjNhZTOlZzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
在Promethues的規則檔案中,添加告警規則
groups:
- name: alters
rules:
- alert: Nacos Down
# expr:基于PromQL表達式告警觸發條件,用于計算是否有時間序列滿足該條件。
expr: up{job="nacos"} == 0
for: 1m
labels:
severity: emergency
target: nacos
host: localhost
annotations:
description: "description"
summary: "{{ $labels.instance }} 已停止運作超過 1 分鐘!"
- alert: System Down
expr: up{job="wins"} == 0
for: 1m
labels:
severity: emergency
target: wins
host: localhost
annotations:
description: "description"
summary: "{{ $labels.instance }} 已停止運作超過 1 分鐘!"
重新啟動Promethues,然後再任務管理器中,停掉我們windows_exporter(因為部署在自己電腦上,是以關閉這個,模拟伺服器當機),再關閉Nacos。
稍等片刻,Promethues将告警發出去了。
檢視Alertmanager控制台,收到了告警,注意他們的标簽lable,host表示他們來自于哪台伺服器。
在接入微信通知時,收到了Nacos和System停止運作的資訊,在實際開發中,我們應該抑制Nacos挂掉的資訊,因為伺服器都當機了,再發送其他服務挂掉的資訊,是多餘的。
2. 配置抑制規則
在alertmanager.yml添加抑制規則。
inhibit_rules:
- target_matchers:
- job = nacos
source_matchers:
- job = wins
- severity = emergency
equal:
- host
- target_matchers表示目标比對器,這裡表示對job标簽為nacos的告警進行抑制
- source_matchers表示來源比對器,這裡表示當發現job标簽為wins,并且告警級别為emergency時的告警通知發出,則會對target_matchers中比對的通知進行抑制。
- equal表示,來源通知和抑制目标通知需要具有相同的host标簽,這裡表示他們需要來自于同一台伺服器
重新開機Alertmanager,發現隻發出了System Down的告警,Nacos相關的已經被抑制了。
靜默(Silences)
簡介
靜默是在給定時間内簡單地将警報靜默的直接方法。靜音是基于比對器配置的,就像路由樹一樣。檢查傳入警報是否與活動靜默的所有相等或正規表達式比對器比對。如果他們這樣做,則不會發送該警報的通知。
案例示範
靜默是在 Alertmanager 的 Web 界面中配置的。
可以在頁面上,添加靜默時間和比對器,直接打開Alertmanager 控制台,直接點選告警資訊的+号,就會自動添加比對器。
這裡選擇時間,填寫建立者和說明,然後點選Create建立。
然後點選Silences菜單,就能看到添加的靜默規則了,
點選View,還能看到目前規則的詳情,以及目前已經靜默了多少條告警通知。