程序员小王

V1

2022/03/19阅读:144主题:默认主题

AlertManager实现webhook告警(使用Postman测试)

🍅程序员小王的博客:程序员小王的博客 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 如有编辑错误联系作者,如果有比较好的文章欢迎分享给我,我会取其精华去其糟粕 🍅java自学的学习路线:java自学的学习路线 🍋相关学习资料及其参考文章:prometheus手册邮件和微信告警Alertmanager篇 🍊 可以去个人博客网站查看本博客排版更清晰:AlertManager

一、前言

公司想开发一个统一告警平台,需要AlertManager实现告警分析部分,然后就开始了我的AlertManager学习之路了🤣!

然后AlterManager是Prometheus(普罗米修斯)的一部分,在 Prometheus 中告警分为两部分:

  • Prometheus 服务根据所设置的告警规则将告警信息发送给 Alertmanager。
  • Alertmanager 对收到的告警信息进行处理,包括去重,降噪,分组,策略路由告警通知。

二、AlertManager简介

Alertmanager 主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,而且很容易做到告警信息进行去重,降噪,分组等,是一款前卫的告警通知系统。但是我们公司内部不使用Prometheus,只使用AlertManager.

1、AlertManager工作机制

Prometheus会根据配置的参数周期性的对警报规则进行计算, 如果满足警报条件,生产一条警报信息,将其推送到 Alertmanager 组件,Alertmanager 收到警报信息之后,会对警告信息进行处理,进行 分组 Group 并将它们通过定义好的路由 Routing 规则转到 正确的接收器 receiver, 比如 Email Slack 钉钉、企业微信 Robot(webhook) 企业微信 等,最终异常事件 WarningError通知给定义好的接收人,其中如钉钉是基于第三方通知来实现的,对于通知人定义是在钉钉的第三方组件中配置。

  • prometheus触发一条告警的过程:

prometheus—>触发阈值—>超出持续时间—>alertmanager—>分组|抑制|静默—>媒体类型—>邮件|钉钉|微信等。

2、AlertManager的三个概念

(1)分组

GroupingAlertmanager 把同类型的警报进行分组,合并多条警报到一个通知中。在生产环境中,特别是云环境下的业务之间密集耦合时,若出现多台 Instance 故障,可能会导致成千上百条警报触发。在这种情况下使用分组机制, 可以把这些被触发的警报合并为一个警报进行通知,从而避免瞬间突发性的接受大量警报通知,使得管理员无法对问题进行快速定位。

  • 举例:

就是一个集群部署中,有一半的服务实例不再可以访问数据库,Prometheus中的警报规则配置为在每个服务实例无法与数据库通信时为其发送警报。结果,数百个警报被发送到Alertmanager。作为运维组或者相关业务组的开发人员,可能更关心的是在一个通知中就可以快速查看到哪些服务实例被本次故障影响了。为此,我们对服务所在集群或者服务警报名称的维度进行分组配置,把警报汇总成一条通知时,就不会受到警报信息的频繁发送影响了。

(2)抑制

Inhibition指当警报发出后,停止重复发送由此警报引发其他错误的警报的机制。

  • 举例:

当警报被触发,通知整个集群不可达,可以配置Alertmanager忽略由该警报触发而产生的所有其他警报,这可以防止通知数百或数千与此问题不相关的其他警报。抑制机制可以通过Alertmanager的配置文件来配置。

(3)静默

Silences 提供了一个简单的机制,根据标签快速对警报进行静默处理;对传进来的警报进行匹配检查,如果接受到警报符合静默的配置,Alertmanager 则不会发送警报通知。

  • 注意:以上除了分组、抑制是在 Alertmanager 配置文件中配置,静默是需要在 WEB UI 界面中设置临时屏蔽指定的警报通知。

三、安装AlertManager

1、下载AlertManager

[root@localhost soft]# yum -y install wget
  • 在linux下载,我选择的是 v0.21.0这个版本(命令中的 \代表换行,因为命令太长可以使用 \换行)
[root@localhost soft]# wget https://github.com   \
                       /prometheus/alertmanager/releases/download/  \
                       v0.21.0/alertmanager-0.21.0.linux-amd64.tar.gz   \
  • 下载途中报错,请重新下载即可

2、安装AlertManager

  • 直接解压
[root@localhost soft]# tar xvf alertmanager-0.21.0.linux-amd64.tar.gz
  • 移动到/usr/apps下面
mv /usr/soft/alertmanager-0.21.0.linux-amd64 /usr/apps/alertmanager
  • AlertManager的目录结构
├── alertmanager
│   
├── alertmanager.yml
├──  amtool  
├── LICENSE
├── NOTICE

  • 查看版本信息
[root@localhost alertmanager]# /usr/apps/alertmanager/alertmanager --version

3、启动Alertmanager

[root@localhost alertmanager]# ./alertmanager --config.file=alertmanager.yml

4、查看Alertmanager运行状态

四、AlertManager的参数

参数 描述
--config.file="alertmanager.yml" 指定Alertmanager配置文件路径
--data.retention=120h 历史数据保留时间,默认为120h
--alerts.gc-interval=30m 警报gc之间的间隔
--web.external-url=WEB.EXTERNAL-URL 外部可访问的Alertmanager的URL(例如Alertmanager是通过nginx反向代理)
--web.route-prefix=WEB.ROUTE-PREFIX wen访问内部路由路径,默认是 --web.external-url
--web.listen-address=":9093" 监听端口,可以随意修改
--web.get-concurrency=0 并发处理的最大GET请求数,默认为0
--web.timeout=0 web请求超时时间
--cluster.listen-address="0.0.0.0:9094" 集群的监听端口地址。设置为空字符串禁用HA模式
--cluster.advertise-address=CLUSTER.ADVERTISE-ADDRESS 配置集群通知地址
--cluster.gossip-interval=200ms 发送条消息之间的间隔,可以以增加带宽为代价更快地跨集群传播。
--cluster.peer-timeout=15s 在同级之间等待发送通知的时间
--log.level=info 自定义消息格式 [debug, info, warn, error]
--log.format=logfmt 日志消息的输出格式: [logfmt, json]
--version 显示版本号

五、Webhook配置

[root@localhost alertmanager]# vim alertmanager.yml

1、初始配置详情:Webhook

  ## 1.Alertmanager 配置文件
   global:
     resolve_timeout: 5m
     
  ## 2.route:路由分组
   route:
   #(1)用于分组聚合,对告警通知按标签(label)进行分组,将具有相同标签或相同告警名称(alertname)的告警通知聚合在一个组,然后作为一个通知发送。
   #   如果想完全禁用聚合,可以设置为group_by: [...]
     group_by: ['alertname']  #报警分组
    #(2)当一个新的告警组被创建时,需要等待'10s'后才发送初始通知。
    #    这样可以确保在发送等待前能聚合更多具有相同标签的告警,最后合并为一个通知发送。
     group_wait: 10s 
    #(3)当第一次告警通知发出后,在新的评估周期(interval:间隔)内又收到了该分组最新的告警
    #    则需等待'10s'时间后,开始发送为该组触发的新告警,可以简单理解为,group就相当于一个通道(channel)。
     group_interval: 10s
    #(4)告警通知成功发送后,若问题一直未恢复,需再次重复发送的间隔。
     repeat_interval: 1h
    #(5)配置告警消息接收者,与下面配置的对应。例如常用的 email、wechat、slack、webhook 等消息通知方式。
    #   Webhook:比如你的好友发了一条朋友圈,后端将这条消息推送给所有其他好友的客户端,就是 Webhook 的典型场景。    
     receiver: 'web.hook'
    #(6)这里还可以加入子路由
      -routes:  
       receiver: 'wechat'
       match:  # 通过标签去匹配这次告警是否符合这个路由节点;也可以使用  match_re 进行正则匹配
       severity: Disaster  # 标签severity为Disaster时满足条件,使用wechat警报

 ##3.配置报警信息接收者信息。
  receivers:
  #(1)警报接收者名称
  - name: 'web.hook'
    webhook_configs:
  # (2)webhook的路径
    - url: 'http://127.0.0.1:5001/'
  # (3)抑制规则配置,当存在与另一组匹配的警报(源)时,抑制规则将禁用与一组匹配的警报(目标)。
  inhibit_rules:
    - source_match:
        severity: 'critical'
      target_match:
        severity: 'warning'
      equal: ['alertname', 'dev', 'instance']

(1)Route用来设置报警的分发策略。

Prometheus的告警先是到达alertmanager的根路由(route),alertmanager的根路由不能包含任何匹配项,因为根路由是所有告警的入口点。

(2)receiver:接收器

