引言:
Prometheus是一個按功能划分的憑條,指標的收集和存儲與警報是分開的。警報管理功能是由Alertmanager的工具提供,該工具是監控體系中的獨立組件。
在Prometheus上定義警報規則后,這些規則可以出發事件,然后傳播到Alertmanager,Alertmanager會決定如何處理相應的警報。Alertmanager對警報進行去重、分組,然后路由到不同的接收器,如電子郵件、短信或SaaS服務(PagerDuty等)。我們將在Prometheus服務器上編寫警報規則 [2] ,這些規則將使用我們收集的指標並在指定的閾值或標准上觸發警報。我們還將看到如何為警報添加一些上下文。當指標達到閾值或標准時,會生成一個警報並將其推送到Alertmanager。與Prometheus一樣,Alertmanager配置也是基於YAML的配置文件。
一、Alertmanager安裝使用
下載地址:
https://prometheus.io/download/#alertmanager
解壓並將以下兩個文件復制到指定目錄,如下
[root@bogon alertmanager]# cp alertmanager /usr/local/bin/ [root@bogon alertmanager]# cp amtool /usr/local/bin/ [root@bogon ~]# alternatives --version #查看版本 alternatives version 1.7.2 [root@bogon alertmanager]# ./alertmanager #啟動Alertmanager
瀏覽器訪問ip:9093即可查看到Alertmanager圖形頁面
二、Prometheus配置Alertmanager
修改prometheus.yml文件,添加lerting塊。具體內容如下:(其中最后一行的alertmanager為ip地址,或可以解析到對應的Alertmanager的IP)
[root@bogon prometheus]# cat prometheus.yml |grep -A 5 alerting|grep -v ^# alerting: alertmanagers: - static_configs: - targets: - alertmanager:9093 [root@bogon prometheus]#
配置監控好Alertmanager后,告警內容會發送給Alertmanager
三、Alertmanager服務發現
暫時沒明白什么意思,后續清楚了再進行補充
四、監控Alertmanager
配置prometheus.yml文件
- job_name: 'alertmanager' static_configs: - targets: ['localhost:9093']
添加報警規則
在prometheus.yml的同級目錄中,創建rules目錄,在該新建目錄下創建node_alerts.yml文件,內容如下:
rule_files: - "rules/*_rules.yml" - "rules/*_alerts.yml"
添加第一條警報規則,如果process_max_fds(點擊Prometheus界面的targets里對應的Alertmanager查看metrics,隨便挑一個值)大於80,則會觸發警報
[root@bogon rules]# cat node_alerts.yml groups: - name: node_alerts rules: - alert: HighNodeCPU expr: process_max_fds >80 for: 60m labels: serverity: warning annotations: summary: High Node CPU for 1 hour console: You might want to check the Node Dashboard
解釋:指定組名為nod_alerts,警報名稱為HighNodeCPU(每個警報組中,警報名稱必須唯一),觸發警報的測試表達式在expr中,檢查條件為該指標是否大於80(或者說是80%使用率),for為測試表達式必須為true的時間長度。其中annotations里的summary的標簽用來描述警報,console用注釋提供上下文,方便快速排錯。
需要重啟Prometheus,配置生效,可以在Prometheus里的alerts里看到。剛開始的時候應該是inactive狀態,監測到滿足大於80的條件后就立刻轉為pending狀態了,當大於80的狀態滿足持續1小時的時間后就會觸發告警,發送郵件(郵件部分還需要做額外配置)
五、警報觸發
Prometheus以一個固定時間間隔來評估所有規則,這個時間由evaluate_interval定義,我們將其設置為15秒。
警報有三中狀態:Inactive 警報未激活。Pending:警報已滿足測試表達式條件,但未達到for指定的持續時間。Firing:警報滿足測試表達式條件,且持續時間達到了for指定的持續時間。
六、配置郵件告警
我是使用Outlook郵箱(微軟郵箱)進行測試的,QQ郵箱沒測試成功。后續我再進行改進,確定各部分代碼的用途,具體代碼如下:
[root@bogon alertmanager]# cat alertmanager.yml global: resolve_timeout: 5m smtp_smarthost: 'smtp.office365.com:587' smtp_from: '請輸入你的郵箱賬號' smtp_auth_username: '請輸入你的outlook郵箱賬號' smtp_auth_password: '請輸入你的密碼' smtp_hello: 'office365.com' smtp_require_tls: true route: group_by: ['alertname'] group_wait: 30s group_interval: 5m repeat_interval: 5m receiver: default routes: - receiver: email group_wait: 10s receivers: - name: 'default' email_configs: - to: '請輸入你的郵箱賬號' send_resolved: true - name: 'email' email_configs: - to: '請輸入你的郵箱賬號' send_resolved: true
我重啟了Prometheus和Alertmanager就收到郵件了。注意,需要滿足觸發郵件才會發送對應的告警郵件。郵件如下:
七、使用模板
使用模板的意思,簡單一點來說,就相當於在規則里使用變量。這樣做的好處在於,避免針對每一個監控對象重復編寫內容類似的告警內容。
例如,我們可以在node_alerts.yml中,將annotations中的summary改為
Host {{$labels.instance}} of {{ $labels.job}} ,which process_max_fds is too many!
可以看到,我們在上面這條語句中使用了變量。
八、路由配置
告警進行路由,匹配對應的告警類型,發送告警給指定用戶。
配置alertmanager.yml文件
route: group_bp: ['instance'] #進行告警匯總分類 group_wait: 30s group_interval: 5m repeat_interval: 3h receiver: email routes: #匹配告警等級,將告警發送給指定用戶。當serverity為critical時發送給pager - match: serverity: critical receiver:pager - match_re: servity: ^(waring|critical)$ receiver: suppport_team receivers: - name: 'email' email_configs: - to: 'alerts@example.com' - name : 'support_team' email_configs: - to: 'support@example.com' -name: 'pager' email_configs - to: 'alert-pager@example.com'