Prometheus部署AlertManager告警(附邮件和微信示例)

Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB),使用Go语言开发,比Heapster功能更完善、更全面,其性能也足够支撑上万台规模的集群。

AlertManager主要用于接收Prometheus发送的告警信息,支持丰富的告警通知渠道,例如邮件、微信、钉钉、Slack等常用的沟通工具,而且很容易实现对告警信息进行去重、降噪、分组等,是一款非常好用的告警通知系统。

部署AlertManager

下载

访问Prometheus官方下载页面,下载对应的版本。

wget https://github.com/prometheus/alertmanager/releases/download/v0.22.1/alertmanager-0.22.1.linux-amd64.tar.gz
tar zxvf alertmanager-0.22.1.linux-amd64.tar.gz
mv alertmanager-0.22.1.linux-amd64 /usr/local/alertmanager
cd /usr/local/alertmanager

配置

AlertManager的默认配置文件是alertmanager.yml,配置如下(自带webhook告警):

route:
  group_by: ['alertname']
  group_wait: 30s
  group_interval: 5m
  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']

启动

# 启动前检查配置
./amtool check-config alertmanager.yml

# 默认启动
./alertmanager
# 后台启动
./alertmanager &

配置开机自启

创建/etc/systemd/system/alertmanager.service,添加以下内容:

[Unit]
Description=alertmanager
After=network.target

[Service]
WorkingDirectory=/usr/local/alertmanager
ExecStart=/usr/local/alertmanager/alertmanager --config.file=alertmanager.yml --log.level=debug --log.format=json
Restart=on-failure

[Install]
WantedBy=multi-user.target

重载服务并设置开机启动:

systemctl daemon-reload
systemctl enable alertmanager
systemctl start alertmanager

配置Prometheus

修改prometheus.yml启动告警系统:

alerting:
  # 配置alertmanager
  alertmanagers:
  - static_configs:
    # AlertManager服务器列表
    - targets:['localhost:9093']
# 指定告警规则文件
rule_files:
  - 'rules/*.yml'

告警规则

创建一个告警规则rules/node_exporter.yml,并加载至prometheus.yml中。

groups:
- name: node-resource
  rules:
  - alert: 内存使用率过高
    expr: 100-(node_memory_Buffers_bytes+node_memory_Cached_bytes+node_memory_MemFree_bytes)/node_memory_MemTotal_bytes*100 > 30 
    # 告警持续时间,超过这个时间才会发送给alertmanager
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "Instance {{ $labels.instance }} 内存使用率过高"
      description: "{{ $labels.instance }} of job {{$labels.job}}内存使用率超过80%,当前使用率[{{ $value }}]."

  - alert: cpu使用率过高
    expr: 100-avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)*100 > 0
    for: 1m
    labels:
      severity: warning
    annotations:
      summary: "Instance {{ $labels.instance }} cpu使用率过高"
      description: "{{ $labels.instance }} of job {{$labels.job}}cpu使用率超过80%,当前使用率[{{ $value }}]."

告警状态

状态 说明
inactive 表示当前报警信息即不是firing状态也不是pending状态
pending 表示在设置的阈值时间范围内被激活的
firing 表示超过设置的阈值时间被激活的,此时将正式发送告警通知至接收者

示例

因为AlertManager支持丰富的告警通知渠道,因此参数配置远不止默认配置那么简单,至少包含email_config、hipchat_config、pagerduty_config、pushover_config、slack_config、opsgenie_config、victorops_config,本文以配置邮件和微信告警为例,详细讲述相应参数:

# 全局配置项
global: 
  # 可在自定义模板中获取
  # smtp_from: '{{ template "email.from" . }}'
  # smtp_auth_username: '{{ template "email.from" . }}'
  smtp_from: 'xxx@olzl.cn'
  smtp_smarthost: 'smtp.olzl.cn:465'
  smtp_auth_username: 'fw1@olzl.cn'
  smtp_auth_password: '*********'
  smtp_require_tls: false
  wechat_api_url: 'https://qyapi.weixin.qq.com/cgi-bin/'

# 定义模板信息
templates:
  - 'template/*.tmpl'

# 定义路由树信息
route:
  group_by: ['alertname']  # 告警分组依据
  group_wait: 10s          # 发送第一次告警的等待时间
  group_interval: 10s      # 发送新一组告警的等待时间
  repeat_interval: 3m      # 发送重复告警的周期
  receiver: 'email'        # 告警接收者的组名称

# 定义警报接收者信息
receivers:
  # 邮箱报警配置
  - name: 'email'                            # 告警接收者的名称
    email_configs:                           # 配置邮箱告警
    - to: 'xxx@olzl.net'                     # 告警接收者的邮箱
      html: '{{ template "email.html" . }}'  # 邮箱内容的模板
      headers: { Subject: "[WARN] 报警邮件"}  # 接收邮件的标题
    # Webhook报警配置
    webhook_configs:
    - url: 'http://127.0.0.1:5001'
    send_resolved: true
    # 企业微信报警配置
    wechat_configs:
    - send_resolved: true
      to_party: '1'                              # 告警接收组的ID
      agent_id: '1000002'                        # 企业微信→自定应用→AgentId
      corp_id: '******'                          # 企业信息(我的企业→CorpId)
      api_secret: '******'                       # 企业微信(企业微信→自定应用→Secret)
      message: '{{ template "wechat.html" . }}'  # 微信消息的内容模板

inhibit_rules: 
  - source_match: 
     severity: 'critical' 
    target_match: 
     severity: 'warning' 
    equal: ['alertname', 'dev', 'instance']

模板

在启动AlertManager时,会自动加载在配置文件中由templates模块指定的模板。

邮件告警模板示例template/email.tmpl

{{ define "email.from" }}xxx@olzl.cn{{ end }}
{{ define "email.to" }}xxx@olzl.net{{ end }}
{{ define "email.tmpl" }}
  {{ range .Alerts }}
    =========start==========<br>
    告警程序:prometheus_alert <br>
    告警级别:{{ .Labels.severity }} 级 <br>
    告警类型:{{ .Labels.alertname }} <br>
    故障主机:{{ .Labels.instance }} <br>
    告警主题:{{ .Annotations.summary }} <br>
    告警详情:{{ .Annotations.description }} <br>
    触发时间:{{ .StartsAt.Format "2021-06-01 12:00:00" }} <br>
    =========end==========<br>
  {{ end }}
{{ end }}

微信告警模板示例template/wechat.tmpl

{{ define "wechat.tmpl" }}
  {{ range $i, $alert := .Alerts.Firing }}
    [报警名称]:{{ index $alert.Labels "alertname" }}
    [实例名称]:{{ index $alert.Labels "instance" }}
    [报警阀值]:{{ index $alert.Annotations "value" }}
    [开始时间]:{{ $alert.StartsAt }}
  {{ end }}
{{ end }}

原创文章禁止转载:技术学堂 » Prometheus部署AlertManager告警(附邮件和微信示例)

精彩评论

3+9=

感谢您的支持与鼓励

支付宝扫一扫打赏

微信扫一扫打赏