Prometheus + Alertmanager 报警实现(email报警)

Alertmanager简介及机制

Alertmanager处理由类似Prometheus服务器等客户端发来的警报,之后需要删除重复、分组,并将它们通过路由发送到正确的接收器,比如电子邮件、Slack等。Alertmanager还支持沉默和警报抑制的机制。

分组

分组是指当出现问题时,Alertmanager会收到一个单一的通知,而当系统宕机时,很有可能成百上千的警报会同时生成,这种机制在较大的中断中特别有用。

例如,当数十或数百个服务的实例在运行,网络发生故障时,有可能服务实例的一半不可达数据库。在告警规则中配置为每一个服务实例都发送警报的话,那么结果是数百警报被发送至Alertmanager。

但是作为用户只想看到单一的报警页面,同时仍然能够清楚的看到哪些实例受到影响,因此,人们通过配置Alertmanager将警报分组打包,并发送一个相对看起来紧凑的通知。

分组警报、警报时间,以及接收警报的receiver是在配置文件中通过路由树配置的。

抑制

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

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

抑制机制可以通过Alertmanager的配置文件来配置。

沉默

沉默是一种简单的特定时间静音提醒的机制。一种沉默是通过匹配器来配置,就像路由树一样。传入的警报会匹配RE,如果匹配,将不会为此警报发送通知。

沉默机制可以通过Alertmanager的Web页面进行配置。

Alertmanager安装

下载地址:https://github.com/prometheus/alertmanager/releases

# tar -zxf alertmanager-0.18.0.linux-amd64.tar.gz -C /usr/local/
# mv /usr/local/alertmanager-0.18.0.linux-amd64 /usr/local/alertmanager
# cd /usr/local/alertmanager/
# ./alertmanager --config.file=alertmanager.yml --cluster.advertise-address=127.0.0.1:9093 --log.level=debug  //前台调试
# nohup ./alertmanager --config.file=alertmanager.yml --cluster.advertise-address=127.0.0.1:9093 &  //后台运行

Web控制台:http://IP:9093/#/alerts

alertmanager.yml的配置

# 全局配置项
global: 
  resolve_timeout: 5m #处理超时时间,默认为5min
  smtp_smarthost: 'smtp.exmail.qq.com:465' # 邮箱smtp服务器代理
  smtp_from: 'test@iobeta.com' # 发送邮箱名称
  smtp_auth_username: 'test@iobeta.com' # 邮箱名称
  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: 1m # 发送重复警报的周期。对于email配置中,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝
  receiver: 'email' # 发送警报的接收者的名称,以下receivers name的名称

# 定义警报接收者信息
receivers:
  - name: 'email' # 警报
    email_configs: # 邮箱配置
    - to: 'test@iobeta.com'  # 接收警报的email配置
      html: '{{ template "email.html" . }}' # 设定邮箱的内容模板
      headers: { Subject: "[WARN] 报警邮件"} # 接收邮件的标题
      send_resolved: true
    #webhook_configs: # webhook配置
    #- url: 'http://127.0.0.1:5001'
    wechat_configs: # 企业微信报警配置
    - send_resolved: true
      to_party: '1' # 接收组的id
      agent_id: '1000002' # (企业微信-->自定应用-->AgentId)
      corp_id: '******' # 企业信息(我的企业-->CorpId[在底部])
      api_secret: '******' # 企业微信(企业微信-->自定应用-->Secret)
      message: '{{ template "wechat.html" . }}' # 发送消息模板的设定
# 一个inhibition规则是在与另一组匹配器匹配的警报存在的条件下,使匹配一组匹配器的警报失效的规则。两个警报必须具有一组相同的标签。 
inhibit_rules: 
  - source_match: 
      severity: 'critical' 
    target_match: 
      severity: 'warning' 
    equal: ['alertname', 'dev', 'instance']

1)repeat_interval配置项,对于email来说,此项不可以设置过低,否则将会由于邮件发送太多频繁,被smtp服务器拒绝
2)企业微信注册地址:https://work.weixin.qq.com

