运维监控系列(14)-Alertmanager添加webhook告警通知功能

前言

在之前,我们安装了Alertmanager,并使用在promethues中添加了对Alertmanager的监控功能。

接下需要实现告警通知了,当发现异常时,将告警信息通知给相关人员,其流程如下:
 
Alertmanager支持多种通知方式,也就是支持多种通知接受者receiver:

  • webhook:web回调或者http服务的推送API接口
  • wechat:通过微信 API发送
  • VictorOps :VictorOps API发出
  • OpsGenie :通过OpsGenie API发送
  • sns:短信
  • Slack :通过Slack webhooks发送。该通知包含一个附件
  • Pushover :通过Pushover API发送
  • PagerDuty :通过PagerDuty API发送
  • email:电子邮件

实现webhook推送告警信息

接下来使用webhook方式,实现告警信息接受。

之前也说过设置警报和通知的主要步骤:

  • 配置 Prometheus与 Alertmanager对接
  • 在 Prometheus 中创建警报规则
  • 设置和配置Alertmanager

1. 配置 Prometheus与 Alertmanager对接

要实现Prometheus向Alertmanager中发送信息,只需要配置alertmanager连接地址即可。

修改prometheus.yml,添加alertmanager地址:

# Alertmanager配置 
alerting:
  alertmanagers:
  - static_configs:
    # 配置alertmanager连接地址
    - targets: ['localhost:9093']

2. Prometheus添加告警规则

在实际环境中,告警规则肯定有很多,比如对服务器异常进行告警,就有宕机、CPU使用率超过100%、内存使用率超过80%、硬盘使用率超过80%等等。

所以,我们需要创建一个文件夹,针对每个监控对象,创建一个配置文件。

这里直接在Prometheus的程序主目录下创建一个alert_rules文件夹,用于存放所有的告警规则。
 
然后在alert_rules目录下创建一个alert_nacos.yml文件,用于创建nacos相关的告警规则。

然后再prometheus.yml配置中,添加规则文件目录,prometheus启动时,会在alert_rules和rules目录下,查找规则配置文件并加载。

# 服务器加载规则文件的位置
rule_files:
 - "rules/*.yml"
 - "alert_rules/*.yml"

编辑alert_nacos.yml配置,添加如下规则,针对Nacos宕机时,发送告警通知到Alertmanager。

# 相关的规则设置定义在一个group下。在每一个group中我们可以定义多个告警规则(rule)
groups:
# name:组名。报警规则组名称
- name: alters
  # rules:定义规则
  rules:
  # alert:告警规则的名称
  - alert: Nacos Down
    # expr:基于PromQL表达式告警触发条件,用于计算是否有时间序列满足该条件。
    expr: up{
   
     job="nacos"} == 0
    # for:评估等待时间,可选参数。用于表示只有当触发条件持续一段时间后才发送告警。在等待期间新产生告警的状态为pending。
    for: 1m
    # labels:自定义标签,允许用户指定要附加到告警上的一组附加标签。
    labels:
      # severity: 指定告警级别。有三种等级,分别为warning、critical和emergency。严重等级依次递增。
      severity: emergency
      target: nacos
    # annotations: 附加信息,比如用于描述告警详细信息的文字等,annotations的内容在告警产生时会一同作为参数发送到Alertmanager。
    annotations:
      # summary描述告警的概要信息
      # description用于描述告警的详细信息。
      description: "description"
      summary: "{
   
     { $labels.instance }} 已停止运行超过 1 分钟!"

重启Prometheus,查看控制台,发现当前规则已被激活,也可以看到详细的规则信息。
 
还可以通过Rules菜单,查看规则信息及状态,这里可以看到当前规则信息、状态、错误信息、上次执行时间、执行耗时等信息。
 

3. Alertmanager配置webhook告警通知

使用Spring boot创建一个web项目,提供一个API接口,用于接收告警通知。

@RestController
@RequestMapping("/alertmanager")
public class AlertmanagerController {
   
     

    @RequestMapping("/hook")
    public Object hook(@RequestBody String body){
   
     
        System.out.println("接受到告警信息:"+body);
        System.out.println("告警信息发送到数据库。。。");
        return "success";
    }
}

在alertmanager.yml中添加route及receivers配置,webhook_configs中的url配置配我们提供了webhook接口地址。

# 全局配置,全局配置,包括报警解决后的超时时间、SMTP 相关配置、各种渠道通知的 API 地址等等。
global:
  # 告警超时时间
  resolve_timeout: 5m
# 路由配置,设置报警的分发策略,它是一个树状结构,按照深度优先从左向右的顺序进行匹配。
route:
  # 用于将传入警报分组在一起的标签。
  # 基于告警中包含的标签,如果满足group_by中定义标签名称,那么这些告警将会合并为一个通知发送给接收器。
  group_by: ['alertname']
  # 发送通知的初始等待时间
  group_wait: 30s
  # 在发送有关新警报的通知之前需要等待多长时间 
  group_interval: 5m
  # 如果已发送通知,则在再次发送通知之前要等待多长时间,通常约3小时或更长时间
  repeat_interval: 30s
  # 接受者名称
  receiver: 'web.hook'
# 配置告警消息接受者信息,例如常用的 email、wechat、slack、webhook 等消息通知方式
receivers:
# 接受者名称
- name: 'web.hook'
  # webhook URL
  webhook_configs:
  - url: 'http://127.0.0.1:9111/alertmanager/hook'

重新启动,查看控制台,当前是没有信息提示的。

 

4. 测试

关掉监控的Nacos程序,

 
发现当前告警规则,从Inactive转为了Pending状态,也就是从正常监控未激活警报状态,转为了已满足触发条件,但没有满足发送时间条件状态,当经过了rules.for配置的时间后,当前告警还在触发,则会进入Firing状态触发警报,将通知发给Alertmanager。

 
查看Alertmanager控制台,发现收到了一条告警通知。
 
在查看我们定义的webhook,收到了告警信息,因为这里设置的repeat_interval为30S,所以只要当前告警存在,就是每半分钟发送一次。
 
当前收到的告警信息,其结构如下,我们可以根据接收的信息,再通过自己的应用程序采用不同的方式发送给运维人员。

{
   
     
    "receiver":"web\\.hook",
    "status":"firing",
    "alerts":[
        {
   
     
            "status":"firing",
            "labels":{
   
     
                "alertname":"Nacos Down",
                "instance":"localhost:8848",
                "job":"nacos",
                "severity":"emergency",
                "target":"nacos"
            },
            "annotations":{
   
     
                "description":"description",
                "summary":"localhost:8848 已停止运行超过 1 分钟!"
            },
            "startsAt":"2021-09-22T02:23:24.38636357Z",
            "endsAt":"0001-01-01T00:00:00Z",
            "generatorURL":"http://DESKTOP-GQBQ1GQ:9090/graph?g0.expr=up%7Bjob%3D%22nacos%22%7D+%3D%3D+0\u0026g0.tab=1",
            "fingerprint":"451c9ca7ae1697e6"
        }
    ],
    "groupLabels":{
   
     
        "target":"nacos"
    },
    "commonLabels":{
   
     
        "alertname":"Nacos Down",
        "instance":"localhost:8848",
        "job":"nacos",
        "severity":"emergency",
        "target":"nacos"
    },
    "commonAnnotations":{
   
     
        "description":"description",
        "summary":"localhost:8848 已停止运行超过 1 分钟!"
    },
    "externalURL":"http://DESKTOP-GQBQ1GQ:9093",
    "version":"4",
    "groupKey":"{}:{target=\"nacos\"}",
    "truncatedAlerts":0
}

版权声明:本文不是「本站」原创文章,版权归原作者所有 | 原文地址: