1. Prometheus告警簡介
告警能力在Prometheus的架構中被划分成兩個獨立的部分。如下所示,通過在Prometheus中定義AlertRule(告警規則),Prometheus會周期性的對告警規則進行計算,如果滿足告警觸發條件就會向Alertmanager發送告警信息。
在Prometheus中一條告警規則主要由以下幾部分組成:
- 告警名稱:用戶需要為告警規則命名,當然對於命名而言,需要能夠直接表達出該告警的主要內容
- 告警規則:告警規則實際上主要由PromQL進行定義,其實際意義是當表達式(PromQL)查詢結果持續多長時間(During)后出發告警
在Prometheus中,還可以通過Group(告警組)對一組相關的告警進行統一定義。當然這些定義都是通過YAML文件來統一管理的。
Alertmanager作為一個獨立的組件,負責接收並處理來自Prometheus Server(也可以是其它的客戶端程序)的告警信息。Alertmanager可以對這些告警信息進行進一步的處理,比如當接收到大量重復告警時能夠消除重復的告警信息,同時對告警信息進行分組並且路由到正確的通知方,Prometheus內置了對郵件,Slack等多種通知方式的支持,同時還支持與Webhook的集成,以支持更多定制化的場景。
例如,目前Alertmanager還不支持釘釘,那用戶完全可以通過Webhook與釘釘機器人進行集成,從而通過釘釘接收告警信息。同時AlertManager還提供了靜默和告警抑制機制來對告警通知行為進行優化。
Alertmanager特性
告警能力在Prometheus的架構中被划分成兩個獨立的部分。如下所示,通過在Prometheus中定義AlertRule(告警規則),Prometheus會周期性的對告警規則進行計算,如果滿足告警觸發條件就會向Alertmanager發送告警信息。
分組
分組機制可以將詳細的告警信息合並成一個通知。在某些情況下,比如由於系統宕機導致大量的告警被同時觸發,在這種情況下分組機制可以將這些被觸發的告警合並為一個告警通知,避免一次性接受大量的告警通知,而無法對問題進行快速定位。
例如,當集群中有數百個正在運行的服務實例,並且為每一個實例設置了告警規則。假如此時發生了網絡故障,可能導致大量的服務實例無法連接到數據庫,結果就會有數百個告警被發送到Alertmanager。
而作為用戶,可能只希望能夠在一個通知中中就能查看哪些服務實例收到影響。這時可以按照服務所在集群或者告警名稱對告警進行分組,而將這些告警內聚在一起成為一個通知。
告警分組,告警時間,以及告警的接受方式可以通過Alertmanager的配置文件進行配置。
抑制
抑制是指當某一告警發出后,可以停止重復發送由此告警引發的其它告警的機制。
例如,當集群不可訪問時觸發了一次告警,通過配置Alertmanager可以忽略與該集群有關的其它所有告警。這樣可以避免接收到大量與實際問題無關的告警通知。
抑制機制同樣通過Alertmanager的配置文件進行設置。
靜默
靜默提供了一個簡單的機制可以快速根據標簽對告警進行靜默處理。如果接收到的告警符合靜默的配置,Alertmanager則不會發送告警通知。
靜默設置需要在Alertmanager的Werb頁面上進行設置。
Prometheus中的告警規則允許你基於PromQL表達式定義告警觸發條件,Prometheus后端對這些觸發規則進行周期性計算,當滿足觸發條件后則會觸發告警通知。默認情況下,用戶可以通過Prometheus的Web界面查看這些告警規則以及告警的觸發狀態。當Promthues與Alertmanager關聯之后,可以將告警發送到外部服務如Alertmanager中並通過Alertmanager可以對這些告警進行進一步的處理。
一條典型的告警規則如下所示:
groups:
- name: example
rules:
- alert: HighErrorRate
expr: job:request_latency_seconds:mean5m{job="myjob"} > 0.5
for: 10m
labels:
severity: page
annotations:
summary: High request latency
description: description info
3. 安裝Alertmanager
cd /opt/ export VER="0.20.0" wget https://github.com/prometheus/alertmanager/releases/download/v${VER}/alertmanager-${VER}.linux-amd64.tar.gz groupadd prometheus useradd -g prometheus prometheus -d /opt/alertmanager tar -xvf alertmanager-${VER}.linux-amd64.tar.gz cd /opt/ mv alertmanager-${VER}.linux-amd64 /opt/alertmanager chown -R prometheus.prometheus /opt/prometheus
配置 Alertmanager
alertmanager 的 webhook 集成了釘釘報警,釘釘機器人對文件格式有嚴格要求,所以必須通過特定的格式轉換,才能發送給你釘釘的機器人。有人已經t貼心的為大家寫了轉換插件,那我們也就直接拿來用吧!
( https://github.com/timonwong/prometheus-webhook-dingtalk.git )
vim /opt/alertmanager/alertmanager.yml # 配置如下 global: resolve_timeout: 5m route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 1h receiver: 'ops_notify' routes: - receiver: ops_notify group_wait: 10s match_re: alertname: '實例存活告警|磁盤使用率告警' - receiver: info_notify group_wait: 10s match_re: alertname: '內存使用率告警|CPU使用率告警' receivers: - name: 'ops_notify' webhook_configs: - url: 'http://localhost:8060/dingtalk/ops_dingding/send' send_resolved: true - name: info_notify webhook_configs: - url: http://localhost:8060/dingtalk/info_dingding/send send_resolved: true inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']
啟動 Alertmanager
vim /usr/lib/systemd/system/alertmanager.service [Unit] Description=Prometheus: the alerting system Documentation=http://prometheus.io/docs/ After=prometheus.service [Service] ExecStart=/opt/alertmanager/alertmanager --config.file=/opt/alertmanager/alertmanager.yml Restart=always StartLimitInterval=0 RestartSec=10 [Install] WantedBy=multi-user.target
配置開機啟動
systemctl daemon-reload
systemctl enable alertmanager.service
systemctl stop alertmanager.service
systemctl restart alertmanager.service
systemctl status alertmanager.service
將釘釘接入 Prometheus AlertManager WebHook
如何獲取釘釘機器人, 參考文檔: https://jingyan.baidu.com/article/d3b74d640c50cc1f77e6092d.html
測試釘釘告警機器人:
curl -H "Content-Type: application/json" -d '{"msgtype":"text","text":{"content":"prometheu
s alert test"}}' 這里是你的釘釘機器人地址(如: https://oapi.dingtalk.com/robot/send?access_token=省略一串字符:-))
{"errcode":0,"errmsg":"ok"}
部署釘釘告警插件
cd /opt/ export VER="0.3.0" wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v${VER}/prometheus-webhook-dingtalk-${VER}.linux-amd64.tar.gz tar -zxf prometheus-webhook-dingtalk-${VER}.linux-amd64.tar.gz mv prometheus-webhook-dingtalk-${VER}.linux-amd64 /opt/alertmanager/prometheus-webhook-dingtalk #使用方法:prometheus-webhook-dingtalk --ding.profile=釘釘接收群組的值=webhook的值 vim /usr/lib/systemd/system/prometheus-webhook-dingtalk.service [Unit] Description=prometheus-webhook-dingtalk After=network-online.target [Service] Restart=on-failure ExecStart=/opt/alertmanager/prometheus-webhook-dingtalk/prometheus-webhook-dingtalk \ --ding.profile=ops_dingding=https://oapi.dingtalk.com/robot/send?access_token=省略一串字符 \ --ding.profile=info_dingding=https://oapi.dingtalk.com/robot/send?access_token=同樣省略了一串字符 [Install] WantedBy=multi-user.target
配置開機啟動
systemctl daemon-reload
systemctl enable prometheus-webhook-dingtalk
systemctl restart prometheus-webhook-dingtalk
systemctl status prometheus-webhook-dingtalk
4. 整合到prometheus
在prometheus主配置文件中添加/修改:
alerting:
alertmanagers:
- static_configs:
- targets:
- localhost:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
- "/opt/prometheus/rules/node_down.yml" # 實例存活報警規則文件
- "/opt/prometheus/rules/memory_over.yml" # 內存報警規則文件
- "/opt/prometheus/rules/disk_over.yml" # 磁盤報警規則文件
- "/opt/prometheus/rules/cpu_over.yml" # cpu報警規則文件
告警規則文件如下:
node_down.yml
groups:
- name: 實例存活告警規則
rules:
- alert: 實例存活告警
expr: up == 0
for: 1m
labels:
user: prometheus
severity: warning
annotations:
description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 1 minutes."
memory_over.yml
groups:
- name: 內存報警規則
rules:
- alert: 內存使用率告警
expr: (node_memory_MemTotal_bytes - (node_memory_MemFree_bytes+node_memory_Buffers_bytes+node_memory_Cached_bytes )) / node_memory_MemTotal_bytes * 100 > 80
for: 1m
labels:
user: prometheus
severity: warning
annotations:
description: "服務器: 內存使用超過80%!(當前值: {{ $value }}%)"
cpu_over.yml
groups:
- name: CPU報警規則
rules:
- alert: CPU使用率告警
expr: 100 - (avg by (instance)(irate(node_cpu_seconds_total{mode="idle"}[1m]) )) * 100 > 90
for: 1m
labels:
user: prometheus
severity: warning
annotations:
description: "服務器: CPU使用超過90%!(當前值: {{ $value }}%)"
說明: 以上文檔匆匆整理, 如有疑問, 請留言一起探討.