上述配置的email、webhook和wechat三种报警方式。目前Alertmanager所有的报警方式有以下几个方面:

  • email_config
  • hipchat_config
  • pagerduty_config
  • pushover_config
  • slack_config
  • opsgenie_config
  • victorops_config

tmpl模板的配置

1)email.tmpl

# mkdir template
# vim template/email.tmpl
{{ define "email.html" }}
<table border="1">
    <tr>
        <td>报警项</td>
        <td>实例</td>
        <td>报警阀值</td>
        <td>开始时间</td>
    </tr>
    {{ range $i, $alert := .Alerts }}
        <tr>
            <td>{{ index $alert.Labels "alertname" }}</td>
            <td>{{ index $alert.Labels "instance" }}</td>
            <td>{{ index $alert.Annotations "value" }}</td>
            <td>{{ $alert.StartsAt }}</td>
        </tr>
    {{ end }}
</table>
{{ end }}

注:上述Labels项,表示prometheus里面的可选label项。annotation项表示报警规则中定义的annotation项的内容。

2)wechat.tmpl

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

注:此处range遍历项与email模板中略有不同,只遍历当前没有处理的报警(Firing)。此项如果不设置,则在Alert中已经Resolved的报警项,也会被发送到企业微信。

在Prometheus模块定义告警规则

prometheus.yml

# Alertmanager configuration
alerting:
  alertmanagers:
  - static_configs:
    - targets: ["192.168.165.239:9093"]

# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
  - ./rules/*.yml

以内存报警为例

# vim rules/simulator_alert_rules.yml
groups:
- name: test-rule1
  rules:
  - alert: "内存报警"
    expr: 100 - ((node_memory_MemAvailable_bytes * 100) / node_memory_MemTotal_bytes) > 80
    for: 1s
    labels:
      severity: warning
    annotations:
      summary: "服务名:{{$labels.alertname}}"
      description: "业务500报警: {{ $value }}"
      value: "{{ $value }}"

- name: test-rule2
  rules:
  - alert: "内存报警"
    expr: 100 - ((node_memory_MemAvailable_bytes * 100) / node_memory_MemTotal_bytes) > 50
    for: 1s
    labels:
      severity: test
    annotations:
      summary: "服务名:{{$labels.alertname}}"
      description: "业务500报警: {{ $value }}"
      value: "{{ $value }}"

Prometheus控制台查看报警是否生效及命中信息

在浏览器输入Prometheus的控制台地址,即可查看报警是否生效及命中信息

打开:http://192.168.16.20:9090/alerts

Alertmanager控制台查看报警信息

在浏览器输入Alertmanager的配置地址,即可查看所监控到的报警信息

打开:http://192.168.16.19:9093/#/alerts

常用报警

groups:
- name: MysqldDown
  rules:
  - alert: "MySQL宕机"
    expr: sum(up{job="mysqld"}) == 0
    for: 1m
    labels:
      severity: critical
groups:
  - name: InstanceDown
    rules:
    - alert: "实例宕机" # 告警名称
      expr: up == 0 # 告警的判定条件,参考Prometheus高级查询来设定
      for: 2m # 满足告警条件持续时间多久后,才会发送告警
      labels: #标签项
        team: node
      annotations: # 解析项,详细解释告警信息
        summary: "{{$labels.instance}}: has been down"
        description: "{{$labels.instance}}: job {{$labels.job}} has been down "
        value: {{$value}}

告警信息生命周期的3中状态

1)inactive:表示当前报警信息即不是firing状态也不是pending状态
2)pending:表示在设置的阈值时间范围内被激活的
3)firing:表示超过设置的阈值时间被激活的

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/03/25/prometheus-alertmanager-alarm-implementation-email-alarm/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Prometheus + Alertmanager 报警实现(email报警)
Alertmanager简介及机制 Alertmanager处理由类似Prometheus服务器等客户端发来的警报,之后需要删除重复、分组,并将它们通过路由发送到正确的接收器,比如电……
<<上一篇
下一篇>>
文章目录
关闭
目 录