報警機制
prometheus觸發一條告警的過程:
prometheus--->觸發閾值--->超出持續時間--->alertmanager--->分組|抑制|靜默--->媒體類型--->郵件|釘釘|微信等。
分組(group): 將類似性質的警報合並為單個通知;如web服務是一組、cpu是一組,不用發多個cpu超出范圍的報警,只發單個cpu組的報警
靜默(silences): 是一種簡單的特定時間靜音的機制,例如:服務器要升級維護可以先設置這個時間段告警靜默,否則在代碼升級時,會觸發一些報警,代碼升級時可以先設置靜默,關閉期間的報警。
抑制(inhibition): 當警報發出后,停止重復發送由此警報引發的其他警報即合並一個故障引起的多個報警事件,可以消除冗余告警。如一個交換機上有3個節點,但由於交換機故障,導致3個節點網絡也不通,所以只發交換機的報警,而不發3個節點的網絡報警,因為是由於交換機故障而導致節點不能正常通信,不必要發一堆報警,此種也稱為報警依賴。

部署alertmanager
https://prometheus.io/docs/alerting/configuration/ #alertmanager配置文件參考文檔
alertmanager可以單獨裝在一台服務器上;alertmanager默認監聽端口是9093
1、cd /usr/local/src
2、tar xvf alertmanager-0.20.0.linux-amd64.tar.gz
3、ln -sv /usr/local/src/alertmanager-0.20.0.linux-amd64 /usr/local/alertmanager
4、cd /usr/local/alertmanager
5、vim alertmanager.yml
global:
resolve_timeout: 5m #超時時間
smtp_smarthost: 'smtp.qq.com:465' #smtp服務器地址
smtp_from: '903660570@qq.com' #發件人
smtp_auth_username: '903660570@qq.com' #登錄認證的用戶名
smtp_auth_password: 'nihwoufvezufbdig' #登錄的授權碼
smtp_hello: '@qq.com'
smtp_require_tls: false #是否使用tls
route: #route用來設置報警的分發策略,由誰去發
group_by: ['alertname'] #采用哪個標簽來作為分組依據
group_wait: 10s #組告警等待時間。也就是告警產生后等待10s,一個組內的告警10s后一起發送出去
group_interval: 10s #兩組告警的間隔時間
repeat_interval: 2m #重復告警的間隔時間,減少相同郵件的發送頻率
receiver: 'web.hook' #設置接收人;真正發送郵件不是由route完成,而是由receiver發送郵件
receivers:
- name: 'web.hook'
#webhook_configs: #調用指定的API把郵件發送出去
#- url: 'http://127.0.0.1:5001/'
email_configs: #通過郵件的方式發送
- to: '903660570@qq.com' #接收人
inhibit_rules: #禁止的規則
- source_match: #源匹配級別;以下設置的級別的報警不會發送
severity: 'critical'
target_match: #目標匹配級別
severity: 'warning'
equal: ['alertname', 'dev', 'instance']
6、vim /etc/systemd/system/alertmanager.service
[Unit]
Description=Prometheus AlertManager
Documentation=https://prometheus.io/docs/introduction/overview/
After=network.target
[Service]
Restart=on-failure
ExecStart=/usr/local/alertmanager/alertmanager --config.file=/usr/local/alertmanager/alertmanager.yml
[Install]
WantedBy=multi-user.target
7、systemctl start alertmanager.service
8、systemctl enable alertmanager.service
prometheus需要的配置
https://prometheus.io/docs/alerting/notification_examples/ #rule規則參考文檔
1、vim /usr/local/prometheus/prometheus.yml
alerting: #當觸發告警時,把告警發送給下面所配置的服務
alertmanagers: #當出告警時,把告警通知發送給alertmanager
- static_configs:
- targets:
- 192.168.3.146:9093 #指定alertmanager地址及端口
rule_files: #報警規則文件
- "/usr/local/prometheus/linux_rules.yml" #指定報警的rule文件所在路徑
2、vim /usr/local/prometheus/linux_rules.yml #編輯rule文件
groups:
- name: linux_pod.rules #指定名稱
rules:
- alert: Pod_all_cpu_usage #相當於zabbix中的監控項;也是郵件的標題
expr: (sum by(name)(rate(container_cpu_usage_seconds_total{image!=""}[5m]))*100) > 75 #promql查詢語句查詢到所有pod的CPU利用率與后面的值做對比,查詢到的是浮點數,需要乘以100,轉換成整數
for: 5m #每5分鍾獲取一次POD的CPU利用率
labels:
severity: critical
service: pods
annotations: #此為當前所有容器的CPU利用率
description: 容器 {{ $labels.name }} CPU 資源利用率大於 75% , (current value is {{ $value }}) #報警的描述信息內容
summary: Dev CPU 負載告警
- alert: Pod_all_memory_usage
expr: sort_desc(avg by(name)(irate(container_memory_usage_bytes{name!=""} [5m]))*100) > 1024^3*2 #通過promql語句獲取到所有pod中內存利用率;將后面的單位G轉換成字節
for: 10m
labels:
severity: critical
annotations:
description: 容器 {{ $labels.name }} Memory 資源利用率大於 2G , (當前已用內存是: {{ $value }})
summary: Dev Memory 負載告警
- alert: Pod_all_network_receive_usage
expr: sum by (name)(irate(container_network_receive_bytes_total{container_name="POD"}[1m])) > 1024*1024*50
for: 10m #獲取的所有pod網絡利用率是字節,所以把后面對比的Mb轉換成字節
labels:
severity: critical
annotations:
description: 容器 {{ $labels.name }} network_receive 資源利用率大於 50M , (current value is {{ $value }}) #這些promql語句都是通過grafana,找到相應的監控項,點擊edit找到相應的promql語句即可
3、systemctl restart prometheus.service
4、通過訪問prometheus的web界面確認rule規則是否構建成功

5、查看構建的rule規則是否能夠顯示出來,能夠看到rule規則,則表示構建成功

6、驗證郵箱是否收到郵件
測試
1、./promtool check rules linux_rules.yml #檢查rule文件語法是否正確
2、./amtool alert --alertmanager.url=http://192.168.3.146:9093 #列出當前alertmanager服務器的所有告警