Prometheus 监控报警系统 AlertManager 之邮件告警
文章目錄
- 1、Prometheus & AlertManager 介紹
- 2、環(huán)境、軟件準(zhǔn)備
- 3、啟動(dòng)并配置 Prometheus
- 3.1、Docker 啟動(dòng) Prometheus
- 3.2、Docker 啟動(dòng) node-exporter
- 3.3、Prometheus 配置 node-exproter
- 4、啟動(dòng)并配置 AlertManager
- 4.1、AlertManager 配置郵件告警
- 4.2、Prometheus 配置 AlertManager 告警規(guī)則
- 4.3、觸發(fā)報(bào)警發(fā)送 Email
- 4.4、AlertManager 配置自定義郵件模板
1、Prometheus & AlertManager 介紹
Prometheus 是一套開源的系統(tǒng)監(jiān)控、報(bào)警、時(shí)間序列數(shù)據(jù)庫(kù)的組合,最初有 SoundCloud 開發(fā)的,后來隨著越來越多公司使用,于是便獨(dú)立成開源項(xiàng)目。Alertmanager 主要用于接收 Prometheus 發(fā)送的告警信息,它支持豐富的告警通知渠道,例如郵件、微信、釘釘、Slack 等常用溝通工具,而且很容易做到告警信息進(jìn)行去重,降噪,分組等,是一款很好用的告警通知系統(tǒng)。
2、環(huán)境、軟件準(zhǔn)備
本次演示環(huán)境,我是在本機(jī) MAC OS 上操作,以下是安裝的軟件及版本:
- Docker: 18.06.3-ce
- Oracle VirtualBox: 6.0.8 r130520 (Qt5.6.3)
- Linux: 7.6.1810
- Prometheus: v2.11.1
- Alertmanager: v0.18.0
- Node-Exporter: v0.18.1
注意:這里為了快速方便啟動(dòng) Prometheus、Alertmanager、Node-Exporter 服務(wù),我使用 Docker 方式啟動(dòng),所以本機(jī)需要安裝好 Docker 環(huán)境,這里忽略 Docker 的安裝過程,著重介紹一下如何啟動(dòng)并配置 Prometheus 監(jiān)控報(bào)警系統(tǒng) 集成 AlertManager,并配置 Email 發(fā)送告警信息。
3、啟動(dòng)并配置 Prometheus
3.1、Docker 啟動(dòng) Prometheus
啟動(dòng) Prometheus 很簡(jiǎn)單,這里為了方便,我采用 Docker 方式啟動(dòng),最簡(jiǎn)單的啟動(dòng)命令如下:
$ docker run --name prometheus -d -p 9090:9090 prom/prometheus:latest這里默認(rèn) Prometheus 開放 9090 端口,我們使用最新版官方鏡像,當(dāng)前最新版本為 v2.11.1,啟動(dòng)完成后,瀏覽器訪問 http://<IP>:9090 即可看到默認(rèn) UI 頁面。
Prometheus 默認(rèn)配置文件 prometheus.yml 在容器內(nèi)路徑為 /etc/prometheus/prometheus.yml,我們可以進(jìn)入到容器內(nèi)查看一下。
從默認(rèn)配置可以看到 Alertmanager 配置、rule 報(bào)警規(guī)則、監(jiān)聽目標(biāo)端點(diǎn)配置等,每一項(xiàng)的配置我就不一一解釋了,下邊具體使用中,會(huì)分別講到。現(xiàn)在 Prometheus 已經(jīng)啟動(dòng)起來了,我們需要啟動(dòng)一個(gè) exporter 來供 Prometheus 監(jiān)控獲取指標(biāo)值,這里以一個(gè)常用的 node-exproter 為例,它是最基本的節(jié)點(diǎn)監(jiān)控客戶端,負(fù)責(zé)監(jiān)控機(jī)器的各個(gè)指標(biāo),包括節(jié)點(diǎn)存活、CPU、Mem、Network、IO 等等,方便后邊演示 Alertmanager 報(bào)警時(shí)的觸發(fā)條件,例如配置節(jié)點(diǎn)存活檢測(cè),當(dāng)機(jī)器 Down 時(shí),觸發(fā)報(bào)警控制,那么就可以通過停止 node-exporter 來模擬實(shí)現(xiàn)了。
3.2、Docker 啟動(dòng) node-exporter
同樣采用 Docker 方式啟動(dòng) node-exporter 服務(wù),最簡(jiǎn)單的啟動(dòng)命令如下:
$ docker run --name node-exporter -d -p 9100:9100 prom/node-exporter:latest這里 node-exporter 默認(rèn)啟動(dòng)端口為 9100,當(dāng)前鏡像最新版本為 v0.18.0。啟動(dòng)完成后,瀏覽器訪問 http://<IP>:9100/metrics 可以看到提供的監(jiān)控指標(biāo)項(xiàng)列表了。
3.3、Prometheus 配置 node-exproter
接下來,我們需要將 node-exporter 信息配置到 Prometheus 中,來讓 Prometheus 定期獲取 exporter 采集的信息,那么就需要修改 prometheus.yml 配置文件,在 scrape_configs 下新增一個(gè) job,配置如下:
$ mkdir -p /root/prometheus && cd /root/prometheus $ vim prometheus.yml global:scrape_interval: 15s evaluation_interval: 15s # scrape_timeout is set to the global default (10s).# Alertmanager configuration alerting:alertmanagers:- static_configs:- targets:# - alertmanager:9093# Load rules once and periodically evaluate them according to the global 'evaluation_interval'. rule_files:# - "first_rules.yml"# - "second_rules.yml"scrape_configs:- job_name: 'prometheus'static_configs:- targets: ['192.168.1.124:9090']labels:instance: prometheusservice: prometheus-service- job_name: 'node-exporter'static_configs:- targets: ['192.168.1.124:9100'] labels: instance: vm-192.168.1.124service: node-service注意:這里新增一個(gè)名稱為 node-exporter 的 job 配置,target 就是上邊 node-exporter 請(qǐng)求地址,默認(rèn) http 方式,請(qǐng)求地址后綴默認(rèn)為 /metric,如果不是該地址,那么就需要配置 metrics_path: <path>。同時(shí)我為每個(gè) job 新增了 label 標(biāo)簽配置,這個(gè)是很有必要的,通過配置不同的 label 來附加一些必要的信息,在后邊 Alertmanager 告警郵件中和 Grafana Dashboard 展示中,都是很重要的區(qū)分表示。配置完畢,需要將新的配置文件覆蓋容器內(nèi)配置文件,并重啟 Prometheus 來使配置生效。
$ docker run -d--name prometheus -p 9090:9090 -v /root/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml prom/prometheus:latest這里通過掛載的方式將外部配置文件覆蓋容器內(nèi)配置,重啟 prometheus 服務(wù),瀏覽器訪問 http://192.168.1.124:9090/targets 可以看到新增加的 target,并且是 healthy 狀態(tài)。
不過,有沒有發(fā)現(xiàn)默認(rèn)使用 static_configs 靜態(tài)配置方式,雖然可以正確配置,但是每次配置都需要重啟 Prometheus 服務(wù),當(dāng)我們需要分批次添加很多 Node 時(shí),頻繁重啟服務(wù)就會(huì)造成監(jiān)控的多次中斷,這太不友好了。當(dāng)然 Prometheus 也提供了多種服務(wù)發(fā)現(xiàn)方式。
- azure_sd_configs
- consul_sd_configs
- dns_sd_configs
- ec2_sd_configs
- openstack_sd_configs
- file_sd_configs
- kubernetes_sd_configs
- marathon_sd_configs
- nerve_sd_configs
- serverset_sd_configs
- triton_sd_configs
更多詳細(xì)配置可查看 這里,這里我們可以采用 file_sd_configs 方式,將 targets 以 Json 或 Yaml 方式寫入特定文件中,那么只要文件發(fā)生變化,Prometheus 就會(huì)自動(dòng)加載,是不是很方便啦!
$ midir -p /root/prometheus/groups/nodegroups && cd /root/prometheus/groups/nodegroups $ vim node.json [{"targets": ["192.168.1.124:9100"],"labels": {"instance": "vm-192.168.1.124","service": "node-service"}} ]新建一個(gè) node.json 文件,將 prometheus.yml 中 job_name: 'node-exporter' 下的信息以 Json 方式配置到該文件中,然后修改 prometheus.yml 加載方式為 file_sd_configs,配置修改如下:
...- job_name: 'node-exporter'file_sd_configs:- files: ['/usr/local/prometheus/groups/nodegroups/*.json']注意:這里我們指定加載容器內(nèi)目錄配置文件,那么需要將本地 node.json 文件掛載到容器內(nèi)指定目錄上,修改 Prometheus 啟動(dòng)命令如下:
$ docker run -d--name prometheus-p 9090:9090 -v /root/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /root/prometheus/groups/:/usr/local/prometheus/groups/ prom/ prometheus:latest啟動(dòng)成功,以后在添加或修改 Node 相關(guān)的 exproter,就可以直接在該 Json 文件中更新即可,不需要重啟 Prometheus 服務(wù),更多關(guān)于 Prometheus 配置可以參考 官網(wǎng)文檔。
4、啟動(dòng)并配置 AlertManager
接下來,我們需要啟動(dòng) AlertManager 來接受 Prometheus 發(fā)送過來的報(bào)警信息,并執(zhí)行各種方式的告警。同樣以 Docker 方式啟動(dòng) AlertManager,最簡(jiǎn)單的啟動(dòng)命令如下:
$ docker run --name alertmanager -d -p 9093:9093 prom/alertmanager:latest這里 AlertManager 默認(rèn)啟動(dòng)的端口為 9093,啟動(dòng)完成后,瀏覽器訪問 http://<IP>:9093 可以看到默認(rèn)提供的 UI 頁面,不過現(xiàn)在是沒有任何告警信息的,因?yàn)槲覀冞€沒有配置報(bào)警規(guī)則來觸發(fā)報(bào)警。
4.1、AlertManager 配置郵件告警
AlertManager 默認(rèn)配置文件為 alertmanager.yml,在容器內(nèi)路徑為 /etc/alertmanager/alertmanager.yml,默認(rèn)配置如下:
global:resolve_timeout: 5mroute:group_by: ['alertname']group_wait: 10sgroup_interval: 10srepeat_interval: 1hreceiver: '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']簡(jiǎn)單介紹一下主要配置的作用:
- global: 全局配置,包括報(bào)警解決后的超時(shí)時(shí)間、SMTP 相關(guān)配置、各種渠道通知的 API 地址等等。
- route: 用來設(shè)置報(bào)警的分發(fā)策略,它是一個(gè)樹狀結(jié)構(gòu),按照深度優(yōu)先從左向右的順序進(jìn)行匹配。
- receivers: 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式。
- inhibit_rules: 抑制規(guī)則配置,當(dāng)存在與另一組匹配的警報(bào)(源)時(shí),抑制規(guī)則將禁用與一組匹配的警報(bào)(目標(biāo))。
那么,我們就來配置一下使用 Email 方式通知報(bào)警信息,這里以 QQ 郵箱為例,配置如下:
global:resolve_timeout: 5msmtp_from: 'xxxxxxxx@qq.com'smtp_smarthost: 'smtp.qq.com:465'smtp_auth_username: 'xxxxxxxx@qq.com'smtp_auth_password: 'xxxxxxxxxxxxxxx'smtp_require_tls: falsesmtp_hello: 'qq.com' route:group_by: ['alertname']group_wait: 5sgroup_interval: 5srepeat_interval: 5mreceiver: 'email' receivers: - name: 'email'email_configs:- to: 'xxxxxxxx@qq.com'send_resolved: true inhibit_rules:- source_match:severity: 'critical'target_match:severity: 'warning'equal: ['alertname', 'dev', 'instance']以上配置我反復(fù)試驗(yàn)后,發(fā)現(xiàn)不同的環(huán)境參數(shù)配置也不一樣,調(diào)試期間出現(xiàn)了各種報(bào)錯(cuò)問題,將其中幾個(gè)關(guān)鍵的配置說明一下:
- smtp_smarthost: 這里為 QQ 郵箱 SMTP 服務(wù)地址,官方地址為 smtp.qq.com 端口為 465 或 587,同時(shí)要設(shè)置開啟 POP3/SMTP 服務(wù)。
- smtp_auth_password: 這里為第三方登錄 QQ 郵箱的授權(quán)碼,非 QQ 賬戶登錄密碼,否則會(huì)報(bào)錯(cuò),獲取方式在 QQ 郵箱服務(wù)端設(shè)置開啟 POP3/SMTP 服務(wù)時(shí)會(huì)提示。
- smtp_require_tls: 是否使用 tls,根據(jù)環(huán)境不同,來選擇開啟和關(guān)閉。如果提示報(bào)錯(cuò) email.loginAuth failed: 530 Must issue a STARTTLS command first,那么就需要設(shè)置為 true。著重說明一下,如果開啟了 tls,提示報(bào)錯(cuò) starttls failed: x509: certificate signed by unknown authority,需要在 email_configs 下配置 insecure_skip_verify: true 來跳過 tls 驗(yàn)證。
修改 AlertManager 啟動(dòng)命令,將本地 alertmanager.yml 文件掛載到容器內(nèi)指定位置。
$ docker run -d--name alertmanager-p 9093:9093 -v /root/prometheus/alertmanager.yml:/etc/alertmanager/alertmanager.ymlprom/alertmanager:latest4.2、Prometheus 配置 AlertManager 告警規(guī)則
接下來,我們需要在 Prometheus 配置 AlertManager 服務(wù)地址以及告警規(guī)則,新建報(bào)警規(guī)則文件 node-up.rules 如下:
$ mkdir -p /root/prometheus/rules && cd /root/prometheus/rules/ $ vim node-up.rules groups: - name: node-uprules:- alert: node-upexpr: up{job="node-exporter"} == 0for: 15slabels:severity: 1team: nodeannotations:summary: "{{ $labels.instance }} 已停止運(yùn)行超過 15s!"說明一下:該 rules 目的是監(jiān)測(cè) node 是否存活,expr 為 PromQL 表達(dá)式驗(yàn)證特定節(jié)點(diǎn) job="node-exporter" 是否活著,for 表示報(bào)警狀態(tài)為 Pending 后等待 15s 變成 Firing 狀態(tài),一旦變成 Firing 狀態(tài)則將報(bào)警發(fā)送到 AlertManager,labels 和 annotations 對(duì)該 alert 添加更多的標(biāo)識(shí)說明信息,所有添加的標(biāo)簽注解信息,以及 prometheus.yml 中該 job 已添加 label 都會(huì)自動(dòng)添加到郵件內(nèi)容中,更多關(guān)于 rule 詳細(xì)配置可以參考 這里。
然后,修改 prometheus.yml 配置文件,添加 rules 規(guī)則文件。
... # Alertmanager configuration alerting:alertmanagers:- static_configs:- targets:- 172.30.12.39:9093rule_files:- "/usr/local/prometheus/rules/*.rules" ...注意: 這里 rule_files 為容器內(nèi)路徑,需要將本地 node-up.rules 文件掛載到容器內(nèi)指定路徑,修改 Prometheus 啟動(dòng)命令如下,并重啟服務(wù)。
$ docker run --name prometheus -d -p 9090:9090 -v /root/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml -v /root/prometheus/groups/:/usr/local/prometheus/groups/ -v /root/prometheus/rules/:/usr/local/prometheus/rules/ prom/prometheus:latest
這里說明一下 Prometheus Alert 告警狀態(tài)有三種狀態(tài):Inactive、Pending、Firing。
- Inactive:非活動(dòng)狀態(tài),表示正在監(jiān)控,但是還未有任何警報(bào)觸發(fā)。
- Pending:表示這個(gè)警報(bào)必須被觸發(fā)。由于警報(bào)可以被分組、壓抑/抑制或靜默/靜音,所以等待驗(yàn)證,一旦所有的驗(yàn)證都通過,則將轉(zhuǎn)到 Firing 狀態(tài)。
- Firing:將警報(bào)發(fā)送到 AlertManager,它將按照配置將警報(bào)的發(fā)送給所有接收者。一旦警報(bào)解除,則將狀態(tài)轉(zhuǎn)到 Inactive,如此循環(huán)。
4.3、觸發(fā)報(bào)警發(fā)送 Email
上邊我們定義的 rule 規(guī)則為監(jiān)測(cè) job="node-exporter" Node 是否活著,那么就可以停掉 node-exporter 服務(wù)來間接起到 Node Down 的作用,從而達(dá)到報(bào)警條件,觸發(fā)報(bào)警規(guī)則。
$ docker stop node-exporter停止服務(wù)后,等待 15s 之后可以看到 Prometheus target 里面 node-exproter 狀態(tài)為 unhealthy 狀態(tài),等待 15s 后,alert 頁面由綠色 node-up (0 active) Inactive 狀態(tài)變成了黃色 node-up (1 active) Pending 狀態(tài),繼續(xù)等待 15s 后狀態(tài)變成紅色 Firing 狀態(tài),向 AlertManager 發(fā)送報(bào)警信息,此時(shí) AlertManager 則按照配置規(guī)則向接受者發(fā)送郵件告警。
最終發(fā)送的默認(rèn)報(bào)警郵件信息如下:
從上圖可以看到,默認(rèn)郵件模板 Title 及 Body 會(huì)將之前配置的 Labels 及 Annotations 信息均包含在內(nèi),而且每隔 5m 會(huì)自動(dòng)發(fā)送,直到服務(wù)恢復(fù)正常,報(bào)警解除為止,同時(shí)會(huì)發(fā)送一封報(bào)警解除郵件。接下來,我們啟動(dòng) node-exporter 來恢復(fù)服務(wù)。
等待 15s 之后,Prometheus Alerts 頁面變成綠色 node-up (0 active) Inactive 狀態(tài),同時(shí)也收到了報(bào)警解除郵件提醒。
這里有幾個(gè)地方需要解釋一下:
每次停止/恢復(fù)服務(wù)后,15s 之后才會(huì)發(fā)現(xiàn) Alert 狀態(tài)變化,是因?yàn)?prometheus.yml中 global -> scrape_interval: 15s 配置決定的,如果覺得等待 15s 時(shí)間太長(zhǎng),可以修改小一些,可以全局修改,也可以局部修改。例如局部修改 node-exporter 等待時(shí)間為 5s。
... - job_name: 'node-exporter'scrape_interval: 5sfile_sd_configs:- files: ['/usr/local/prometheus/groups/nodegroups/*.json']Alert 狀態(tài)變化時(shí)會(huì)等待 15s 才發(fā)生改變,是因?yàn)?node-up.rules 中配置了 for: 15s 狀態(tài)變化等待時(shí)間。
報(bào)警觸發(fā)后,每隔 5m 會(huì)自動(dòng)發(fā)送報(bào)警郵件(服務(wù)未恢復(fù)正常期間),是因?yàn)?alertmanager.yml 中 route -> repeat_interval: 5m 配置決定的。
4.4、AlertManager 配置自定義郵件模板
看到上邊默認(rèn)發(fā)送的郵件模板,雖然所有核心的信息已經(jīng)包含了,但是郵件格式內(nèi)容可以更優(yōu)雅直觀一些,那么,AlertManager 也是支持自定義郵件模板配置的,首先新建一個(gè)模板文件 email.tmpl。
$ mkdir -p /root/prometheus/alertmanager-tmpl && cd /root/prometheus/alertmanager-tmpl $ vim email.tmpl {{ define "email.from" }}xxxxxxxx@qq.com{{ end }} {{ define "email.to" }}xxxxxxxx@qq.com{{ end }} {{ define "email.to.html" }} {{ range .Alerts }} =========start==========<br> 告警程序: prometheus_alert <br> 告警級(jí)別: {{ .Labels.severity }} 級(jí) <br> 告警類型: {{ .Labels.alertname }} <br> 故障主機(jī): {{ .Labels.instance }} <br> 告警主題: {{ .Annotations.summary }} <br> 告警詳情: {{ .Annotations.description }} <br> 觸發(fā)時(shí)間: {{ .StartsAt.Format "2019-08-04 16:58:15" }} <br> =========end==========<br> {{ end }} {{ end }}簡(jiǎn)單說明一下,上邊模板文件配置了 email.from、email.to、email.to.html 三種模板變量,可以在 alertmanager.yml 文件中直接配置引用。這里 email.to.html 就是要發(fā)送的郵件內(nèi)容,支持 Html 和 Text 格式,這里為了顯示好看,采用 Html 格式簡(jiǎn)單顯示信息。下邊 {{ range .Alerts }} 是個(gè)循環(huán)語法,用于循環(huán)獲取匹配的 Alerts 的信息,下邊的告警信息跟上邊默認(rèn)郵件顯示信息一樣,只是提取了部分核心值來展示。然后,需要增加 alertmanager.yml 文件 templates 配置如下:
global:resolve_timeout: 5msmtp_from: '{{ template "email.from" . }}'smtp_smarthost: 'smtp.qq.com:465'smtp_auth_username: '{{ template "email.from" . }}'smtp_auth_password: 'xxxxxxxxxxxxxxx'smtp_require_tls: falsesmtp_hello: 'qq.com' templates:- '/etc/alertmanager-tmpl/email.tmpl' route:group_by: ['alertname']group_wait: 5sgroup_interval: 5srepeat_interval: 5mreceiver: '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 啟動(dòng)命令,將本地 email.tmpl 文件掛載到容器內(nèi)指定位置并重啟。
$ docker run -d--name alertmanager-p 9093:9093 -v /root/prometheus/alertmanager.yml:/etc/alertmanager/alertmanager.yml-v /root/prometheus/alertmanager-tmpl/:/etc/alertmanager-tmpl/prom/alertmanager:latest上邊模板中由于配置了 {{ .Annotations.description }} 變量,而之前 node-up.rules 中并沒有配置該變量,會(huì)導(dǎo)致獲取不到值,所以這里我們修改一下 node-up.rules 并重啟 Promethues 服務(wù)。
$ vim /root/prometheus/rules/node-up.rules groups: - name: node-uprules:- alert: node-upexpr: up{job="node-exporter"} == 0for: 15slabels:severity: 1team: nodeannotations:summary: "{{ $labels.instance }} 已停止運(yùn)行!"description: "{{ $labels.instance }} 檢測(cè)到異常停止!請(qǐng)重點(diǎn)關(guān)注!!!"重啟完畢后,同樣模擬觸發(fā)報(bào)警條件(停止 node-exporter 服務(wù)),也是可以正常發(fā)送模板郵件出來的,這次就是我們想要的風(fēng)格啦!
當(dāng)然我們還可以配置郵件標(biāo)題,這里就不在演示了,詳細(xì)配置可參考 這里。這里除了監(jiān)控節(jié)點(diǎn)是否存活外,還可以監(jiān)控很多很多指標(biāo),例如 CPU 負(fù)載告警、Mem 使用量告警、Disk 存儲(chǔ)空間告警、Network 負(fù)載告警等等,這些都可以通過自定義 PromQL 表達(dá)式驗(yàn)證值來定義一些列的告警規(guī)則,來豐富日常工作中需要的各種告警。
這里,我們只演示了如何通過 AlertManager 來配置發(fā)送郵件告警,其他的告警方式,可以參考 官網(wǎng)文檔 來配置,這里就不再演示了。下一篇,我們繼續(xù)通過 Prometheus 來監(jiān)控 SpringBoot 工程應(yīng)用程序 JVM 情況,以及自定義 metrics 來實(shí)現(xiàn)特定功能的監(jiān)控。
參考資料
- prometheus docs
- prometheus configuration
- alertting configuration
總結(jié)
以上是生活随笔為你收集整理的Prometheus 监控报警系统 AlertManager 之邮件告警的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 部署next cloud
- 下一篇: 用 Win7 引导 grub4dos,以