二、prometheus之Alertmanager告警
一、Alertmanager簡介
Prometheus是一個劃分平臺,metrics的收集和儲存與警報是分開的,警報是由Alertmanager負責,這是監控環境的獨立部分。警報的規則是在Prometheus server上進行定義的,這些規則可以觸發時間,然後將其傳到alertmanager,alertmanager隨後決定如何處理各自的警報,處理複製之類的問題,並決定在傳送警報時使用什麼機制:實時訊息、電子郵件或者是其他釘釘、微信等工具。
報警設定:
prometheus --> 觸發閾值 --> 超出持續時間 --> alertmanager --> 分組|抑制|靜默 --> 媒介型別 --> 郵件|釘釘|微信等 分組(group):將類似性質的告警合併為單個通知,比如網路通知、主機通知、服務通知。 靜默(silences):是一種簡單的特定時間靜默的機制,例如:伺服器要升級維護可以先設定這個時間段告警靜默 抑制(inhibition):當告警發出後,停止重複傳送由此告警引發的其他告警即合併一個故障引起多個報警時間,可以消除冗餘告警
二、Alertmanager部署
# 解包 root@prometheus:~# tar xf alertmanager-0.23.0.linux-amd64.tar.gz -C /usr/local/ root@prometheus:~# cd /usr/local/ root@prometheus:/usr/local# ls alertmanager-0.23.0.linux-amd64 bin etc games include lib man prometheus prometheus-2.32.1.linux-amd64 sbin share src root@prometheus:/usr/local# ln -sv alertmanager-0.23.0.linux-amd64/ alertmanager 'alertmanager' -> 'alertmanager-0.23.0.linux-amd64/' root@prometheus:/usr/local# # service 啟動檔案 root@prometheus:/usr/local# cat > /etc/systemd/system/alertmanager.service << EOF > [Unit] > Description=Prometheus Server > Documentation=https://prometheus.io/docs/introduction/overview/ > After=network.target > > [Service] > Restart=on-failure > WorkingDirectory=/usr/local/alertmanager > ExecStart=/usr/local/alertmanager/alertmanager > > [Install] > WantedBy=multi-user.target > EOF root@prometheus:/usr/local# # 啟動 root@prometheus:/usr/local# systemctl daemon-reload root@prometheus:/usr/local# systemctl start alertmanager.service root@prometheus:/usr/local# netstat -tnlp | grep 9093 tcp6 0 0 :::9093 :::* LISTEN 45186/alertmanager root@prometheus:/usr/local#
測試訪問
三、Alertmanager告警配置
Alertmanager的配置有兩個地方,一個是在Prometheus server端進行配置告警節點,指定匹配告警規則檔案路徑,以及監控alertmanager本身。另一個直接配置alertmanager自身的配置,在alertmanager.yml進行配置。
root@prometheus:/usr/local/prometheus# vim /usr/local/prometheus/prometheus.yml global: scrape_interval: 15s evaluation_interval: 15s # Alertmanager configuration alerting: alertmanagers: - static_configs: - targets: - 192.168.88.200:9093 rule_files: - "rules/*_rules.yml" # - "second_rules.yml" scrape_configs: - job_name: "prometheus" static_configs: - targets: ["localhost:9090"] - job_name: "alertmanager" static_configs: - targets: ["192.168.88.200:9093"]
prometheus web端可以看到alertmanager 端點
配置完成prometheus.yml後,再來看看預設的alertmanager.yml的介紹,如下:
[root@prometheus alertmanager]# cat alertmanager.yml global: resolve_timeout: 5m #處理超時時間,預設為5min route: group_by: ['alertname'] # 報警分組依據 group_wait: 10s # 最初即第一次等待多久時間傳送一組警報的通知 group_interval: 10s # 在傳送新警報前的等待時間 repeat_interval: 1h # 傳送重複警報的週期 對於email配置中,此項不可以設定過低,否則將會由於郵件傳送太多頻繁,被smtp伺服器拒絕 receiver: 'web.hook' # 傳送警報的接收者的名稱,以下receivers name的名稱 receivers: - name: 'web.hook' # 警報 webhook_configs: # webhook配置 - url: 'http://192.168.0.143:5001/' inhibit_rules: # 一個inhibition規則是在與另一組匹配器匹配的警報存在的條件下,使匹配一組匹配器的警報失效的規則。兩個警報必須具有一組相同的標籤。 - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']
-
global: 全域性配置,包括報警解決後的超時時間、SMTP 相關配置、各種渠道通知的 API 地址等等。
-
route: 用來設定報警的分發策略,它是一個樹狀結構,按照深度優先從左向右的順序進行匹配。
-
receivers: 配置告警訊息接受者資訊,例如常用的 email、wechat、slack、webhook 等訊息通知方式。
-
inhibit_rules: 抑制規則配置,當存在與另一組匹配的警報(源)時,抑制規則將禁用與一組匹配的警報(目標)。
四、自定義告警規則和傳送
在prometheus.yml中建立規則檔案,進行監控node02主機的node_exporter是否存活,併發送告警資訊如下:
[root@prometheus prometheus]# pwd /usr/local/prometheus [root@prometheus prometheus]# mkdir rules [root@prometheus rules]# vim node_rules.yml groups: - name: node-up # 分組名稱 rules: # 規則設定 - alert: node-up #告警名稱 expr: up{instance="192.168.88.201:9100"} == 0 # 表示式,查詢式語句查詢up的值是否等於0,如果等於則告警 for: 15s # 告警持續時間 labels: severity: 1 team: node annotations: # 註解 summary: "{{ $labels.instance }} 已停止執行超過 15s!" [root@prometheus rules]# systemctl restart prometheus
設定prometheus.yml中的rules後,再配置alertmanager的告警相關資訊,如下:
[root@prometheus alertmanager]# pwd /usr/local/alertmanager [root@prometheus alertmanager]# vim alertmanager.yml global: resolve_timeout: 5m smtp_smarthost: 'smtp.163.com:465' smtp_from: '[email protected]' smtp_auth_username: '[email protected]' smtp_auth_password: 'xxxxxxxxx' # 16位qq郵箱授權碼作為密碼 smtp_require_tls: false route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 1h receiver: 'email' # 選用郵箱告警傳送 receivers: - name: 'email' email_configs: - to: '[email protected]' inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance']
配置完成後,測試一下是否可以正常出現告警資訊和郵件的成功傳送。
[root@node1 ~]# systemctl stop node_exporter
停止node1的exporter後,可以在prometheus server的web介面上可以看到告警:http://<ip>:9090/alerts,如圖:
1)inactive:表示當前報警資訊即不是firing狀態也不是pending狀態
2)pending:表示在設定的閾值時間範圍內被啟用的
3)firing:表示超過設定的閾值時間被啟用的
當狀態變成了firing的時候,我們的163郵箱就會收到響應的告警郵件
五、自定義告警模板
上面已經實現了告警規則觸發,告警郵件的傳送,但是官方的告警模板實在吝嗇難懂,為此,我們也可以進行自定義告警模板,實現最直觀的告警資訊。在alertmanager目錄下建立template目錄,增加郵件模板,然後修改alertmanager的配置。
# 建立模板檔案 [root@prometheus alertmanager]# mkdir template [root@prometheus template]# vim email.tmpl {{ define "email.html" }} {{ range .Alerts }} <pre> ========start========== 告警程式: prometheus_alert 告警級別: {{ .Labels.severity }} 告警型別: {{ .Labels.alertname }} 故障主機: {{ .Labels.instance }} 告警主題: {{ .Annotations.summary }} 告警詳情: {{ .Annotations.description }} 觸發時間: {{ .StartsAt.Format "2019-12-14 16:01:01" }} ========end========== </pre> {{ end }} {{ end }} # 修改alertmanager.yml配置 [root@prometheus alertmanager]# cat alertmanager.yml global: resolve_timeout: 5m smtp_smarthost: 'smtp.163.com:465' smtp_from: '[email protected]' smtp_auth_username: '[email protected]' smtp_auth_password: 'administrator2!' smtp_require_tls: false templates: # 指定郵件模板的路徑,可以使用相對路徑,template/*.tmpl的方式 - '/usr/local/alertmanager/template/email.tmpl' route: group_by: ['alertname'] group_wait: 10s group_interval: 10s repeat_interval: 1h receiver: 'email' # 選用郵箱告警傳送 receivers: - name: 'email' email_configs: - to: '[email protected]' html: '{{ template "email.html" . }}' # 指定使用模板,如果不指定,還是會載入預設的模板的 headers: { Subject: "[WARN]Prometheus告警郵件" } # 配置郵件主題 inhibit_rules: - source_match: severity: 'critical' target_match: severity: 'warning' equal: ['alertname', 'dev', 'instance'] # 重啟alertmanager root@prometheus template]# systemctl restart alertmanager # 測試故障告警 [root@node1 ~]# systemctl stop node_exporter
經過一小段時間後,郵箱會收到告警郵件,是不是好看多了,如圖: