暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一文带你简单玩转AlertManager警报组件

不背锅运维 2022-06-09
703

写在开篇的警报概述

!! Prometheus警报分为两部分:警报规则、警报管理器(AlertManager),警报规则向警报管理器发送警报,由Alertmanager组件管理警报消息,比如分组、抑制、去重等。

主要配置步骤

设置警报和通知的主要步骤是:

  1. 安装和配置警报管理器(Alertmanager)
  2. 配置Prometheus对接Alertmanager(警报组件)
  3. 在Prometheus中创建警报规则

开始安装警报管理器

  1. 下载警报管理
wget https://github.com/prometheus/alertmanager/releases/download/v0.23.0/alertmanager-0.23.0.linux-amd64.tar.gz

  1. 启动
./alertmanager --config.file=alertmanager.yml

!! 说明:通过./alertmamager --help可查看到一堆的启动参数,请根据需求增加启动参数即可。

配置警报规则

  1. 在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']

  1. 在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秒"

  1. 访问prometheus的web页面中可查看rules
  • http://192.168.11.159:9090/rules
  1. 访问警报组件的WEB页面中查看已经触发的告警
  • http://192.168.11.159:9093/#/alerts

自定义告警配置

!! 使用python手写webhook完成告警接收,以及编写推送逻辑,可推送到其他第三方平台、微信、钉钉、邮件等。

  1. 在警报组件中配置告警消息发往的接口地址, 让其可以调用接口,配置方式很简单,只需要指定一下接口地址即可
  • 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

  1. 用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)

  1. 此时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}

写在最后

!! 因笔者时间有限,工作很忙,抽空发发水文。关于更多的警报消息的管理功能,后续会逐一分享,今晚就此搁笔。望多多关注、点赞、转发!


文章转载自不背锅运维,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论