github alertmanager 文檔
Prometheus Alerting rules
Prometheus alerting configuration
前幾篇文章講了Prometheus的監(jiān)控找前,這一篇文章,講通過監(jiān)控指標(biāo)觸發(fā)告警
常用的告警方式有發(fā)郵件、調(diào)用指定接口(webhook) 等档泽。本文講解webhook方式吹菱,完成這個示例需要準(zhǔn)備4個組件:prometheus威鹿、node_exporter踩官、alertmanagers、接受webhook調(diào)用的web服務(wù)
1
首先準(zhǔn)備一個rule_file超歌,機(jī)器的近1分鐘負(fù)載超過0.8砍艾,就觸發(fā)告警。如下:
my_rules.yml:
groups: # 一組告警規(guī)則
- name: cpu_gt30 # 這個組的名稱
rules: # 下面可以寫多條規(guī)則
- alert: cpu_usage_high # 告警名稱
expr: node_load1 > 0.8 # PromQL 表達(dá)式(計算規(guī)則)
for: 1m # 持續(xù)超標(biāo)1分鐘才觸發(fā)
labels:
severity: warning # 告警級別巍举,可選字段為warning脆荷、critical和emergency
annotations: # 告警的描述信息
summary: "{{$labels.instance}}: 節(jié)點(diǎn)CPU使用率過高"
description: "{{$labels.instance}}: CPU使用率超過 80% (當(dāng)前: {{ $value }}"
上面配置中expr和for是比較重要的。prometheus每隔一段時間就會計算一下expr是否滿足觸發(fā)條件懊悯。
如果expr計算結(jié)果不滿足蜓谋,這條告警就是inactive狀態(tài):
如果計算結(jié)果滿足這條規(guī)則就變成了pending狀態(tài):
如果連續(xù)1分鐘(for配置的值)expr都滿足,就會觸發(fā)告警炭分,變成firing狀態(tài)
2
修改alertmanager配置文件:
alertmanager.yml
route:
group_by: ['alertname'] # 根據(jù)alertname標(biāo)簽進(jìn)行分組桃焕,具有相同標(biāo)簽的告警將被視為一組,聚合成一條發(fā)送捧毛。alertname標(biāo)簽 對應(yīng)rule文件里的 alert: cpu_usage_high
group_wait: 30s # 告警分組的時間窗口观堂,如果第一個告警觸發(fā)后,30秒內(nèi)又觸發(fā)了具有相同alertname的告警呀忧,它們將被合并為一個告警組
group_interval: 5m # 告警組的刷新間隔师痕。每5分鐘,Alertmanager 會重新評估告警組而账,并將新的告警添加到現(xiàn)有的組中
repeat_interval: 1h # 告警的重復(fù)間隔胰坟。如果一個告警已經(jīng)被發(fā)送,那么在告警狀態(tài)沒有變化的情況下泞辐,它會每隔1小時再次發(fā)送
receiver: 'web.hook'
receivers:
- name: 'web.hook'
webhook_configs:
- url: 'http://192.168.254.1:5000/alert'
啟動alertmanager ./alertmanager --config.file=./alertmanager.yml
3
修改prometheus配置文件為如下內(nèi)容
prometheus.yml:
global:
... # 省略一些與本節(jié)內(nèi)容無關(guān)的配置
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
- 192.168.243.99:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
- "/my_rules.yml"
使用上述配置文件啟動prometheus
4
起一個web服務(wù)笔横,接受webhook調(diào)用:
from fastapi import FastAPI, Request
import uvicorn
app = FastAPI(debug=False)
@app.post("/alert")
async def print_args(request: Request):
body = await request.json()
print(body)
return {}
if __name__ == '__main__':
uvicorn.run(app, host="0.0.0.0", port=5000)
運(yùn)行python腳本使CPU飆高:
import math
import time
def cpu_intensive_task():
while True:
for i in range(1000000):
math.sqrt(i)
try:
cpu_intensive_task()
except KeyboardInterrupt:
print("exited")
然后靜待告警觸發(fā),你會看到上面3個告警狀態(tài)的變化咐吼,web服務(wù)收到的請求參數(shù)為:
{'receiver': 'web.hook',
'status': 'firing',
'alerts': [{'status': 'firing',
'labels': {'alertname': 'cpu_usage_high',
'instance': '192.168.243.99:9100',
'job': 'node_exporter',
'severity': 'warning'},
'annotations': {
'description': '192.168.243.99:9100: CPU使用率超過 80% (當(dāng)前: 0.97',
'summary': '192.168.243.99:9100: 節(jié)點(diǎn)CPU使用率過高'},
'startsAt': '2024-10-22T14:02:11.03Z',
'endsAt': '0001-01-01T00:00:00Z',
'generatorURL': 'http://f2f05a8126f0:9090/graph?g0.expr=node_load1+%3E+0.8&g0.tab=1',
'fingerprint': 'd3155240a05e4626'}],
'groupLabels': {'alertname': 'cpu_usage_high'},
'commonLabels': {'alertname': 'cpu_usage_high',
'instance': '192.168.243.99:9100',
'job': 'node_exporter',
'severity': 'warning'},
'commonAnnotations': {'description': '192.168.243.99:9100: CPU使用率超過 80% (當(dāng)前: 0.97',
'summary': '192.168.243.99:9100: 節(jié)點(diǎn)CPU使用率過高'},
'externalURL': 'http://master:9093',
'version': '4',
'groupKey': '{}:{alertname="cpu_usage_high"}',
'truncatedAlerts': 0}
等待告警解除后吹缔,又會收到一個 告警已解決的通知
{'receiver': 'web.hook', 'status': 'resolved', ...} # 其余部分更上面差不多,就不粘貼出來了