Alertmanager是一個獨立的告警模塊,接收Prometheus等客戶端發來的警報,之后通過分組、刪除重復等處理,並將它們通過路由發送給正確的接收器;告警方式可以按照不同的規則發送給不同的模塊負責人,Alertmanager支持Email, Slack,等告警方式, 也可以通過webhook接入釘釘等國內IM工具。
Prometheus的警報分為兩個部分。Prometheus服務器中的警報規則將警報發送到Alertmanager。該Alertmanager 然后管理這些警報,包括沉默,抑制,聚集和通過的方法,如電子郵件發出通知,對呼叫通知系統,以及即時通訊平台。
設置警報和通知的主要步驟是:
設置和配置 Alertmanager
配置Prometheus與Alertmanager對話
在Prometheus中創建警報規則
分組
分組將類似性質的警報分類為單個通知。當許多系統同時發生故障並且可能同時觸發數百到數千個警報時,此功能特別有用。
示例:發生網絡分區時,群集中正在運行數十個或數百個服務實例。您有一半的服務實例不再可以訪問數據庫。Prometheus中的警報規則配置為在每個服務實例無法與數據庫通信時為其發送警報。結果,數百個警報被發送到Alertmanager。
作為用戶,人們只希望獲得一個頁面,同時仍然能夠准確查看受影響的服務實例。因此,可以將Alertmanager配置為按警報的群集和警報名稱分組警報,以便它發送一個緊湊的通知。
警報的分組,分組通知的時間以及這些通知的接收者由配置文件中的路由樹配置。
沉默
沉默是一種簡單的特定時間靜音提醒的機制。一種沉默是通過匹配器來配置,就像路由樹一樣。傳入的警報會匹配RE,如果匹配,將不會為此警報發送通知。
在Alertmanager的Web界面中配置沉默。
抑制
抑制是指當警報發出后,停止重復發送由此警報引發其他錯誤的警報的機制。
例如,當警報被觸發,通知整個集群不可達,可以配置Alertmanager忽略由該警報觸發而產生的所有其他警報,這可以防止通知數百或數千與此問題不相關的其他警報。
抑制機制可以通過Alertmanager的配置文件來配置。
高可用性
Alertmanager支持配置以創建高可用性集群。
Alert的三種狀態:
1. pending:警報被激活,但是低於配置的持續時間。這里的持續時間即rule里的FOR字段設置的時間。改狀態下不發送報警。
2. firing:警報已被激活,而且超出設置的持續時間。該狀態下發送報警。
3. inactive:既不是pending也不是firing的時候狀態變為inactive
prometheus觸發一條告警的過程:
prometheus--->觸發閾值--->超出持續時間--->alertmanager--->分組|抑制|靜默--->媒體類型--->郵件|釘釘|微信等。
下載安裝Alertmanager:
配置文件 (alertmanager.yml)
要指定要加載的配置文件,請使用該--config.file標志。
./alertmanager --config.file=alertmanager.yml
# 全局配置項
global:
resolve_timeout: 5m #處理超時時間,默認為5min
smtp_smarthost: '
smtp.sina.com:25' # 郵箱smtp服務器代理
smtp_from: '******@
sina.com' # 發送郵箱名稱
smtp_auth_username: '******@
sina.com' # 郵箱名稱
smtp_auth_password: '******' #郵箱密碼
# 定義路由樹信息
route:
group_by: ['alertname'] # 報警分組名稱
group_wait: 10s # 最初即第一次等待多久時間發送一組警報的通知
group_interval: 10s # 在發送新警報前的等待時間
repeat_interval: 1m # 發送重復警報的周期
receiver: 'email' # 發送警報的接收者的名稱,以下receivers name的名稱
# 定義警報接收者信息
receivers:
- name: 'email' # 警報
email_configs: # 郵箱配置
- to: '******@
163.com' # 接收警報的email配置
# 一個inhibition規則是在與另一組匹配器匹配的警報存在的條件下,使匹配一組匹配器的警報失效的規則。兩個警報必須具有一組相同的標簽。
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance’]
檢查alertmanager配置文件
./amtool check-config alertmanager.yml
啟動alertmanager
./alertmanager --config.file=alertmanager.yml
訪問
http://127.0.0.1:9093,訪問Alertmanager UI界面,可以看到接收到ErrorRateHigh告警:
高可用性(HA)
Alertmanager的高可用性已在許多公司投入生產使用,並且默認情況下處於啟用狀態。
重要提示:Alertmanager 0.15及更高版本中都需要UDP和TCP,集群才能正常工作。
要創建Alertmanager的高可用性集群,需要將實例配置為彼此通信。使用--cluster.*標志進行配置 。
cluster.listen-address標志中選擇的端口是需要cluster.peer在其他對等方的標志中指定的端口。
節點:
/usr/bin/alertmanager
--cluster.listen-address="ip1:12001" # 當前節點ip和自定義的端口號
--log.level=debug
其他節點配置:
/usr/bin/alertmanager
--cluster.listen-address="ip2:12002" # 當前節點ip和自定義的端口號:
--cluster.peer=ip1:12001 # 選擇一個節點加入集群
--log.level=debug
要將您的Prometheus 1.4或更高版本的實例指向多個Alertmanager,請在您的prometheus.yml配置文件中對其進行配置,例如:
警告:
alertmanagers:
- static_configs:
- targets:
- alertmanager1:9093
- alertmanager2:9093
- alertmanager3:9093
重要信息:不要在Prometheus及其Alertmanagers之間負載均衡流量,而是將Prometheus指向所有Alertmanagers的列表。
Alertmanager實施期望將所有警報發送到所有Alertmanager,以確保高可用性。
.tmpl模板的配置
1)test.tmpl
{{ define "test.html" }}
<table border="1">
<tr>
<td>報警項</td>
<td>實例</td>
<td>報警閥值</td>
<td>開始時間</td>
</tr>
{{ range $i, $alert := .Alerts }}
<tr>
<td>{{ index $alert.Labels "alertname" }}</td>
<td>{{ index $alert.Labels "instance" }}</td>
<td>{{ index $alert.Annotations "value" }}</td>
<td>{{ $alert.StartsAt }}</td>
</tr>
{{ end }}
</table>
{{ end }}
注:上述Labels項,表示prometheus里面的可選label項。annotation項表示報警規則中定義的annotation項的內容。
demo:
配置alertmanager.yml:
global:
resolve_timeout: 5m
smtp_smarthost: '
smtp.sina.com:25'
smtp_from: 'xxxxx
@sina.com'
smtp_auth_username: 'xxxxx
@sina.com'
smtp_auth_password: 'xxxx' #客戶端授權碼 ok 密碼測過 不行
# 定義模板信息
templates:
- 'template/*.tmpl' # 路徑
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 10s
repeat_interval: 1h
receiver: 'mail'
receivers:
- name: 'web.hook'
webhook_configs:
- url: '
http://127.0.0.1:5001/'
- name: 'mail'
email_configs:
- to: '
xxxxx@163.com' #163郵箱
html: '{{ template "test.html" . }}' # 設定郵箱的內容模板
headers: { Subject: "[WARN] 報警郵件"} # 接收郵件的標題
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance’]
./amtool check-config alertmanager.yml
其中:
corp_id、agent_id、api_secret為微信企業號的配置;
to_user為企業號通訊錄人員;
報警再次發送時間為group_interval+repeat_interval,也就是先等待group_interval,再等待repeat_interval。