Alertmanager主要用于接收 Prometheus 发送的告警信息,它支持丰富的告警通知渠道,而且很容易做到告警信息进行去重,降噪,分组,策略路由,是一款前卫的告警通知系统。

安装使用

1、获取二进制安装包,直接去prometheus官方去获取就行

export VERSION=0.18.0
wget https://github.com/prometheus/alertmanager/releases/download/v$VERSION/alertmanager-$VERSION.linux-amd64.tar.gz
tar xvf alertmanager-$VERSION.linux-amd64.tar.gz

2、解压成功后,使用 ./alertmanager –version 来检查是否安装成功

3、Alertmanager 默认端口为 9093。

4、配置文件

global:
  resolve_timeout: 2h

route:
  group_by: ['alertname']
  group_wait: 5s
  group_interval: 10s
  repeat_interval: 1h
  receiver: 'webhook'

receivers:
- name: 'webhook'
  webhook_configs:
  - url: 'http://example.com/xxxx'
    send_resolved: true
  • 全局配置(global):用于定义一些全局的公共参数,如全局的SMTP配置,Slack配置等内容;
  • 模板(templates):用于定义告警通知时的模板,如HTML模板,邮件模板等;
  • 告警路由(route):根据标签匹配,确定当前告警应该如何处理;
  • 接收人(receivers):接收人是一个抽象的概念,它可以是一个邮箱也可以是微信,Slack或者Webhook等,接收人一般配合告警路由使用;
  • 抑制规则(inhibit_rules):合理设置抑制规则可以减少垃圾告警的产生

比如使用email告警,配置如下:

global:
  smtp_smarthost: 'smtp.qq.com:587'
  smtp_from: 'xxx@qq.com'
  smtp_auth_username: 'xxx@qq.com'
  smtp_auth_password: 'your_email_password'

route:
  # If an alert has successfully been sent, wait 'repeat_interval' to resend them.
  repeat_interval: 10s    
  #  A default receiver
  receiver: team-X-mails  

receivers:
  - name: 'team-X-mails'
    email_configs:
    - to: 'team-X+alerts@example.org'

5、产生告警,在prometheus下添加 alert.rules 文件,指定告警规则

文件中写入以下简单规则作为示例。

ALERT memory_high
  IF prometheus_local_storage_memory_series >= 0
  FOR 15s
  ANNOTATIONS {
    summary = "Prometheus using more memory than it should {{ $labels.instance }}",
    description = "{{ $labels.instance }} has lots of memory man (current value: {{ $value }}s)",
  }

修改 prometheus.yml 文件

添加以下规则:

rule_files:
  - "alert.rules"

启动AlertManager服务

./Alertmanager -config.file=simple.yml

启动prometheus服务

./prometheus -Alertmanager.url=http://localhost:9093

根据以上步骤设置,此时 “team-X+alerts@example.org” 应该就可以收到 “xxx@qq.com” 发送的告警邮件了。

架构原理

  • 从左上开始,Prometheus 发送的警报到 Alertmanager;
  • 警报会被存储到 AlertProvider 中,Alertmanager 的内置实现就是包了一个 map,也就是存放在本机内存中,这里可以很容易地扩展其它 Provider;
  • Dispatcher 是一个单独的 goroutine,它会不断到 AlertProvider 拉新的警报,并且根据 YAML 配置的 Routing Tree 将警报路由到一个分组中;
  • 分组会定时进行 flush (间隔为配置参数中的 group_interval), flush 后这组警报会走一个 Notification Pipeline 链式处理;
  • Notification Pipeline 为这组警报确定发送目标,并执行抑制逻辑,静默逻辑,去重逻辑,发送与重试逻辑,实现警报的最终投递;