前言
在使用prometheus對linux主機進行監控時,除了通過grafana使用圖形界面查看數據結合自己的運維經驗判斷各個指標數值,從而實現對系統情況的掌握。大多數的情況是通過選擇性的找出特定的關鍵指標配置好對應的altermanager告警通過webbook或其他方式直接推送出來實時的提示相關運維人員。本次功能實現是通過prometheus+node_exporter+alertmanager來接收系統告警并發送至QQ郵箱。
環境準備
提前安裝配置好prometheus+alertmanager+node_exporter環境。
prometheus配置及告警規則配置
prometheus.yml屬性配置
| 屬性 | 描述 |
|---|---|
| scrape_interval | 樣本采集周期,默認為1分鐘采集一次 |
| evaluation_interval | 告警規則計算周期,默認為1分鐘計算一次 |
| rule_files | 指定告警規則的文件 |
| scrape_configs | job的配置項,里面可配多組job任務 |
| job_name | 任務名稱,需要唯一性 |
| static_configs | job_name的配置選項,一般使用file_sd_configs 熱加載配置 |
| file_sd_configs | job_name的動態配置選項,使用此配置可以實現配置文件的熱加載 |
| files | file_sd_configs配置的服務發現的文件路徑列表,支持.json,.yml或.yaml,路徑最后一層支持通配符* |
| refresh_interval | file_sd_configs中的files重新加載的周期,默認5分鐘 |
此處使用rule_files屬性來配置告警文件存放位置
# my global config
global:
scrape_interval: 15s # 采樣周期
evaluation_interval: 15s # 告警規則計算周期
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# 報警規則文件可以指定多個,并且可以使用通配符*
rule_files:
- "rules/*.yml"
# - "second_rules.yml"
此處使用file_sd_configs屬性熱加載配置文件
# 采集job配置
scrape_configs:
- job_name: 'prometheus'
file_sd_configs:
#指定1分鐘加載一次配置
- refresh_interval: 1m
files:
- config_prometheus.json
- job_name: 'node'
file_sd_configs:
- refresh_interval: 1m
files:
- config_exporter.json
- job_name: 'alertmanager'
file_sd_configs:
- refresh_interval: 1m
files:
- config_alertmanager.json
設置報警規則,rules/node_rules.yml
groups:
# 報警組組名稱
- name: node_rule
#報警組規則
rules:
#告警名稱,需唯一
- alert: Server Status
#promQL表達式
expr: up == 0
#滿足此表達式持續時間超過for規定的時間才會觸發此報警
for: 10s
labels:
#嚴重級別
severity: critical
annotations:
#發出的告警標題
summary: "實例 {{ $labels.instance }} 關閉"
#發出的告警內容
description: "系統 {{ $labels.instance }}: 實例關閉"
ip: "{{ $labels.ip }}"
- alert: Memory Usage
expr: 100 - round(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes * 100) > 80
for: 1m
labels:
severity: error
annotations:
summary: "實例 {{ $labels.instance }} 內存使用率過高"
description: "實例內存使用率超過 80% (當前值為: {{ $value }}%)"
ip: "{{ $labels.ip }}"
- alert: CPU Usage
expr: 100 - round(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)* 100) > 80
for: 1m
labels:
severity: error
annotations:
summary: "實例 {{ $labels.instance }} CPU使用率過高"
description: "實例CPU使用率超過 80% (當前值為: {{ $value }}%)"
ip: "{{ $labels.ip }}"
- alert: Disk Usage
expr: 100 - round(node_filesystem_free_bytes{fstype=~"ext3|ext4|xfs"}/node_filesystem_size_bytes {fstype=~"ext4|xfs"}*100) > 80
for: 1m
labels:
severity: error
annotations:
summary: "實例 {{ $labels.instance }} 磁盤使用率過高"
description: "實例磁盤使用率超過 80% (當前值為: {{ $value }}%)"
ip: "{{ $labels.ip }}"
采集任務job配置config_exporter.json配置如下(其他job配置文件類似)
[
{
"targets": [ "192.168.134.131:51007"],
"labels": {
"instance": "192.168.134.131",
"ip": "192.168.134.131"
}
}
]
alertmanager配置
因為我是通過QQ郵箱來發送告警的,所以alertmanager.yml的郵箱配置如下
global:
#超時時間
resolve_timeout: 5m
#smtp地址需要加端口
smtp_smarthost: 'smtp.qq.com:465'
smtp_from: '100000@qq.com'
#發件人郵箱賬號
smtp_auth_username: '100000@qq.com'
#賬號對應的授權碼(不是密碼),QQ郵箱授權碼可以在“設置-賬戶-POP3/SMTP服務”里面找到點擊開啟
smtp_auth_password: 'xxxxxx'
smtp_require_tls: false
route:
group_by: ['alertname']
group_wait: 10s
group_interval: 1m
repeat_interval: 4h
receiver: 'mail'
receivers:
- name: 'mail'
email_configs:
- to: '100000@qq.com'
send_resolved: true
主要事項:
- smtp.qq.com:465 ,端口使用465。其他資料說用587端口也可以。(如果是云服務器,25端口通常是被服務商封閉的,所有也不能使用25端口)
報錯信息:
msg=“Notify for alerts failed” num_alerts=1 err="*notify.loginAuth failed: 530 Must issue a STARTTLS command first." - smtp_require_tls: false 必須加上,因為smtp_require_tls默認為true。
prometheus關聯alertmanager
prometheus.yml中的alerting標簽下配置上alertmanager的地址即可,配置如下:
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets: ['192.168.134.131:9093']
重啟prometheus和alertmanager
配置完報警規則重啟prometheus和alertmanager,訪問http://ip:9090/,點擊alerts就能看到配置的報警信息了,如下:
#重啟軟件,Linux命令
pkill prometheus #kill prometheus軟件進程
ss -alntup | grep -i 9090 #查看確認9090端口是否殺死,該條命令沒有輸出表示進程殺死成功
nohup ./prometheus --config.file=/software/prometheus-2.33.3.linux-amd64/etc/prometheus.yml --storage.tsdb.retention.time=90d --log.level=debug > /software/prometheus-2.33.3.linux-amd64/prometheus.log 2>&1 & #啟動prometheus軟件,指定配置文件設置數據保留時間為90天設置日志級別
ss -alntup | grep -i 9090 #確認9090端口是否啟動,此時命令應該有輸出。
pkill alertmanager #kill alertmanager軟件進程
ss -alntup | grep -i 9093 #查看確認9093端口是否殺死,該條命令沒有輸出表示進程殺死成功
nohup ./alertmanager --config.file=/software/alertmanager/alertmanager.yml --cluster.advertise-address=0.0.0.0:9093 --log.level=debug > /software/alertmanager/alertmanager.log 2>&1 & #啟動alertmanager軟件指定配置文件設置監聽為0.0.0.0:9093設置日志級別
ss -alntup | grep -i 9093 #確認9093端口是否啟動,此時命令應該有輸出。
重啟后訪問http://ip:9090/查看prometheus是否啟動成功,點擊alerts就能看到配置的報警信息了,如下:

重啟后訪問http://ip:9093/查看alertmanager是否啟動成功,如下:

接收測試
磁盤測試
說明:使用dd命令創建一個大文件,文件一定要占用盤存儲空間的80%以上。
dd if=/dev/zero of=/test bs=1024M count=12
prometheus截圖

郵件接收截圖

CPU測試
說明:下載stress軟件,如果你Linux系統總的CPU線程有1個,那么設置測試的CPU一定要超過這個值。一般設置為2-3倍。
stress --cpu 3 --timeout 6000
prometheus截圖

郵件接收截圖

內存測試
說明:下載memtester軟件,根據你實際的內存量設置合適的內存測試值,如你的主機有10G,那么按照設置告警的規則為80%才告警,你可以設置測試內存為9G。測試單位有B K M G自選。
./memtester 700M
prometheus截圖(此時內存和CPU同時超過閾值)

郵件接收截圖

主機down測試
說明:直接對一個監控節點進行關機操作,但是有一個問題prometheus監控是通過客戶端的9100端口監控數據,一旦9100端口不通也會觸發節點down告警。
shutdown -h now
prometheus截圖

郵件接收截圖





