github alertmanager 文档
Prometheus Alerting rules
Prometheus alerting configuration
前几篇文章讲了Prometheus的监控,这一篇文章,讲通过监控指标触发告警
常用的告警方式有发邮件、调用指定接口(webhook) 等。本文讲解webhook方式,完成这个示例需要准备4个组件:prometheus、node_exporter、alertmanagers、接受webhook调用的web服务
1
首先准备一个rule_file,机器的近1分钟负载超过0.8,就触发告警。如下:
my_rules.yml:
groups: # 一组告警规则
- name: cpu_gt30 # 这个组的名称
rules: # 下面可以写多条规则
- alert: cpu_usage_high # 告警名称
expr: node_load1 > 0.8 # PromQL 表达式(计算规则)
for: 1m # 持续超标1分钟才触发
labels:
severity: warning # 告警级别,可选字段为warning、critical和emergency
annotations: # 告警的描述信息
summary: "{{$labels.instance}}: 节点CPU使用率过高"
description: "{{$labels.instance}}: CPU使用率超过 80% (当前: {{ $value }}"
上面配置中expr和for是比较重要的。prometheus每隔一段时间就会计算一下expr是否满足触发条件。
如果expr计算结果不满足,这条告警就是inactive状态:
如果计算结果满足这条规则就变成了pending状态:
如果连续1分钟(for配置的值)expr都满足,就会触发告警,变成firing状态
2
修改alertmanager配置文件:
alertmanager.yml
route:
group_by: ['alertname'] # 根据alertname标签进行分组,具有相同标签的告警将被视为一组,聚合成一条发送。alertname标签 对应rule文件里的 alert: cpu_usage_high
group_wait: 30s # 告警分组的时间窗口,如果第一个告警触发后,30秒内又触发了具有相同alertname的告警,它们将被合并为一个告警组
group_interval: 5m # 告警组的刷新间隔。每5分钟,Alertmanager 会重新评估告警组,并将新的告警添加到现有的组中
repeat_interval: 1h # 告警的重复间隔。如果一个告警已经被发送,那么在告警状态没有变化的情况下,它会每隔1小时再次发送
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配置文件为如下内容
prometheus.yml:
global:
... # 省略一些与本节内容无关的配置
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服务,接受webhook调用:
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)
运行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")
然后静待告警触发,你会看到上面3个告警状态的变化,web服务收到的请求参数为:
{'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% (当前: 0.97',
'summary': '192.168.243.99:9100: 节点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% (当前: 0.97',
'summary': '192.168.243.99:9100: 节点CPU使用率过高'},
'externalURL': 'http://master:9093',
'version': '4',
'groupKey': '{}:{alertname="cpu_usage_high"}',
'truncatedAlerts': 0}
等待告警解除后,又会收到一个 告警已解决的通知
{'receiver': 'web.hook', 'status': 'resolved', ...} # 其余部分更上面差不多,就不粘贴出来了