本章主要对如何使用开源组件和Alertmanager组件集成警报通知。Kubernetes的警报集成后续会直接在配置文件讲解,原理大同小异,此处仅对相关警报通知做集成。

警报通知接收器

前面一直是在Web UI 查看警报信息,现在开始使用接收器与Alertmanager集成,发送警报信息到 Email企业微信钉钉机器人,对于警报要求比较高的同学,可以根据下面提到的开源组件 【PrometheusAlert全家桶】 配置飞书、短信、语音电话等警报。

Email

前面已经讲过,Alertmanager默认支持配置Email,也是最普通的方式,在Alertmanager组件中内置了SMTP协议。直接可以把前面的Alertmanager.yml中的SMTP部分截取出来,然后进行调整与配置

global:
  resolve_timeout: 5m
  # smtp配置
  smtp_from: "[email protected]" # 发送邮件主题
  smtp_smarthost: 'smtp.qq.com:465' # 邮箱服务器的SMTP主机配置
  smtp_auth_username: "[email protected]" # 登录用户名
  smtp_auth_password: "auth_pass" # 此处的auth password是邮箱的第三方登录授权密码,而非用户密码,尽量用QQ来测试。
  smtp_require_tls: false # 有些邮箱需要开启此配置,这里使用的是163邮箱,仅做测试,不需要开启此功能。
route:
  receiver: ops
  group_wait: 30s # 在组内等待所配置的时间,如果同组内,30秒内出现相同报警,在一个组内出现。
  group_interval: 5m # 如果组内内容不变化,合并为一条警报信息,5m后发送。
  repeat_interval: 24h # 发送报警间隔,如果指定时间内没有修复,则重新发送报警。
  group_by: [alertname]  # 报警分组
  routes:
      - match:
          team: operations
        group_by: [env,dc]
        receiver: 'ops'
      - receiver: ops # 路由和标签,根据match来指定发送目标,如果 rule的lable 包含 alertname, 使用 ops 来发送
        group_wait: 10s
        match:
          team: operations
# 接收器指定发送人以及发送渠道
receivers:
# ops分组的定义
- name: ops
  email_configs:
  - to: '[email protected],[email protected]' # 如果想发送多个人就以 ','做分割,写多个邮件人即可。
    send_resolved: true
    headers:
      from: "警报中心"
      subject: "[operations] 报警邮件"
      to: "小煜狼皇"

配置完成后,直接重启Alertmanager组件,使配置生效,然后使用前面内存阈值触发一次警报来看下发送结果。

收到的警报信息:

Prometheus监控神器-Alertmanager篇(2)_第1张图片

当警报接触以后收到的恢复信息。

Prometheus监控神器-Alertmanager篇(2)_第2张图片

企业微信

首先你要具有企业微信管理员的权限,如果没有可以自己注册一个,进行测试,我这里有自行注册的企业微信

第一步登录进入以后,在应用管理中新建应用。

Prometheus监控神器-Alertmanager篇(2)_第3张图片

第二步,创建应用,信息填写如下,上传应用logo随意。

Prometheus监控神器-Alertmanager篇(2)_第4张图片

创建成功以后如下图。

Prometheus监控神器-Alertmanager篇(2)_第5张图片

这时候需要把 AgentIdSecret 记录下来,对于你的这种Secret信息,最好管理好,我的用过就会删除,所以不用担心安全隐患。

ID key
AgentId 1000004
Secret F-fzpgsabmfiFt7_4QRQwWEl8eyx7evO12sRYe_Q5vA

第三步,现在我们来用新建的企业微信应用在Alertmanager配置,可以配置全局,也可以对单独需要发送的接收器,因为警报需要分级,所以需要单独处理,在这里使用的的单独的配置,需要知道 企业ID ,以及 部门ID

企业ID 通过

Prometheus监控神器-Alertmanager篇(2)_第6张图片

部门ID 通过通讯录获取

Prometheus监控神器-Alertmanager篇(2)_第7张图片

# 企业微信配置
  wechat_configs:
  - corp_id: 'wwxxxxx' # 企业ID是唯一标识
    api_url: 'https://qyapi.weixin.qq.com/cgi-bin/' # 企业微信api接口,统一定义
    send_resolved: true # 设置发送警报恢复信息
    to_party: '2' # 部门id,比如我的叫警报组,因此显示的是2,如果你DB组,就可能会是3,WEB组就是4,依次类推,另外需要接收警报的相关人员必须在这个部门里。
    agent_id: '1000004' # 新建应用的agent_id
    api_secret: 'F-fzpgsabmfiFt7_4QRQwWEl8eyx7evO12sRYe_Q5vA' # 新建应用的Secret

这时候我们重启Alertmanager,然后使用之前的方式来触发模拟警报,看看发送是不是已经没有问题了,这时我们的企业微信中、Email都可以收到警报了,这里的警报已经被我用模块处理过了。可读性会更高。

cat wechat.tmpl
## wechat模板
{{ define "wechat.default.message" }}
{{ if gt (len .Alerts.Firing) 0 -}}
Alerts Firing:
{{ range .Alerts }}
警报级别:{{ .Labels.status }}

警报类型:{{ .Labels.alertname }}

故障主机: {{ .Labels.instance }}

警报主题: {{ .Annotations.summary }}

警报详情: {{ .Annotations.description }}

⏱ : {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- end }}
{{- end }}

{{ if gt (len .Alerts.Resolved) 0 -}}
Alerts Resolved:
{{ range .Alerts }}
警报级别:{{ .Labels.status }}

警报类型:{{ .Labels.alertname }}

故障主机: {{ .Labels.instance }}

警报主题: {{ .Annotations.summary }}

警报详情: {{ .Annotations.description }}

⏱ : {{ (.StartsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
⏲ : {{ (.EndsAt.Add 28800e9).Format "2006-01-02 15:04:05" }}
{{- end }}
{{- end }}
{{- end }}

Firing警报:

Prometheus监控神器-Alertmanager篇(2)_第8张图片

下面是Resolve的警报:

Prometheus监控神器-Alertmanager篇(2)_第9张图片

钉钉机器人(Webhook)

对于钉钉大家都已经很熟悉了,大部分企业都已经启用钉钉办公了,同时其推出的免费的webhook机器人也很受大家的欢迎。我们这里讲一下借助第三方开源组件如何对钉钉集成警报功能。

首先需要在钉钉创建机器人,然后在白名单中添加关键字信息与ip限制等安全设置,这个只要你有群,你就可以在群里面建,非常简单,这里就不做演示了

先把Prometheus-webhook-Dingtalk组件装好。

mkdir -p /etc/prometheus-webhook-dingtalk/template/
cd /etc/prometheus-webhook-dingtalk/
wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v1.4.0/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
tar xf prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
mv prometheus-webhook-dingtalk-1.4.0.linux-amd64/* /etc/prometheus-webhook-dingtalk/
mv prometheus-webhook-dingtalk /bin/
cat < /lib/systemd/system/prometheus-webhook-dingtalk.service 
[Unit]
Description=prometheus-webhook-dingding
Documentation=https://prometheus.io/
After=network.target

[Service]
Type=simple
User=prometheus
ExecStart=/bin/prometheus-webhook-dingtalk --web.listen-address=":8070" --web.enable-ui --config.file="/etc/prometheus-webhook-dingtalk/config.yml"
Restart=on-failure

[Install]
WantedBy=multi-user.target
EOF
## 启动服务
systemctl enable prometheus-webhook-dingtalk.service
systemctl start prometheus-webhook-dingtalk.service

配置文件

## Request timeout
# timeout: 5s

## Customizable templates path
## Customizable templates path
templates:
        # - contrib/templates/legacy/template.tmpl
  # 自定义模板路径
  - /etc/prometheus-webhook-dingtalk/template/default.tmpl

## 你还可以使用' default_message '覆盖默认模板
## 下面的示例使用v0.3.0中的“legacy”模板
# default_message:
#   title: '{{ template "legacy.title" . }}'
#   text: '{{ template "legacy.content" . }}'

## Targets, previously was known as "profiles"
# 定义的webhook,钉钉创建的webhook token
targets:
# 如果有多个分组就可以在这里定义多个接口
  ops:
    url: https://oapi.dingtalk.com/robot/send?access_token=a4feed2322222222222222222222222
  web:
    url: https://oapi.dingtalk.com/robot/send?access_token=a4feed2325c1333333333333333333333

定义模板:


cd /etc/prometheus-webhook-dingtalk/template
cat default.tmpl
{{ define "__subject" }}[{{ .Status | toUpper }}{{ if eq .Status "firing" }}:{{ .Alerts.Firing | len }}{{ end }}] {{ .GroupLabels.SortedPairs.Values | join " " }} {{ if gt (len .CommonLabels) (len .GroupLabels) }}({{ with .CommonLabels.Remove .GroupLabels.Names }}{{ .Values | join " " }}{{ end }}){{ end }}{{ end }}
{{ define "__alertmanagerURL" }}{{ .ExternalURL }}/#/alerts?receiver={{ .Receiver }}{{ end }}

{{ define "__text_alert_list" }}{{ range . }}
**Labels**
{{ range .Labels.SortedPairs }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}
**Annotations**
{{ range .Annotations.SortedPairs }}> - {{ .Name }}: {{ .Value | markdown | html }}
{{ end }}
**Source:** [{{ .GeneratorURL }}]({{ .GeneratorURL }})
{{ end }}{{ end }}

{{/* Firing */}}

{{ define "default.__text_alert_list" }}{{ range . }}

**Trigger Time:** {{ dateInZone "2006.01.02 15:04:05" (.StartsAt) "Asia/Shanghai" }}

**Summary:** {{ .Annotations.summary }}

**Description:** {{ .Annotations.description }}

**Graph:** [