一、概述

二、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