通過Alertmanager實現Prometheus的告警

Prometheus本身不支持的告警功能,主要通過插件Alertmanager來實現告警。Alertmanager用於接收Prometheus發送的告警信息並對告警進行一系列的處理後發送給指定的用戶或組。

Prometheus觸發一條告警的過程如下:

prometheus server —>觸發法制—>超出指定時間—>alertmanager—>分組|抑制|靜默—>媒體類型—>郵件|釘釘|微信等等。
在這裏插入圖片描述

一、安裝配置Alertmanager

下載解壓

$ wget https://github.com/prometheus/alertmanager/releases/download/v0.20.0/alertmanager-0.20.0.linux-amd64.tar.gz
tar -zxf alertmanager-0.20.0.linux-amd64.tar.gz -C /usr/local/
$ cd /usr/local/
$ mv alertmanager-0.20.0.linux-amd64 alertmanager

這裏先講一個坑:

Alermanager會將數據保存到本地中,默認的存儲路徑爲data/,我們在啓動文件中直接用--storage.path參數指定,不然會報錯如下:

Jun 01 17:04:56 localhost.localdomain alertmanager[9742]: level=error ts=2020-06-01T09:04:56.626Z caller=main.go:236 msg="Unable to create data directory" err="mkdir data/: permission denied"

創建存儲目錄

mkdir -p /usr/local/alertmanager/data

並用--config.file指定alertmanager配置文件路徑。

創建啓動文件

cat > /usr/lib/systemd/system/alertmanager.service <<EOF
[Unit]
Description=alertmanager
Documentation=https://github.com/prometheus/alertmanager
After=network.target
[Service]
Type=simple
User=prometheus
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml --storage.path=/usr/local/alertmanager/data
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOF

配置告警信息

在配置之前,先備份下alertmanager的配置文件

cp /usr/local/alertmanager/alertmanager.yml /usr/local/alertmanager/alertmanager.yml_bak

然後修改alertmanager.yml

$ cat alertmanager.yml
global:
  resolve_timeout: 5m
  smtp_smarthost: 'smtp.163.com:25'
  smtp_from: '[email protected]'
  smtp_auth_username: '[email protected]'
  smtp_auth_password: 'PNRUAELMPDOMTEMP' # 這裏是郵箱的授權密碼,不是登錄密碼
  smtp_require_tls: false

route:   # route用來設置報警的分發策略
  group_by: ['alertname']  # 採用哪個標籤來作爲分組依據
  group_wait: 30s   # 組告警等待時間。也就是告警產生後等待10s,如果有同組告警一起發出
  group_interval: 10s  # 兩組告警的間隔時間
  repeat_interval: 20m  # 重複告警的間隔時間,減少相同郵件的發送頻率
  receiver: 'default-receiver'  # 設置默認接收人
  routes:   # 可以指定哪些組接收哪些消息
  - receiver: 'default-receiver'  
    continue: true
    group_wait: 10s
  - receiver: 'ding-receiver'  
    group_wait: 10s
    match_re:  # 根據標籤分組,匹配標籤dest=hzjf的爲ding-receiver組
      dest: hzjf

receivers:
- name: 'default-receiver'
  email_configs:
  - to: '[email protected]'
- name: "ding-receiver"
  webhook_configs:
  - url: 'http://xx.xx.xx.xx/dingtalk'
    send_resolved: true

啓動Alertmanager

$ chown -R prometheus:prometheus /usr/local/alertmanager
$ systemctl daemon-reload
$ systemctl start alertmanager.service
$ systemctl enable alertmanager.service
$ systemctl status alertmanager.service
$ ss -tnl|grep 9093

web ui查看 : http://alertmanager_ip:9093

然後再說一個坑:上面配置了使用郵件報警,但是在發送郵件的時候會有報錯Jun 05 13:35:21 localhost.localdomain postfix/sendmail[9446]: fatal: parameter inet_interfaces: no local interface found for ::1,需要改一下postfix的配置文件:

vim /etc/postfix/main.cf
# 把
inet_interfaces = localhost
# 改爲
inet_interfaces = all
# 即可

二、配置Prometheus與Alertmanager通信

vim /usr/local/prometheus/prometheus.yml

alerting:
  alertmanagers:  # 配置alertmanager
  - static_configs:
    - targets:
      - 127.0.0.1:9093  #alertmanager服務器ip端口

rule_files:      # 告警規則文件
  - 'rules/*.yml'

三、配置報警規則

上面已經定義了,把報警規則的定義文件放在rules目錄下,所以先要創建這個目錄:

mkdir -p /usr/local/prometheus/rules

然後來創建報警規則,這裏我們創建三個報警規則:

cat > /usr/local/prometheus/rules/node.yml <<"EOF"
groups:
- name: hostStatsAlert
  rules:
  - alert: InstanceDown
    expr: up == 0
    for: 30s
    labels:
      severity: critical
    annotations:
      summary: "Instance {{ $labels.instance }} down"
      description: "{{ $labels.instance }} of job {{ $labels.job }} has been down for more than 30 seconds."
      
  - alert: hostCpuUsageAlert
    expr: 100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100) > 85
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "Instance {{ $labels.instance }} CPU usgae high"
      description: "{{ $labels.instance }} CPU usage above 85% (current value: {{ $value }})"
      
  - alert: hostMemUsageAlert
    expr: 100 - (node_memory_MemFree_bytes+node_memory_Cached_bytes+node_memory_Buffers_bytes) / node_memory_MemTotal_bytes * 100 > 85
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "Instance {{ $labels.instance }} MEM usgae high"
      description: "{{ $labels.instance }} MEM usage above 85% (current value: {{ $value }})"
EOF
  • alert:報警規則名稱
  • expr:基於PromQL表達式告警觸發條件,用於計算是否有時間序列滿足該條件。
  • for:評估等待時間,可選參數。用於表示只有當觸發條件持續一段時間後才發送告警。在等待期間新產生告警的狀態爲pending。
  • labels:自定義標籤,允許用戶指定要附件到告警上的一組附加標籤
  • annotations:用於指定一組附加信息,比如用於描述告警詳細信息的文字等,annotations的內容在告警產生時會一同作爲參數發送到Alertmanager。

檢查告警規則

$ /usr/local/prometheus/promtool check rules /usr/local/prometheus/rules/node.yml 
Checking /usr/local/prometheus/rules/node.yml
  SUCCESS: 3 rules found

重啓prometheus使告警規則生效。

$ chown -R prometheus:prometheus /usr/local/prometheus/rules
$ systemctl restart prometheus

四、驗證

首先在prometheus界面的alert可以看到配置的3條報警規則。
在這裏插入圖片描述

1、驗證InstanceDown報警規則

停止192.168.0.182節點上的node_exporter服務,然後查看效果。

$ systemctl stop node_exporter

在這裏插入圖片描述

  • 綠色表示正常。
  • 紅色狀態爲PENDING表示alerts還沒有發送至Alertmanager,因爲rules裏面配置了for: 30s
  • 30s之後狀態由PENDING變爲FIRING,此時,prometheus纔將告警發給alertmanager,在Alertmanager中可以卡看到有一個aleret。

收到郵件:
在這裏插入圖片描述

2、驗證

我們可以手動拉高系統的CPU使用率:

cat /dev/zero>/dev/null

運行命令後cpu使用量會迅速上升。
在這裏插入圖片描述
收到郵件:
在這裏插入圖片描述

參考文章:
https://www.cnblogs.com/xiaobaozi-95/p/10740511.html
https://www.bookstack.cn/read/prometheus-book/alert-prometheus-alert-rule.md

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