溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

如何搭建Prometheus監(jiān)控報(bào)警及自定義郵件模板

發(fā)布時(shí)間:2021-11-18 17:00:40 來源:億速云 閱讀:319 作者:小新 欄目:云計(jì)算

小編給大家分享一下如何搭建Prometheus監(jiān)控報(bào)警及自定義郵件模板,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

一、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)。

二、基本概念

Prometheus
官網(wǎng)(https://prometheus.io/)
是一套開源的監(jiān)控和報(bào)警系統(tǒng),也是一個(gè)時(shí)序數(shù)據(jù)庫(kù)。
架構(gòu)圖
如何搭建Prometheus監(jiān)控報(bào)警及自定義郵件模板

基本原理

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

服務(wù)過程

  1. Prometheus Daemon負(fù)責(zé)定時(shí)去目標(biāo)上抓取metrics(指標(biāo))數(shù)據(jù),每個(gè)抓取目標(biāo)需要暴露一個(gè)http服務(wù)的接口給它定時(shí)抓取。Prometheus支持通過配置文件、文本文件、Zookeeper、Consul、DNS SRV Lookup等方式指定抓取目標(biāo)。Prometheus采用PULL的方式進(jìn)行監(jiān)控,即服務(wù)器可以直接通過目標(biāo)PULL數(shù)據(jù)或者間接地通過中間網(wǎng)關(guān)來Push數(shù)據(jù)。
    2.Prometheus在本地存儲(chǔ)抓取的所有數(shù)據(jù),并通過一定規(guī)則進(jìn)行清理和整理數(shù)據(jù),并把得到的結(jié)果存儲(chǔ)到新的時(shí)間序列中。
    3.Prometheus通過PromQL和其他API可視化地展示收集的數(shù)據(jù)。Prometheus支持很多方式的圖表可視化,例如Grafana、自帶的Promdash以及自身提供的模版引擎等等。Prometheus還提供HTTP API的查詢方式,自定義所需要的輸出。
    4.PushGateway支持Client主動(dòng)推送metrics到PushGateway,而Prometheus只是定時(shí)去Gateway上抓取數(shù)據(jù)。

  2. Alertmanager是獨(dú)立于Prometheus的一個(gè)組件,可以支持Prometheus的查詢語(yǔ)句,提供十分靈活的報(bào)警方式。

工作流程

通過exporters從數(shù)據(jù)源主動(dòng)拉取數(shù)據(jù)(metrics),保存到時(shí)序數(shù)據(jù)庫(kù)(TSDB)中,可以通過HTTP Server訪問,同時(shí)可以發(fā)起報(bào)警,對(duì)于數(shù)據(jù)庫(kù)中的時(shí)序數(shù)據(jù),提供PromeQL進(jìn)行查詢,提供給web UI或者可視化系統(tǒng)Grafana等展示。

Grafana

官網(wǎng)(https://grafana.com/)
開源的數(shù)據(jù)分析和監(jiān)控平臺(tái)
有不同的dashboards支持不同類型的數(shù)據(jù)可視化

Exporters

數(shù)據(jù)采集
Prometheus從不同的exorters中拉取數(shù)據(jù),有不同的exporter支持不同的數(shù)據(jù)源
node-exporter 支持機(jī)器基本的數(shù)據(jù) 比如cpu mem 網(wǎng)絡(luò) 等

三、實(shí)驗(yàn)環(huán)境

docker01docker02docker03
192.168.1.11192.168.1.13192.168.1.20
NodeEXporterNodeEXporterNodeEXporter
cAdvisorcAdvisorcAdvisor
Prometheus Server
Grafana

全部關(guān)閉防火墻,禁用selinux

四、設(shè)置prometheus監(jiān)控報(bào)警

接下來,我們需要啟動(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 頁(yè)面,不過現(xiàn)在是沒有任何告警信息的,因?yàn)槲覀冞€沒有配置報(bào)警規(guī)則來觸發(fā)報(bào)警。
如何搭建Prometheus監(jiān)控報(bào)警及自定義郵件模板

配置AlertManager

AlertManager:用來接收prometheus發(fā)送來的報(bào)警信息,并且執(zhí)行設(shè)置好的報(bào)警方式、報(bào)警內(nèi)容。

下載鏡像

[root@docker01 ~]# docker pull alertmanager
//下載alertmanager鏡像

基于alertmanager運(yùn)行一臺(tái)容器

[root@docker01 ~]# docker run -d --name alertmanager -p 9093:9093 prom/alertmanager:latest

配置路由轉(zhuǎn)發(fā)

[root@docker01 ~]# echo net.ipv4.ip_forward = 1 >> /etc/sysctl.conf 
[root@docker01 ~]# sysctl -p

在部署alertmanager之前,我們需要對(duì)它的配置文件進(jìn)行修改,所以我們先運(yùn)行一個(gè)容器,先將其配置文件拷貝出來。

[root@docker01 ~]# docker cp alertmanager:/etc/alertmanager/alertmanager.yml ./
//拷貝alertmanager的配置文件到本地

修改alertmanager的配置文件

配置文件簡(jiǎn)單介紹

AlertManager:用來接收Prometheus發(fā)送的報(bào)警信息,并且執(zhí)行設(shè)置好的報(bào)警方式,報(bào)警內(nèi)容。

AlertManager.yml配置文件:

global:全局配置,包括報(bào)警解決后的超時(shí)時(shí)間、SMTP相關(guān)配置、各種渠道通知的API地址等消息。

route:用來設(shè)置報(bào)警的分發(fā)策略。

receivers:配置報(bào)警信息接收者信息。

inhibit_rules:抑制規(guī)則配置,當(dāng)存在與另一個(gè)匹配的報(bào)警時(shí),抑制規(guī)則將禁用用于有匹配的警報(bào)。

修改配置文件
[root@docker01 ~]# vim alertmanager.yml 
//修改alertmanager配置文件
global:
  resolve_timeout: 5m
  smtp_from: '2877364346@qq.com'   #自己郵箱地址
  smtp_smarthost: 'smtp.qq.com:465'  #qq的郵箱地址及端口
  smtp_auth_username: '2877364346@qq.com'  
  smtp_auth_password: 'osjppnjkbuhcdfff' #需要在qq郵箱獲取授權(quán)碼
  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: '2877364346@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)鍵的配置說明一下:

1.smtp_smarthost: 這里為 QQ 郵箱 SMTP 服務(wù)地址,官方地址為 smtp.qq.com 端口為 465 或 587,同時(shí)要設(shè)置開啟 POP3/SMTP 服務(wù)。

  1. smtp_auth_password: 這里為第三方登錄 QQ 郵箱的授權(quán)碼,非 QQ 賬戶登錄密碼,否則會(huì)報(bào)錯(cuò),獲取方式在 QQ 郵箱服務(wù)端設(shè)置開啟 POP3/SMTP 服務(wù)時(shí)會(huì)提示。
    3.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)證。

重新運(yùn)行 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 
//運(yùn)行一臺(tái)新的alertmanager容器,記得掛載配置文件

Prometheus配置和alertmanager報(bào)警規(guī)則

創(chuàng)建存放規(guī)則的目錄

[root@docker01 ~]# mkdir -p prometheus/rules
//創(chuàng)建規(guī)則目錄
[root@docker01 ~]# cd prometheus/rules/

編寫規(guī)則

[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 }} 已停止運(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配置文件

[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"  #添加(這個(gè)路徑是prometheus容器內(nèi)的路徑)

注意: 這里 rulefiles 為容器內(nèi)路徑,需要將本地 node-up.rules 文件掛載到容器內(nèi)指定路徑,修改 Prometheus 啟動(dòng)命令如下,并重啟服務(wù)。

重新運(yùn)行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
//運(yùn)行一臺(tái)新的alertmanager容器,記得掛載規(guī)則文件

瀏覽器驗(yàn)證一下http://192.168.1.11:9090/rules

如何搭建Prometheus監(jiān)控報(bào)警及自定義郵件模板

這里說明一下 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)。

掛起docker02

如何搭建Prometheus監(jiān)控報(bào)警及自定義郵件模板

會(huì)收到郵件
如何搭建Prometheus監(jiān)控報(bào)警及自定義郵件模板

這里有幾個(gè)地方需要解釋一下:

  1. 每次停止/恢復(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: 5s     file_sd_configs:       - files: ['/usr/local/prometheus/groups/nodegroups/*.json']

  2. Alert 狀態(tài)變化時(shí)會(huì)等待 15s 才發(fā)生改變,是因?yàn)?node-up.rules 中配置了 for: 15s 狀態(tài)變化等待時(shí)間。

  3. 報(bào)警觸發(fā)后,每隔 5m 會(huì)自動(dòng)發(fā)送報(bào)警郵件(服務(wù)未恢復(fù)正常期間),是因?yàn)?alertmanager.yml 中 route -> repeat_interval: 5m 配置決定的。

