搭建Prometheus監控報警及自定義郵件模板

基於上一篇博客(https://blog.51cto.com/14320361/2461277 繼續進行部署

一、Prometheus & AlertManager 介紹

Prometheus 是一套開源的系統監控、報警、時間序列數據庫的組合,最初有 SoundCloud 開發的,後來隨着越來越多公司使用,於是便獨立成開源項目。Alertmanager 主要用於接收 Prometheus 發送的告警信息,它支持豐富的告警通知渠道,例如郵件、微信、釘釘、Slack 等常用溝通工具,而且很容易做到告警信息進行去重,降噪,分組等,是一款很好用的告警通知系統。

二、基本概念

Prometheus
官網(https://prometheus.io/
是一套開源的監控和報警系統,也是一個時序數據庫。
架構圖
搭建Prometheus監控報警及自定義郵件模板

基本原理

Prometheus的基本原理是通過HTTP協議週期性抓取被監控組件的狀態,任意組件只要提供對應的HTTP接口就可以接入監控。不需要任何SDK或者其他的集成過程。這樣做非常適合做虛擬化環境監控系統,比如VM、Docker、Kubernetes等。輸出被監控組件信息的HTTP接口被叫做exporter 。目前互聯網公司常用的組件大部分都有exporter可以直接使用,比如Varnish、Haproxy、Nginx、MySQL、Linux系統信息(包括磁盤、內存、CPU、網絡等等)

服務過程

  1. 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上抓取數據。
  2. 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 頁面,不過現在是沒有任何告警信息的,因爲我們還沒有配置報警規則來觸發報警。
搭建Prometheus監控報警及自定義郵件模板

配置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 服務。

  1. 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監控報警及自定義郵件模板

這裏說明一下 Prometheus Alert 告警狀態有三種狀態:Inactive、Pending、Firing。

Inactive:非活動狀態,表示正在監控,但是還未有任何警報觸發。
Pending:表示這個警報必須被觸發。由於警報可以被分組、壓抑/抑制或靜默/靜音,所以等待驗證,一旦所有的驗證都通過,則將轉到 Firing 狀態。
Firing:將警報發送到 AlertManager,它將按照配置將警報的發送給所有接收者。一旦警報解除,則將狀態轉到 Inactive,如此循環。

掛起docker02

搭建Prometheus監控報警及自定義郵件模板

會收到郵件
搭建Prometheus監控報警及自定義郵件模板

這裏有幾個地方需要解釋一下:

  1. 每次停止/恢復服務後,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']

  2. Alert 狀態變化時會等待 15s 才發生改變,是因爲 node-up.rules 中配置了 for: 15s 狀態變化等待時間。

  3. 報警觸發後,每隔 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

搭建Prometheus監控報警及自定義郵件模板

收到郵件

搭建Prometheus監控報警及自定義郵件模板

當然我們還可以配置郵件標題,這裏就不在演示了,詳細配置可參考 這裏。這裏除了監控節點是否存活外,還可以監控很多很多指標,例如 CPU 負載告警、Mem 使用量告警、Disk 存儲空間告警、Network 負載告警等等,這些都可以通過自定義 PromQL 表達式驗證值來定義一些列的告警規則,來豐富日常工作中需要的各種告警。
這裏,我們只演示瞭如何通過 AlertManager 來配置發送郵件告警,其他的告警方式,可以參考 官網文檔 來配置,這裏就不再演示了。下一篇,我們繼續通過 Prometheus 來監控 SpringBoot 工程應用程序 JVM 情況,以及自定義 metrics 來實現特定功能的監控。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章