一、環境介紹 本文環境,以及本文所採用資料庫為GreatSQL 8.0.32-24 $ cat /etc/system-release Red Hat Enterprise Linux Server release 7.9 (Maipo) $ uname -a Linux gip 3.10.0-11 ...
一、環境介紹
本文環境,以及本文所採用資料庫為GreatSQL 8.0.32-24
$ cat /etc/system-release
Red Hat Enterprise Linux Server release 7.9 (Maipo)
$ uname -a
Linux gip 3.10.0-1160.el7.x86_64 #1 SMP Tue Aug 18 14:50:17 EDT 2020 x86_64 x86_64 x86_64 GNU/Linux
$ ldd --version
ldd (GNU libc) 2.17
在上篇[圖文結合丨Prometheus+Grafana+GreatSQL性能監控系統搭建指南(上)]中介紹瞭如何搭建監控系統,本文將介紹如何使用Grafana平臺以及AlertManager模塊的告警功能
二、Grafana之郵件告警
這裡我們以郵件告警並使用QQ郵箱為例
1.開啟郵件服務
登錄QQ郵箱後,點擊設置->賬號->開啟POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服務
我已經開啟了,若沒有開啟可以開啟一下,接著點擊生成授權碼
,記得保存好授權碼,接下來修改grafana郵箱配置
$ vim /usr/local/prometheus/grafana-10.1.1/conf/defaults.ini
使用/smtp
找到郵件設置的區域,按下圖示例修改
重啟Grafana服務
$ systemctl restart grafana-server.service
接下來登錄Grafana網頁http://172.17.137.104:3000/
,添加郵件告警
填寫Name
,Addresses
等信息後點擊Test
測試下
可以看到已經收到郵件,測試成功
2.添加告警規則
可以在Grafana中添加告警規則,例如我創建了一個GreatSQL連接情況,它監測是的mysql_up
這個值,若為0則連接不上GreatSQL了
進入編輯面板,可以看到有一個Alert
的告警選項,隨後我們點擊Create alert rule from this panel
這時候就會進入告警規則設置面板
首先我們來介紹下第一部分設置警報規則名稱
,就是設置告警的規則名字
(第一部分)
第二個部分就是我們在外面展示的數據情況,在Expressions
往下就是設置告警條件
(第二部分)
第一項last()
表示最新數據,還有很多其他選項如max()
表示最大值,一般我們選擇last()
第二項就是表示我們來自哪個查詢,因為我們只有一個所以選擇A
第三項則標識我們要監控的值達到多少觸發,觸發判斷是前面的選項,如圖中的IS ABOVE
則表示在這之上,還有其他幾個選項如IS BELOW
在這之下、IS OUTSIDE RANGE
超出範圍、IS WITHIN RANGE
在範圍內、HAS NO VALPUE
無值。此處我們選擇IS ABOVE
,表達式綜合就是:當mysql_up
值小於1則觸發。
第三部分是創建要儲存規則的文件夾Folder
以及評估的組Evaluation group
同一組中的規則將在同一時間間隔內按順序進行評估
(第三部分)
其中Pending period
表示觸發告警後延遲多長時間
第四部分用於添加註釋Summary
摘要對發生的事情和原因的簡短總結,Description
說明警報規則功能的說明,Runbook URL
運行手冊網址用於保存警報運行手冊的網頁
第五部分配置通知,用於添加自定義標簽以更改通知的路由方式,如果沒有設置匹配策略的話,則所有警報實例都由預設策略處理
點擊右上角保存規則後,可以在頁面中看到剛剛設定的告警規則
3.測試郵件告警
現在模擬GreatSQL宕機,看看會不會觸發告警規則從而發送郵件報警
$ systemctl stop greatsql
因為我們設置的是1分鐘,所以要1分鐘以後才會再次檢測GreatSQL的連接狀況
下圖可以看到,已經檢測到GreatSQL連接不上了,進入待定狀態
過了設定的延遲時間,顯示Firing
表示已經發送郵件
可以看到QQ郵箱中已經收到了告警郵件
接著我們把GreatSQL再次啟動起來
$ systemctl start greatsql
當你解決完成以後,還會收到一封已解決的郵件1 resolved instances
三、Grafana之釘釘告警
在之前的文章中已經提到了使用釘釘告警Prometheus+Grafana+釘釘部署一個單機的MySQL監控告警系統,但是使用的是Alertmanager是普米的告警模塊,並不是Grafana,所以這裡在介紹下如何用Grafana配置釘釘告警。
不過釘釘在2023年9月1日起,非內部群和內部群均不再支持創建自定義機器人,你需要登錄釘釘開發者後臺,申請開發者許可權後,創建企業內部應用機器人,具體方法這邊就不介紹了,需要的可以去釘釘上看詳細介紹
按Prometheus+Grafana+釘釘部署一個單機的MySQL監控告警系統中的方法,先創建好釘釘機器人,接著到Grafana中添加Contact points
聯絡點
接下來填入Name
、Integration
下拉框中找到DingDing
URL中填入釘釘機器人的Webhook:
Message Type
有兩個選項,一個是卡片的模式,一個是鏈接的模式,以及Title標題和Message消息,接著點擊Test測試一下,看看是否可以發送告警信息,這時候釘釘機器人就會發送告警測試,沒問題就點擊下方藍色的Save contact point
如果要選擇釘釘告警,可以在選項Notification policies
中選擇Edit
把Default contact point
修改為釘釘告警的方式,修改好點擊Update default policy
接下來測試下,我們把GreatSQL模擬關閉,看看是否會發送告警信息
$ systemctl stop greatsql
沒問題,成功接收到了告警信息
四、Alertmanager之郵件告警
還記得我們上篇文章安裝的Alertmanager嗎,其實也具有告警功能。Prometheus 包含一個報警模塊,就是我們的 AlertManager,Alertmanager 主要用於接收 Prometheus 發送的告警信息,它支持豐富的告警通知渠道,而且很容易做到告警信息進行去重,降噪,分組等。在上篇中我們也往這裡面添加了一些規則,忘記的可以在復讀一次上篇,Alertmanager也可以釘釘告警,在Prometheus+Grafana+釘釘部署一個單機的MySQL監控告警系統有介紹,這裡就來介紹下Alertmanager之郵件告警
Prometheus觸發一條告警的過程
1.配置AlertManager
AlertManager 預設配置文件為 alertmanager.yml
,路徑為 /usr/local/prometheus/alertmanager-0.26.0.linux-amd64/alertmanager.yml
那麼,我們就來配置一下使用 Email 方式通知報警信息,這裡以 QQ 郵箱為例,配置如下:
global:
resolve_timeout: 5m
smtp_from: '填寫郵箱@qq.com'
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: '填寫郵箱@qq.com'
smtp_auth_password: '填寫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: '填寫郵箱@qq.com'
send_resolved: true
inhibit_rules:
- source_match:
severity: 'critical'
target_match:
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
yml對縮進有要求,請仔細檢查
對重點參數做詳細介紹:
global
全局配置,主要配置告警方式,如郵件、webhook等。
-
resolve_timeout
:超時,預設5min -
smtp_auth_password
:切記QQ郵箱的授權碼,非QQ賬戶登錄密碼 -
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 驗證。
route
用來設置報警的分發策略
group_by
:用於分組聚合,對告警通知按標簽(label)進行分組,將具有相同標簽或相同告警名稱(alertname)的告警通知聚合在一個組,然後作為一個通知發送。如果想完全禁用聚合,可以設置為group_by: [...]group_wait
:當一個新的告警組被創建時,需要等待'group_wait'後才發送初始通知。這樣可以確保在發送等待前能聚合更多具有相同標簽的告警,最後合併為一個通知發送。group_interval
:當第一次告警通知發出後,在新的評估周期內又收到了該分組最新的告警,則需等待'group_interval'時間後,開始發送為該組觸發的新告警,可以簡單理解為,group就相當於一個通道(channel)。repeat_interval
:告警通知成功發送後,若問題一直未恢復,需再次重覆發送的間隔。receiver
:配置告警消息接收者,與下麵配置的對應。例如常用的 email、wechat、slack、webhook 等消息通知方式。
receivers
配置報警信息接收者信息
to
:接收警報的Emailsend_resolved
:故障恢復後通知
inhibit_rules
抑制規則配置,當存在與另一組匹配的警報(源)時,抑制規則將禁用與一組匹配的警報(目標)
配置完成後重啟即可systemctl restart alertmanager.service
若啟動失敗可自行排查
journalctl -u alertmanager.service -f
,註意檢查縮進問題!
接下來就可以配置AlertManager的告警規則,這個我們也在上篇提到,並且也創建rules文件夾存放規則,所以按上篇方法做即可
2.測試郵件告警
接下來我們登錄到http://172.17.137.104:9090/rules
Prometheus的Rules中查看,是不是有添加完成幾個告警
這裡說明一下 Prometheus Alert 告警狀態有三種狀態:Inactive
、Pending
、Firing
Inactive
:非活動狀態,表示正在監控,但是還未有任何警報觸發。Pending
:表示這個警報必須被觸發。由於警報可以被分組、壓抑/抑制或靜默/靜音,所以等待驗證,一旦所有的驗證都通過,則將轉到 Firing 狀態。Firing
:將警報發送到 AlertManager,它將按照配置將警報的發送給所有接收者。一旦警報解除,則將狀態轉到 Inactive,如此迴圈。
接下來我們關閉GreatSQL,使得mysql_up = 0
觸發告警規則,看看是否會發送告警郵件
$ systemctl stop greatsql
停止服務後,alert 頁面由綠色 Inactive
狀態變成了黃色 Pending
狀態繼續等待變成紅色 Firing
狀態,從而向 AlertManager 發送報警信息,此時 AlertManager 則按照配置規則向接受者發送郵件告警
黃色 Pending
紅色 Firing
然後我們就收到了告警郵件
從上圖可以看到,預設郵件模板 Title 及 Body 會將之前配置的 Labels 及 Annotations 信息均包含在內,而且每隔 5m 會自動發送,直到服務恢復正常,報警解除為止,同時會發送一封報警解除郵件。
報警觸發後,每隔 5m 會自動發送報警郵件(服務未恢復正常期間),是因為 alertmanager.yml
中 route -> repeat_interval: 5m
配置決定的
3.更改AlertManager郵件內容
此步驟非必要,想要郵件內容更優雅直觀的可以參考
雖然所有核心的信息已經包含了,但是郵件格式內容可以更優雅直觀一些,AlertManager也是支持修改自定義郵件模板配置的
我們需要新建一個模板文件,就叫做email.tmpl
$ vim /usr/local/prometheus/alertmanager-0.26.0.linux-amd64/email.tmp
寫入以下內容
{{ define "email.from" }}填入郵箱@qq.com{{ end }}
{{ define "email.to" }}填入郵箱@qq.com{{ end }}
{{ define "email.to.html" }}
{{- if gt (len .Alerts.Firing) 0 -}}{{ range .Alerts }}
<h2>@告警通知</h2>
告警程式: prometheus_alert <br>
告警級別: {{ .Labels.severity }} 級 <br>
告警類型: {{ .Labels.alertname }} <br>
故障主機: {{ .Labels.instance }} <br>
告警主題: {{ .Annotations.summary }} <br>
告警詳情: {{ .Annotations.description }} <br>
觸發時間: {{ .StartsAt.Local.Format "2006-01-02 15:04:05" }} <br>
{{ end }}{{ end -}}
{{- if gt (len .Alerts.Resolved) 0 -}}{{ range .Alerts }}
<h2>@告警恢復</h2>
告警程式: prometheus_alert <br>
故障主機: {{ .Labels.instance }}<br>
故障主題: {{ .Annotations.summary }}<br>
告警詳情: {{ .Annotations.description }}<br>
告警時間: {{ .StartsAt.Local.Format "2006-01-02 15:04:05" }}<br>
恢復時間: {{ .EndsAt.Local.Format "2006-01-02 15:04:05" }}<br>
{{ end }}{{ end -}}
{{- end }}
上邊模板文件配置了 email.from
、email.to
、email.to.html
三種模板變數,可以在 alertmanager.yml
文件中直接配置引用。
這裡 email.to.html
就是要發送的郵件內容,支持 Html 和 Text 格式,這裡為了顯示好看,採用 Html 格式簡單顯示信息。下邊{{ range .Alerts }}
是個迴圈語法,用於迴圈獲取匹配的 Alerts 的信息,下邊的告警信息跟上邊預設郵件顯示信息一樣,只是提取了部分核心值來展示。然後,需要增加 alertmanager.yml
文件 templates
配置如下:
$ vim /usr/local/prometheus/alertmanager-0.26.0.linux-amd64/alertmanager.yml
global:
resolve_timeout: 5m
smtp_from: '填入郵箱@qq.com'
smtp_smarthost: 'smtp.qq.com:465'
smtp_auth_username: '填入郵箱@qq.com'
smtp_auth_password: '填寫QQ郵箱授權碼'
smtp_require_tls: false
smtp_hello: 'qq.com'
templates:
- '/usr/local/prometheus/alertmanager-0.26.0.linux-amd64/email.tmp'
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']
接著我們模擬GreatSQL宕機,使其觸發告警規則,看看是否發送告警郵件
沒問題已經成功收到了告警郵件
好啦,Prometheus+Grafana+GreatSQL性能監控系統搭建指南就到此結束,快動手搭建操作下吧~
Enjoy GreatSQL