用来处理那些没有匹配到任何子路由的告警(如果没有配置子路由,则全部由根路由发送告警),即缺省接收器。告警进入到根route后开始遍历子route节点,如果匹配到,则将告警发送到该子route定义的receiver中,然后就停止匹配了。因为在route中continue默认为false,如果continue为true,则告警会继续进行后续子route匹配。如果当前告警仍匹配不到任何的子route,则该告警将从其上一级(匹配)route或者根route发出(按最后匹配到的规则发出邮件)。

(3)无注释版本,可直接使用

   global:
     resolve_timeout: 5m
   
   route:
     group_by: ['alertname']
     group_wait: 10s
     group_interval: 10s
     repeat_interval: 1h
     receiver: 'web.hook'
  receivers:
  - name: 'web.hook'
    webhook_configs:
    - url: 'http://127.0.0.1:5001/'
  inhibit_rules:
    - source_match:
        severity: 'critical'
      target_match:
        severity: 'warning'
      equal: ['alertname', 'dev', 'instance']

六、使用postman和Shell测试

1、使用Shell发送测试

(1)新建Shell 脚本

#!/usr/bin/env bash
alerts_message='[
  {
    "labels": {
       "alertname": "磁盘已满",
       "dev": "sda1",
       "instance": "实例1",
       "msgtype": "testing"
     },
     "annotations": {
        "info": "程序员小王提示您:这个磁盘sda1已经满了,快处理!",
        "summary": "请检查实例示例1"
      }
  },
  {
    "labels": {
       "alertname": "磁盘已满",
       "dev": "sda2",
       "instance": "实例1",
       "msgtype": "testing"
     },
     "annotations": {
        "info": "程序员小王提示您:这个磁盘sda2已经满了,快处理!",
        "summary": "请检查实例示例1",
        "runbook": "以下链接http://test-url应该是可点击的"
      }
  }
]'


(2)发送测试

  • 通过http进行测试
[root@localhost ~]# curl -XPOST -d"$alerts_message" http://127.0.0.1:9093/api/v1/alerts
  • 测试结果

2、通过postman测试

  • postman的使用攻略,可以参考我原来发的博客:[postman接口测试工具的使用攻略](https://blog.csdn.net/weixin_44385486/article/details/122224086?ops_request_misc=%!B(MISSING)%!r(MISSING)equest%!F(MISSING)id%253A%!(NOVERB)
  • 我们将使用PostMan模拟Prometheus向AlertManager发送告警,然后用我们自已写的程序接收AlertManager发出来的通知。
  • 本文中,我们的测试主要来验证AlertManager中Group的机制,以及的三个配置参数的效果:group_waitgroup_intervalrepeat_interval

(1)测试选择post,然后输入http://ip/api/v2/alerts

(2)选择json格式

  • json
[
  {
    "labels": {
       "alertname""系统连续崩溃,已经出现雪崩状况!",
       "dev""sda1",
       "instance""实例1",
       "msgtype""testing"
     },
     "annotations": {
        "info""程序员小王提示您:这个系统雪崩了,快处理!",
        "summary""请检查实例示例1"
      }
  },
  {
    "labels": {
       "alertname""管理系统损坏",
       "dev""sda2",
       "instance""实例1",
       "msgtype""testing"
     },
     "annotations": {
        "info""程序员小王提示您:电子商务管理系统中订单,仓库模块已经雪崩,快处理!",
        "summary""请检查实例示例1",
        "runbook""以下链接http://192.168.5.128:9093/api/v2/alerts应该是可点击的"
      }
  }
]

(3)测试成功

  • 返回1代表成功
  • 查看页面

七、最后的话

AlertManager实现webhook告警(使用Postman测试),主要讲述了原始的配置及测试,但是在公司使用主要还是要借助于AlertManager实现email,钉钉,微信告警,这样开发人员才能快速上手处理,所以后续,将在明后两天写出

🥕AlertManager实现邮件告警相关配置 🪀AlertManager实现微信告警相关配置 🔴后续如果有时间会出一篇:AlertManager实现钉钉告警

  • 写这篇博客码字不易,因为alertmanager目前在网上资料较少,这这篇博客花了一天的时间,如果您感觉这篇文章对您有帮助,需要你帮我点个一键三连💞,也算是对我小小的鼓励!❤️
  • pdf版本或者.md版本文件下载地址:https://download.csdn.net/download/weixin_44385486/85005835

分类:

后端

标签:

Java

作者介绍

程序员小王
V1