Alertmanager 安裝與使用


一、概述

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 默認配置文件為 alertmanager.yml,在容器內路徑為 /etc/alertmanager/alertmanager.yml,默認配置如下:

global:
  resolve_timeout: 5m

route:
  group_by: ['alertname']
  group_wait: 10s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'web.hook'
receivers:
- name: 'web.hook'
  webhook_configs:
  - url: 'http://127.0.0.1:5001/'
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

簡單介紹一下主要配置的作用:

global: 全局配置,包括報警解決后的超時時間、SMTP 相關配置、各種渠道通知的 API 地址等等。
route: 用來設置報警的分發策略,它是一個樹狀結構,按照深度優先從左向右的順序進行匹配。
receivers: 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式。
inhibit_rules: 抑制規則配置,當存在與另一組匹配的警報(源)時,抑制規則將禁用與一組匹配的警報(目標)。

自定義郵件模板

AlertManager 支持自定義郵件模板配置的,創建數據目錄。

mkdir -p /data/alertmanager/template
mkdir -p /data/alertmanager/storage
chmod 777 -R /data/alertmanager/storage

 

新建一個模板文件 email.tmpl

vi /data/alertmanager/template/email.tmpl

內容如下:

{{ define "email.from" }}11111111@qq.com{{ end }}
{{ define "email.to" }}22222222@qq.com{{ end }}
{{ define "email.to.html" }}
{{ range .Alerts }}
=========start==========<br>
告警程序: prometheus_alert <br>
告警級別: {{ .Labels.severity }} 級 <br>
告警類型: {{ .Labels.alertname }} <br>
故障主機: {{ .Labels.instance }} <br>
告警主題: {{ .Annotations.summary }} <br>
告警詳情: {{ .Annotations.description }} <br>
觸發時間: {{ .StartsAt.Format "2019-08-04 16:58:15" }} <br>
=========end==========<br>
{{ end }}
{{ end }}

說明:

define 用來定義變量,配置3個變量,分別是:email.from、email.to、email.to.html ,可以在 alertmanager.yml 文件中直接配置引用。

這里 email.to.html 就是要發送的郵件內容,支持 Html 和 Text 格式。為了顯示好看,采用 Html 格式簡單顯示信息。

 

{{ range .Alerts }} 是個循環語法,用於循環獲取匹配的 Alerts 的信息,下邊的告警信息跟上邊默認郵件顯示信息一樣,只是提取了部分核心值來展示。

 

基於docker安裝

 

編輯配置文件,配置一下使用 Email 方式通知報警信息,這里以 QQ 郵箱為例,

vi /data/alertmanager/alertmanager.yml

內容如下:

# 全局配置項
global:
  resolve_timeout: 5m #超時,默認5min
  #郵箱smtp服務
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_from: '11111111@qq.com'
  smtp_auth_username: '11111111@qq.com'
  smtp_auth_password: '123456'
  smtp_require_tls: false

# 定義模板信息
templates:
  - 'template/*.tmpl'   # 路徑

# 路由
route:
  group_by: ['alertname'] # 報警分組依據
  group_wait: 10s #組等待時間
  group_interval: 10s # 發送前等待時間
  repeat_interval: 1h #重復周期
  receiver: 'mail' # 默認警報接收者

# 警報接收者
receivers:
- name: 'mail' #警報名稱
  email_configs:
  - to: '{{ template "email.to" . }}'  #接收警報的email
    html: '{{ template "email.to.html" . }}' # 模板
    send_resolved: true

# 告警抑制
inhibit_rules:
  - source_match:
      severity: 'critical'
    target_match:
      severity: 'warning'
    equal: ['alertname', 'dev', 'instance']

 

說明:

全局配置:

{{ template "email.from" . }} 意思是,從/data/alertmanager/template文件夾中,引入變量email.from

注意:smtp_require_tls: false,默認是true。一定要改成false才能發送郵件。

 

告警抑制:

抑制的功能其實就是根據label進行去重的操作,上面的配置就會把warning的去掉,告警發送的時候只轉發critical的。

下面的equal是合並的條件,其實就是label必須相同的才可以進行抑制。這個根據需求進行相同的選擇就行,一般情況alertname能滿足條件。

 

啟動服務

docker run -d \
  -p 9093:9093 \
  --name alertmanager \
  --restart=always \
  -v /data/alertmanager:/etc/alertmanager \
  -v /data/alertmanager/storage:/alertmanager \
  prom/alertmanager

 

訪問網頁

http://ip地址:9093

效果如下:

 

三、prometheus配置

配置文件

修改prometheus.yaml,我的prometheus是在docker中運行的

創建目錄

mkdir -p /data/prometheus/data
mkdir -p /data/prometheus/rules
chmod 777 -R /data/prometheus/data

啟動參數如下:

docker run -d \
  --restart=always \
  --name prometheus \
  -p 9090:9090 \
  -v /data/prometheus:/etc/prometheus \
  -v /data/prometheus/data:/prometheus \
  -e TZ=Asia/Shanghai \
  prom/prometheus

 

/data/prometheus目錄結構如下:

./
├── data
├── prometheus.yml
└── rules
    ├── memory_over.yml
    └── node_down.yml

其中data,就是prometheus數據文件。由於文件過多,這里就不展示了。

 

修改文件:/data/prometheus/prometheus.yml

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets:
      - 192.168.31.229:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - "rules/*.yml"

alerting 里面,指定Alertmanager 的地址。

rule_files 里面,指定了告警規則。

 

node_down.yml

groups:
- name: node-up
  rules:
  - alert: node-up
    expr: up{job="node-exporter"} == 0
    for: 15s
    labels:
      severity: 1
      team: node
    annotations:
      summary: "{{ $labels.instance }} 已停止運行!"
      description: "{{ $labels.instance }} 檢測到異常停止!請重點關注!!!"

 

memory_over.yml

groups:
- name: example
  rules:
  - alert: NodeMemoryUsage
    expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 80
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "{{$labels.instance}}: High Memory usage detected"
      description: "{{$labels.instance}}: Memory usage is above 80% (current value is:{{ $value }})"

 expr 是計算公式,(1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 表示獲取內存使用率。

在grafana中,就可以看到。

注意:去掉里面的 {instance=~"$node"}即可。

 

 重啟prometheus

docker restart prometheus

 

訪問告警頁面

http://ip地址:9090/alerts

效果如下:

 

點擊一下,就會顯示完整的配置

 

四、測試報警

這里直接修改 /data/prometheus/rules/memory_over.yml文件,告警閾值改為10

expr: (1 - (node_memory_MemAvailable_bytes / (node_memory_MemTotal_bytes))) * 100 > 10

 

 重啟prometheus

docker restart prometheus

 

等待1分鍾,會出現Pending

 

再等待一分鍾,會出現Firing

 

查看郵件

 

查看alertmanager日志

docker logs -f alertmanager

輸出如下:

level=info ts=2020-06-28T08:33:46.794Z caller=coordinator.go:131 component=configuration msg="Completed loading of configuration file" file=/etc/alertmanager/alertmanager.yml
level=info ts=2020-06-28T08:33:46.799Z caller=main.go:485 msg=Listening address=:9093
level=info ts=2020-06-28T08:33:48.774Z caller=cluster.go:648 component=cluster msg="gossip not settled" polls=0 before=0 now=1 elapsed=2.000472056s

如果沒有收到郵件,請確保上面的配置參數正確。查看alertmanager日志,是否有報錯信息。

 

 

本文參考鏈接:

https://www.cnblogs.com/gschain/p/11697200.html

https://blog.csdn.net/aixiaoyang168/article/details/98474494


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM