當前位置:編程學習大全網 - 腳本源碼 - 2020-08-25

2020-08-25

Prometheus 實現郵件告警(Prometheus+Alertmanager+QQ郵箱或者網易163郵箱,目前測試過這兩種郵箱都可以發送告警郵件)

Prometheus實現郵件告警原理如下:

Prometheus官方有壹個附帶的中間件:alertmanager,通過設置rules規則和路由轉發可以實現郵件告警,前提是妳需要有壹個可以發送郵件的郵件服務端(可以自建或者使用互聯網公司提供的免費郵箱)

告警原理圖

Prometheus完整架構圖

我之前得出的錯誤結論如下:

推薦直接在虛擬機操作系統上直接安裝Prometheus和Alertmanager,不推薦其中任何壹方在容器中運行,因為測試過在容器中運行Prometheus和alertmanager,結果出現如下錯誤情況

第壹種情況是:我的node-exporter掉線跌機了(手動關機,模擬突然掉線跌機),Prometheus卻提示節點依然在線?有時候卻能夠正常顯示節點掉線跌機,生成告警發送郵件

第二種情況是:我的node-exporter掉線跌機了(手動關機,模擬突然掉線跌機),Prometheus提示節點掉線,告警生成,但是沒有發送郵件,我手動恢復node-exporter後,告警解除,郵件能正常發送郵件提示告警已經解除。。。。

第三種情況是:我的node-exporter掉線跌機了(手動關機,模擬突然掉線跌機),Prometheus提示節點掉線,告警生成,正常成功發送郵件,我手動恢復node-exporter後,告警解除,郵件沒有發送出來。。。。

以上三種情況之前經常出現,當時第壹步以為是自己設置的scrape_interval不合理導致的,結果調試幾次,問題沒有解決,第二步以為是自己的服務器時間沒有做到精確同步,然後我去設置和阿裏雲的ntp服務器同步,結果問題依然沒有解決,第三步,換個方向,把alertmanager遷移到虛擬機操作系統上安裝運行,問題解決!

北京時間是GMT+8小時,有些同誌的時間可能是UTC的,但是如果是在要求不太十分精確的情況下,UTC時間是剛剛好等於GMT時間

為了避免時區的混亂,prometheus所有的組件內部都強制使用Unix時間,對外展示使用GMT時間。

要改時區有兩個辦法

1 .修改源碼,重新編譯。

2. 使用 docker 運行 Prometheus,掛載本地時區文件

docker run --restart always -e TZ=Asia/Shanghai --hostname prometheus --name prometheus-server -d -p 9090:9090 -v /data/prometheus/server/data:/prometheus -v /data/prometheus/server/conf/prometheus.yml:/etc/prometheus/prometheus.yml -u root prom/prometheus:v2.5.0

正文開始

安裝alertmanager

容器安裝方式:

docker run -d --name alertmanager -p 9093:9093 -v /usr/local/Prometheus/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prom/alertmanager:latest

先在宿主機/usr/local/Prometheus下創建壹個文件夾alertmanager,然後在文件夾裏創建alertmanager.yml配置文件,待會才能映射到alertmanager容器裏的/etc/alertmanager目錄下

global:全局配置

resolve_timeout: 問題解決的超時時間

smtp_from: 發送告警郵件的郵箱賬號

smtp_smarthost:?郵箱 SMTP 服務地址,這裏是以QQ郵箱為例,也可以用網易163郵箱,這個和我之前設置zabbix郵件告警時的配置壹樣

smtp_auth_username: 如果沒有設置郵箱別名,那就是賬戶名

smtp_auth_password:? 郵箱的授權碼,不是 賬戶密碼,妳可以在QQ郵箱或者網易163郵箱網頁端設置,開啟?POP3/SMTP?服務時會提示,和配置zabbix郵件告警的時候幾乎壹樣

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 驗證。

templates: 告警模板目錄,可以不編寫模板,有默認模板

Subject: '{{ template "email.default.subject" . }}'

html: '{{ template "email.default.html" . }}'

route:報警的分發設置

group_by:分組

group_wait: 分組等待時間

group_interval: 5m 每組時間間隔

repeat_interval: 10m 重復間隔

receiver: 接收方式,請註意!這裏的名字要對應下面receivers中的任何壹個名字,不然會報錯,這裏其實就是選擇方式,有郵箱,企業微信,wehook,victorops等等

receivers:接受方式匯總,即告警方式匯總

例子:

receivers:

- name:'default-receiver'?

email_configs:

- to:'whiiip@163.com'

? html: '{{ template "alert.html" . }}'

? headers: { Subject: "[WARN] 報警郵件test"}

inhibit_rules: 抑制規則

當存在與另壹組匹配的警報(源)時,抑制規則將禁用與壹組匹配的警報(目標)。

包括源匹配和目標匹配

alertmanager官方是這樣說的

Inhibition

Inhibition is a concept of suppressing notifications for certain alerts if certain other alerts are already firing.

Example: ?An alert is firing that informs that an entire cluster is not reachable. Alertmanager can be configured to mute all other alerts concerning this cluster if that particular alert is firing. This prevents notifications for hundreds or thousands of firing alerts that are unrelated to the actual issue.

Inhibitions are configured through the Alertmanager's configuration file.

當存在與另壹組匹配器匹配的警報(源)時,禁止規則會使與壹組匹配器匹配的警報(目標)靜音。目標警報和源警報的equal列表中的標簽名稱都必須具有相同的標簽值。

在語義上,缺少標簽和帶有空值的標簽是同壹件事。因此,如果equal源警報和目標警報都缺少列出的所有標簽名稱,則將應用禁止規則。

為了防止警報禁止自身,與規則的目標和源端 都 匹配的警報不能被警報(包括其本身)為真來禁止。但是,我們建議選擇目標匹配器和源匹配器,以使警報永遠不會同時匹配雙方。這很容易進行推理,並且不會觸發此特殊情況。

接著是規則rules

不解釋了,自己研究官方文檔

alertmanager的非容器安裝方式是

?wget /prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz

tar xf alertmanager-0.20.0.linux-amd64.tar.gz

mv alertmanager-0.20.0.linux-amd64 /usr/local/alertmanager

vim /usr/lib/systemd/system/alertmanager.service

[Unit]

Description=alertmanager

Documentation=/prometheus/alertmanager

After=network.target

[Service]

Type=simple

User=root

ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml

Restart=on-failure

[Install]

WantedBy=multi-user.target

Alertmanager 安裝目錄下默認有 alertmanager.yml 配置文件,可以創建新的配置文件,在啟動時指定即可。

其余方式和上面壹樣

接著是Prometheus,我之前的博客裏有寫了容器安裝和非容器安裝的方法,自己去翻閱

然後是在prometheus.yml裏修改相關配置

首先去掉alertmanager的註釋,改成IP加妳設置的端口號,默認是9093

接著在rule_files: 下面寫下規則文件的絕對路徑,可以是具體文件名,也可以是*,也可以分幾級文件,*默認是全部匹配

接著是被監控項的設置,這裏設置完成可以在Prometheus網頁裏的targets裏看得到

請註意,這裏設置的參數名字要和rule規則中設置的參數名字壹模壹樣,否則妳的prometheus服務會無法啟動,然後報錯

如果不在特定的job下設置scrape_interval(優先級高於全局),則默認采用gobal下的scrape_interval

最後模擬節點掉線,手動關閉node-exporter或者Cadvisor

docker stop?node-exporter 或者容器ID

docker stop cadvisor?或者容器ID

或者把up{{job='prometheus'}} == 1 設置成1,反向設置,不用關掉服務,就可以看看告警成不成功

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

Inactive:非活動狀態,表示正在監控,但是還未有任何警報觸發。

Pending:表示這個警報必須被觸發。由於警報可以被分組、壓抑/抑制或靜默/靜音,所以等待驗證,壹旦所有的驗證都通過,則將轉到 Firing 狀態。

Firing:將警報發送到 AlertManager,它將按照配置將警報的發送給所有接收者。壹旦警報解除,則將狀態轉到 Inactive,如此循環。

沒有配置告警模板時的默認告警格式是這樣的

節點恢復後郵件告知是這樣的

寫了模板後是這樣的

還要重新映射模板文件夾路徑到alertmanager容器裏的相對路徑,然後重啟alertmanager,當然,如果目錄下沒有模板文件,則不顯示

告警模板

在alertmanager.yml中修改相關設置

重啟alertmanager

docker restart alertmanager

最終效果不是很好

  • 上一篇:奮筆疾書是什麽意思
  • 下一篇:2022年蘭溪市各中學校長名單
  • copyright 2024編程學習大全網