五、AlertManager自定義郵件模板

創(chuàng)建模板目錄

[root@docker01 ~]# cd prometheus
//進(jìn)入之前創(chuàng)建的prometheus目錄
[root@docker01 prometheus]# mkdir alertmanager-tmpl
//創(chuàng)建AlertManager模板目錄

看到上邊默認(rèn)發(fā)送的郵件模板,雖然所有核心的信息已經(jīng)包含了,但是郵件格式內(nèi)容可以更優(yōu)雅直觀一些,那么,AlertManager 也是支持自定義郵件模板配置的,首先新建一個(gè)模板文件

編寫模板規(guī)則

[root@docker01 prometheus]# vim email.tmpl 
{{ define "email.from" }}2877364346@qq.com{{ end }}
{{ define "email.to" }}2877364346@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>
觸發(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)語(yǔ)法,用于循環(huán)獲取匹配的 Alerts 的信息,下邊的告警信息跟上邊默認(rèn)郵件顯示信息一樣,只是提取了部分核心值來展示。然后,需要增加 alertmanager.yml 文件 templates 配置如下:

修改alertmanager的配置文件

[root@docker01 ~]# vim alertmanager.yml 
global:
  resolve_timeout: 5m
  smtp_from: '2877364346@qq.com'
  smtp_smarthost: 'smtp.qq.com:465'
  smtp_auth_username: '2877364346@qq.com'
  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']

重新運(yùn)行 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
//運(yùn)行一臺(tái)新的alertmanager容器,記得掛載配置文件

掛起docker02

如何搭建Prometheus監(jiān)控報(bào)警及自定義郵件模板

收到郵件

如何搭建Prometheus監(jiān)控報(bào)警及自定義郵件模板

當(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ī)則,來豐富日常工作中需要的各種告警。

以上是“如何搭建Prometheus監(jiān)控報(bào)警及自定義郵件模板”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI