MySQL, Oracle, Linux, 软件架构及大数据技术知识分享平台

网站首页 > 精选文章 / 正文

告警组件Alertmanager

2024-11-30 22:22 huorong 精选文章 9 ℃ 0 评论

过去很长一段时间,一直将Grafana内置告警作为告警的主力,最近有个工作任务:将企业微信作为告警通知媒介。调研后发现Grafana自身不支持直接接入企业微信告警通知,虽然有一些方法可以解决这个问题,如使用webhook或依赖第三方插件重新编译Grafana来使其支持企业微信告警通道,但总觉不太灵活方便,所以就对Alertmanager做了测试,Alertmanager原生支持企业微信作为告警通道。

安装配置Alertmanager

安装比较简单,参考官网(https://prometheus.io/docs/alerting/latest/configuration/),直接下载Alertmanager的二进制文件,后面带上配置文件选项就可以成功启动,

./alertmanager --config.file=alertmanager.yml

这里核心是Alertmanager配置文件,下面是一个示例:

global:
  #旧的告警5分钟没有更新,则认为告警解决
  resolve_timeout: 5m
  wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'
  wechat_api_corp_id: 'API_CORP_ID'
#告警消息模板文件
templates:
  - '/etc/alertmanager/*.tmpl'
#告警通道根路由,没有显示指定通道的告警,将发到该告警通道
route:
  #默认的告警通道
  receiver: defaultTunnel
  #新的告警组被创建后,需要等待1分钟,这段时间内进入通道的告警将被合并发送
  group_wait: 1m
  #控制告警组的发送频率,一条告警消息发送后,等待3分钟,发送第二组告警
  group_interval: 3m
  #如果一条告警已经发送成功,后续相同的告警间隔6分钟发送
  repeat_interval: 6m
  #以“alertname”label为维度划分告警组
  group_by: [alertname]
  routes:
   #匹配告警
    - matchers:
          - developer="dev1"
      #指定告警通道
      receiver: dev1Tunnel

    - matchers:
          - developer="dev2"
      receiver: dev2Tunnel

receivers:
- name: defaultTunnel
  wechat_configs:
  - to_tag: 1
    #告警恢复,发送消息
    send_resolved: true
    message: '{{ template "wechat.message" . }}'
    agent_id: 1000001
    message_type: markdown
    api_secret: API_SECRET

- name: dev1Tunnel
  wechat_configs:
  - to_tag: 2
    send_resolved: true
    message: '{{ template "wechat.message" . }}'
    agent_id: 1000002
    message_type: markdown
    api_secret: API_SECRET

配置文件中有五个键:‘wechat_api_url’、‘wechat_api_corp_id’、‘to_tag’、‘agent_id’、‘api_secret’,通过企业微信后台可以得到,具体配置,可以查询官方网站。

上面的配置文件具有按告警内容区别接受者的能力,我们通过“developer”这个label来区分,这个label可以人为在Prometheus配置文件中添加,后面介绍。

模板文件wechat.tmpl:

{{ define "wechat.message" }}
{{- if gt (len .Alerts.Firing) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
# 报警项: {{ $alert.Labels.alertname }}
{{- end }}
> `===告警详情===` 
> 告警级别: {{ $alert.Labels.severity }}
> 告警详情: <font color="comment">{{ index $alert.Annotations "description" }}{{ $alert.Annotations.message }}</font>
> 故障时间: <font color="warning">{{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}</font>
> 故障实例: <font color="info">{{ $alert.Labels.instance }}</font>
{{- end }}
{{- end }}
{{- if gt (len .Alerts.Resolved) 0 -}}
{{- range $index, $alert := .Alerts -}}
{{- if eq $index 0 -}}
# 恢复项: {{ $alert.Labels.alertname }}
{{- end }}
> `===恢复详情===` 
> 告警级别: {{ $alert.Labels.severity }}
> 告警详情: <font color="comment">{{ index $alert.Annotations "description" }}{{ $alert.Annotations.message }}</font>
> 故障时间: <font color="warning">{{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}</font>
> 恢复时间: <font color="warning">{{ ($alert.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}</font>
> 故障实例: <font color="info">{{ $alert.Labels.instance }}</font>
{{- end }}
{{- end }}
{{- end }}

其中语句“<font color="warning">{{ ($alert.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}</font>”将UTC时间转换成北京时间。

Prometheus配置

Prometheus和Alertmanager是一对黄金搭档,上面的工作完成后,需要修改Prometheus的配置文件,有两个部分:配置Prometheus告警的发送目的地,定义告警规则。

.......
# Alertmanager configuration
alerting:
  alertmanagers:
    - static_configs:
        - targets:
           - 192.168.1.2:9093

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - /etc/prometheus/alerts.rules 
......

告警规则文件alerts.rules,因为真实环境使用blackbox监控Web API的访问情况,这里针对“probe_sucess”指标配置一个告警规则:

groups:
    #告警名称,alertmanager中使用这个键作为分组依据
    - name: Web监控
      rules:
      - alert: Web API不能访问
        expr: probe_success == 0
        #告警事件需要持续1分钟,才能触发告警
        for: 1m
        #自定义label
        labels:
          severity: critical
          developer: dev1
        #告警解释信息
        annotations:
          summary: "{{$labels.instance}}:链接不能访问"
          description: "{{$labels.instance}}:链接超过1分钟无法访问"
......

自定义标签:“developer: dev1”,作为alertmanager路由告警信息的依据。这样就可以根据告警类型来指定接收者。

总结

使用Prometheus和Alertmanager可以搭建满足大部分场景的监控告警栈,而且可以实现根据告警内容指定告警接收者。这里告警接收者需要在企业微信告警后台提前配置好,根据部门或者业务线配置分组,可以选择组ID或标签ID来指定告警接收者。

Tags:alertmanager配置详解

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言