写在开篇的警报概述
!! Prometheus警报分为两部分:警报规则、警报管理器(AlertManager),警报规则向警报管理器发送警报,由Alertmanager组件管理警报消息,比如分组、抑制、去重等。
主要配置步骤
设置警报和通知的主要步骤是:
- 安装和配置警报管理器(Alertmanager)
- 配置Prometheus对接Alertmanager(警报组件)
- 在Prometheus中创建警报规则
开始安装警报管理器
- 下载警报管理
wget https://github.com/prometheus/alertmanager/releases/download/v0.23.0/alertmanager-0.23.0.linux-amd64.tar.gz
- 启动
./alertmanager --config.file=alertmanager.yml
!! 说明:通过./alertmamager --help可查看到一堆的启动参数,请根据需求增加启动参数即可。
配置警报规则
- 在Prometheus服务器上的prometheus.yml配置文件中引入警报规则文件alert.yml
global: scrape_interval: 1s evaluation_interval: 1s alerting: alertmanagers: - static_configs: - targets: - localhost:9093 rule_files: - "./alert.yml" # 此处引入 scrape_configs: - job_name: 'prometheus_ser' static_configs: - targets: ['192.168.11.159:9090'] - job_name: 'mysql8.0_192.168.11.150' static_configs: - targets: ['192.168.11.150:9104'] - job_name: 'node_192.168.11.159' static_configs: - targets: ['192.168.11.159:9100']
- 在Prometheus服务器上创建alert.yml警报规则配置文件并写入警报规则
groups: - name: Disk alert related group rules: - alert: sdaDiskWriteTime expr: node_disk_write_time_seconds_total{device="sda"} > 5 # 这是在node_export中的一个指标 for: 1s labels: severity: disk annotations: summary: "sda磁盘写入总耗时" description: "sda磁盘写入总耗时大于20秒"
- 访问prometheus的web页面中可查看rules
- 访问警报组件的WEB页面中查看已经触发的告警
自定义告警配置
!! 使用python手写webhook完成告警接收,以及编写推送逻辑,可推送到其他第三方平台、微信、钉钉、邮件等。
- 在警报组件中配置告警消息发往的接口地址, 让其可以调用接口,配置方式很简单,只需要指定一下接口地址即可
- alertmanager.yml
global: resolve_timeout: 5m route: # 不使用分组 group_by: [...] group_wait: 1s group_interval: 1s repeat_interval: 1000d receiver: 'web.hook' receivers: - name: 'web.hook' webhook_configs: - url: 'http://127.0.0.1:5001/webhook' # 这是接口地址 send_resolved: true
- 用python编写一个最简单的接口,让其可以接收来自alertmanager的警报消息
- webhook.py
import json from flask import Flask, request app = Flask(__name__) @app.route('/webhook', methods=['POST']) def webhook(): data = json.loads(request.data) print(data) return 'ok' if __name__ == '__main__': app.run('0.0.0.0', 5001)
- 此时prometheus有告警,就会看到prometheus传过来的数据格式是什么样的了
{'receiver': 'web\\.hook', 'status': 'firing', 'alerts': [{'status': 'firing', 'labels': {'alertname': 'sdaDiskWriteTime', 'device': 'sda', 'instance': '192.168.11.159:9100', 'job': 'node_192.168.11.159', 'severity': 'disk'}, 'annotations': {'description': 'sda磁盘写入总耗时大于5秒', 'summary': 'sda磁盘写入总耗时'}, 'startsAt': '2021-12-01T02:14:17.351244754Z', 'endsAt': '0001-01-01T00:00:00Z', 'generatorURL': 'http://prometheus-ser01:9090/graph?g0.expr=node_disk_write_time_seconds_total%7Bdevice%3D%22sda%22%7D+%3E+5&g0.tab=1', 'fingerprint': '438df1cd4511a1a4'}], 'groupLabels': {'alertname': 'sdaDiskWriteTime', 'device': 'sda', 'instance': '192.168.11.159:9100', 'job': 'node_192.168.11.159', 'severity': 'disk'}, 'commonLabels': {'alertname': 'sdaDiskWriteTime', 'device': 'sda', 'instance': '192.168.11.159:9100', 'job': 'node_192.168.11.159', 'severity': 'disk'}, 'commonAnnotations': {'description': 'sda磁盘写入总耗时大于5秒', 'summary': 'sda磁盘写入总耗时'}, 'externalURL': 'http://prometheus-ser01:9093', 'version': '4', 'groupKey': '{}:{alertname="sdaDiskWriteTime", device="sda", instance="192.168.11.159:9100", job="node_192.168.11.159", severity="disk"}', 'truncatedAlerts': 0}
写在最后
!! 因笔者时间有限,工作很忙,抽空发发水文。关于更多的警报消息的管理功能,后续会逐一分享,今晚就此搁笔。望多多关注、点赞、转发!