基於上一篇博客(https://blog.51cto.com/14320361/2461277 繼續進行部署
一、Prometheus & AlertManager 介紹
Prometheus 是一套開源的系統監控、報警、時間序列數據庫的組合,最初有 SoundCloud 開發的,後來隨着越來越多公司使用,於是便獨立成開源項目。Alertmanager 主要用於接收 Prometheus 發送的告警信息,它支持豐富的告警通知渠道,例如郵件、微信、釘釘、Slack 等常用溝通工具,而且很容易做到告警信息進行去重,降噪,分組等,是一款很好用的告警通知系統。
二、基本概念
Prometheus
官網(https://prometheus.io/)
是一套開源的監控和報警系統,也是一個時序數據庫。
架構圖
基本原理
Prometheus的基本原理是通過HTTP協議週期性抓取被監控組件的狀態,任意組件只要提供對應的HTTP接口就可以接入監控。不需要任何SDK或者其他的集成過程。這樣做非常適合做虛擬化環境監控系統,比如VM、Docker、Kubernetes等。輸出被監控組件信息的HTTP接口被叫做exporter 。目前互聯網公司常用的組件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系統信息(包括磁盤、內存、CPU、網絡等等)。
服務過程
- Prometheus Daemon負責定時去目標上抓取metrics(指標)數據,每個抓取目標需要暴露一個http服務的接口給它定時抓取。Prometheus支持通過配置文件、文本文件、Zookeeper、Consul、DNS SRV Lookup等方式指定抓取目標。Prometheus採用PULL的方式進行監控,即服務器可以直接通過目標PULL數據或者間接地通過中間網關來Push數據。
2.Prometheus在本地存儲抓取的所有數據,並通過一定規則進行清理和整理數據,並把得到的結果存儲到新的時間序列中。
3.Prometheus通過PromQL和其他API可視化地展示收集的數據。Prometheus支持很多方式的圖表可視化,例如Grafana、自帶的Promdash以及自身提供的模版引擎等等。Prometheus還提供HTTP API的查詢方式,自定義所需要的輸出。
4.PushGateway支持Client主動推送metrics到PushGateway,而Prometheus只是定時去Gateway上抓取數據。- Alertmanager是獨立於Prometheus的一個組件,可以支持Prometheus的查詢語句,提供十分靈活的報警方式。
工作流程
通過exporters從數據源主動拉取數據(metrics),保存到時序數據庫(TSDB)中,可以通過HTTP Server訪問,同時可以發起報警,對於數據庫中的時序數據,提供PromeQL進行查詢,提供給web UI或者可視化系統Grafana等展示。
Grafana
官網(https://grafana.com/)
開源的數據分析和監控平臺
有不同的dashboards支持不同類型的數據可視化
Exporters
數據採集
Prometheus從不同的exorters中拉取數據,有不同的exporter支持不同的數據源
node-exporter 支持機器基本的數據 比如cpu mem 網絡 等
三、實驗環境
docker01 | docker02 | docker03 |
---|---|---|
192.168.1.11 | 192.168.1.13 | 192.168.1.20 |
NodeEXporter | NodeEXporter | NodeEXporter |
cAdvisor | cAdvisor | cAdvisor |
Prometheus Server | 空 | 空 |
Grafana | 空 | 空 |
全部關閉防火牆,禁用selinux
四、設置prometheus監控報警
接下來,我們需要啓動 AlertManager 來接受 Prometheus 發送過來的報警信息,並執行各種方式的告警。同樣以 Docker 方式啓動 AlertManager,最簡單的啓動命令如下:
$ docker run --name alertmanager -d -p 9093:9093 prom/alertmanager:latest
這裏 AlertManager 默認啓動的端口爲 9093,啓動完成後,瀏覽器訪問 http://<IP>:9093 可以看到默認提供的 UI 頁面,不過現在是沒有任何告警信息的,因爲我們還沒有配置報警規則來觸發報警。
配置AlertManager
AlertManager:用來接收prometheus發送來的報警信息,並且執行設置好的報警方式、報警內容。
下載鏡像
[root@docker01 ~]# docker pull alertmanager
//下載alertmanager鏡像
基於alertmanager運行一臺容器
[root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 prom/alertmanager:latest
配置路由轉發
[root@docker01 ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf
[root@docker01 ~]# sysctl -p
在部署alertmanager之前,我們需要對它的配置文件進行修改,所以我們先運行一個容器,先將其配置文件拷貝出來。
[root@docker01 ~]# docker cp alertmanager:/etc/alertmanager/alertmanager.yml ./
//拷貝alertmanager的配置文件到本地
修改alertmanager的配置文件
配置文件簡單介紹
AlertManager:用來接收Prometheus發送的報警信息,並且執行設置好的報警方式,報警內容。
AlertManager.yml配置文件:
global:全局配置,包括報警解決後的超時時間、SMTP相關配置、各種渠道通知的API地址等消息。
route:用來設置報警的分發策略。
receivers:配置報警信息接收者信息。
inhibit_rules:抑制規則配置,當存在與另一個匹配的報警時,抑制規則將禁用用於有匹配的警報。
修改配置文件
[root@docker01 ~]# vim alertmanager.yml
//修改alertmanager配置文件
global:
resolve_timeout: 5m
smtp_from: '[email protected]' #自己郵箱地址
smtp_smarthost: 'smtp.qq.com:465' #qq的郵箱地址及端口
smtp_auth_username: '[email protected]'
smtp_auth_password: 'osjppnjkbuhcdfff' #需要在qq郵箱獲取授權碼
smtp_require_tls: false
smtp_hello: 'qq.com'
route:
group_by: ['alertname']
group_wait: 5s
group_interval: 5s
repeat_interval: 5m
receiver: 'email' #接收者改爲郵箱
receivers:
- name: 'email'
email_configs:
- to: '[email protected]'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
以上配置我反覆試驗後,發現不同的環境參數配置也不一樣,調試期間出現了各種報錯問題,將其中幾個關鍵的配置說明一下:
1.smtp_smarthost: 這裏爲 QQ 郵箱 SMTP 服務地址,官方地址爲 smtp.qq.com 端口爲 465 或 587,同時要設置開啓 POP3/SMTP 服務。
- smtp_auth_password: 這裏爲第三方登錄 QQ 郵箱的授權碼,非 QQ 賬戶登錄密碼,否則會報錯,獲取方式在 QQ 郵箱服務端設置開啓 POP3/SMTP 服務時會提示。
3.smtp_require_tls: 是否使用 tls,根據環境不同,來選擇開啓和關閉。如果提示報錯 email.loginAuth failed: 530 Must issue a STARTTLS command first,那麼就需要設置爲 true。着重說明一下,如果開啓了 tls,提示報錯 starttls failed: x509: certificate signed by unknown authority,需要在 email_configs 下配置 insecure_skip_verify: true 來跳過 tls 驗證。
重新運行 alertmanager 容器
[root@docker01 ~]# docker rm -f alertmanager
//刪除alertmanager容器
[root@docker01 ~]# docker run -d --name alertmanager -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml -p 9093:9093 prom/alertmanager:latest
//運行一臺新的alertmanager容器,記得掛載配置文件
Prometheus配置和alertmanager報警規則
創建存放規則的目錄
[root@docker01 ~]# mkdir -p prometheus/rules
//創建規則目錄
[root@docker01 ~]# cd prometheus/rules/
編寫規則
[root@docker01 rules]# vim node-up.rules
groups:
- name: node-up
rules:
- alert: node-up
expr: up{job="prometheus"} == 0 #{job="prometheus"}中的prometheus需要和prometheus配置文件23行的相同
for: 15s
labels:
severity: 1
team: node
annotations:
summary: "{{ $labels.instance }} 已停止運行超過 15s!"
說明一下:該 rules 目的是監測 node 是否存活,expr 爲 PromQL 表達式驗證特定節點 job="node-exporter" 是否活着,for 表示報警狀態爲 Pending 後等待 15s 變成 Firing 狀態,一旦變成 Firing 狀態則將報警發送到 AlertManager,labels 和 annotations 對該 alert 添加更多的標識說明信息,所有添加的標籤註解信息,以及 prometheus.yml 中該 job 已添加 label 都會自動添加到郵件內容中,更多關於 rule 詳細配置可以參考 這裏。
修改 prometheus配置文件
[root@docker01 ~]# vim prometheus.yml
# Alertmanager configuration #7
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.1.11:9093 #去註釋修改
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'. #14行
rule_files:
- "/usr/local/prometheus/rules/*.rules" #添加(這個路徑是prometheus容器內的路徑)
注意: 這裏 rulefiles 爲容器內路徑,需要將本地 node-up.rules 文件掛載到容器內指定路徑,修改 Prometheus 啓動命令如下,並重啓服務。
重新運行prometheus 容器
[root@docker01 ~]# docker rm -f prometheus
//刪除prometheus容器
[root@docker01 ~]# docker run -d -p 9090:9090 --name prometheus --net=host -v /root/prometheus.yml:/etc/prometheus/prometheus.yml -v /root/prometheus/rules/node-up.rules:/usr/local/prometheus/rules/node-up.rules prom/prometheus
//運行一臺新的alertmanager容器,記得掛載規則文件
瀏覽器驗證一下http://192.168.1.11:9090/rules
這裏說明一下 Prometheus Alert 告警狀態有三種狀態:Inactive、Pending、Firing。
Inactive:非活動狀態,表示正在監控,但是還未有任何警報觸發。
Pending:表示這個警報必須被觸發。由於警報可以被分組、壓抑/抑制或靜默/靜音,所以等待驗證,一旦所有的驗證都通過,則將轉到 Firing 狀態。
Firing:將警報發送到 AlertManager,它將按照配置將警報的發送給所有接收者。一旦警報解除,則將狀態轉到 Inactive,如此循環。
掛起docker02
會收到郵件
這裏有幾個地方需要解釋一下:
每次停止/恢復服務後,15s 之後纔會發現 Alert 狀態變化,是因爲 prometheus.yml中 global -> scrape_interval: 15s 配置決定的,如果覺得等待 15s 時間太長,可以修改小一些,可以全局修改,也可以局部修改。例如局部修改 node-exporter 等待時間爲 5s。
... - job_name: 'node-exporter' scrape_interval: 5s file_sd_configs: - files: ['/usr/local/prometheus/groups/nodegroups/*.json']Alert 狀態變化時會等待 15s 才發生改變,是因爲 node-up.rules 中配置了 for: 15s 狀態變化等待時間。
- 報警觸發後,每隔 5m 會自動發送報警郵件(服務未恢復正常期間),是因爲 alertmanager.yml 中 route -> repeat_interval: 5m 配置決定的。
五、AlertManager自定義郵件模板
創建模板目錄
[root@docker01 ~]# cd prometheus
//進入之前創建的prometheus目錄
[root@docker01 prometheus]# mkdir alertmanager-tmpl
//創建AlertManager模板目錄
看到上邊默認發送的郵件模板,雖然所有核心的信息已經包含了,但是郵件格式內容可以更優雅直觀一些,那麼,AlertManager 也是支持自定義郵件模板配置的,首先新建一個模板文件
編寫模板規則
[root@docker01 prometheus]# vim email.tmpl
{{ define "email.from" }}[email protected]{{ end }}
{{ define "email.to" }}[email protected]{{ end }}
{{ define "email.to.html" }}
{{ range .Alerts }}
=========start==========<br>
告警程序: prometheus_alert<br>
告警級別: {{ .Labels.severity }} 級<br>
告警類型: {{ .Labels.alertname }}<br>
故障主機: {{ .Labels.instance }}<br>
告警主題: {{ .Annotations.summary }}<br>
觸發時間: {{ .StartsAt.Format "2019-08-04 16:58:15" }} <br>
=========end==========<br>
{{ end }}
{{ end }}
簡單說明一下,上邊模板文件配置了 email.from、email.to、email.to.html 三種模板變量,可以在 alertmanager.yml 文件中直接配置引用。這裏 email.to.html 就是要發送的郵件內容,支持 Html 和 Text 格式,這裏爲了顯示好看,採用 Html 格式簡單顯示信息。下邊 {{ range .Alerts }} 是個循環語法,用於循環獲取匹配的 Alerts 的信息,下邊的告警信息跟上邊默認郵件顯示信息一樣,只是提取了部分核心值來展示。然後,需要增加 alertmanager.yml 文件 templates 配置如下:
修改alertmanager的配置文件
[root@docker01 ~]# vim alertmanager.yml
global:
resolve_timeout: 5m
smtp_from: '[email protected]'
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: '[email protected]'
smtp_auth_password: 'evjmqipqezlbdfij'
smtp_require_tls: false
smtp_hello: 'qq.com'
templates: #添加模板
- '/etc/alertmanager-tmpl/*.tmpl' #添加路徑
route:
group_by: ['alertname']
group_wait: 5s
group_interval: 5s
repeat_interval: 5m
receiver: 'email'
receivers:
- name: 'email'
email_configs:
- to: '{{ template "email to" }}' #修改
html: '{{ template "email.to.html" .}}' #添加
send_resolved: true #刪除
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
重新運行 alertmanager 容器
[root@docker01 ~]# docker rm -f alertmanager
//刪除alertmanager容器
[root@docker01 ~]# docker run -itd --name alertmanager -p 9093:9093 -v /root/alertmanager.yml:/etc/alertmanager/alertmanager.yml -v /root/prometheus/alertmanager-tmpl:/etc/alertmanager-tmpl prom/alertmanager:latest
//運行一臺新的alertmanager容器,記得掛載配置文件
掛起docker02
收到郵件
當然我們還可以配置郵件標題,這裏就不在演示了,詳細配置可參考 這裏。這裏除了監控節點是否存活外,還可以監控很多很多指標,例如 CPU 負載告警、Mem 使用量告警、Disk 存儲空間告警、Network 負載告警等等,這些都可以通過自定義 PromQL 表達式驗證值來定義一些列的告警規則,來豐富日常工作中需要的各種告警。
這裏,我們只演示瞭如何通過 AlertManager 來配置發送郵件告警,其他的告警方式,可以參考 官網文檔 來配置,這裏就不再演示了。下一篇,我們繼續通過 Prometheus 來監控 SpringBoot 工程應用程序 JVM 情況,以及自定義 metrics 來實現特定功能的監控。