date: 2020-10-28title: Prometheus实现钉钉+邮件告警 #标题
tags: Prometheus #标签
categories: 监控 # 分类

此博文实现Prometheus不同告警级别的信息发送至不同的告警介质,如warning级别的告警发送至邮箱,critical级别的告警发送至钉钉。
本文基于部署Prometheus监控k8s集群进行配置。

创建钉钉机器人

群聊添加机器人

Prometheus实现钉钉 邮件告警 - 图1

Prometheus实现钉钉 邮件告警 - 图2

Prometheus实现钉钉 邮件告警 - 图3

Prometheus实现钉钉 邮件告警 - 图4

Prometheus实现钉钉 邮件告警 - 图5

自定义如下两项内容:

Prometheus实现钉钉 邮件告警 - 图6

Prometheus实现钉钉 邮件告警 - 图7

安装webhook插件

在任意节点安装此插件即可,只要altermanager可以和此节点通信。如下:

  1. $ wget https://github.com/timonwong/prometheus-webhook-dingtalk/releases/download/v1.4.0/prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz
  2. $ tar zxf prometheus-webhook-dingtalk-1.4.0.linux-amd64.tar.gz -C /opt
  3. $ ln -sf /opt/prometheus-webhook-dingtalk-1.4.0.linux-amd64 /opt/prometheus-webhook-dingtalk
  4. $ cd /opt/prometheus-webhook-dingtalk
  5. # 启动dingtalk程序
  6. $ nohup ./prometheus-webhook-dingtalk --web.listen-address="0.0.0.0:8060" --ding.profile="alert=https://oapi.dingtalk.com/robot/send?access_token=39a2284ace0c37e5a2871085892efbba42062fd9571f7aea56d" &
  7. # 其中--ding.profile="alert 指定的alert为你创建顶顶机器人时自定义的关键字
  8. # https://oapi.dingtalk.com/robot/send?ac.... 是你钉钉机器人生成的webhook。
  9. # 确定端口在监听
  10. $ ss -lnput | grep 8060
  11. tcp LISTEN 0 128 [::]:8060 [::]:* users:(("prometheus-webh",pid=123196,fd=3))

定义alertmanager配置文件

这里对配置文件进行一个解释,后面有无注释的配置文件。

参考:Prometheus-book

  1. $ cat >alertmanager-cm.yaml <<EOF
  2. kind: ConfigMap
  3. apiVersion: v1
  4. metadata:
  5. name: alertmanager
  6. namespace: prom
  7. data:
  8. alertmanager.yml: |-
  9. global: # 全局配置
  10. resolve_timeout: 1m #设置解析超时时间
  11. # 下面smtp开头的是邮箱相关配置,请换成自己的
  12. smtp_smarthost: 'smtp.163.com:25'
  13. smtp_from: 'lv916551516@163.com'
  14. smtp_auth_username: 'lv916551516@163.com'
  15. smtp_auth_password: 'KRIUAMMLHGGYEGB'
  16. smtp_require_tls: false
  17. route: # 告警信息路由配置
  18. group_by: [alertname] # 以哪个标签进行分组
  19. group_wait: 10s # 分组等待时间,拿到第一条告警后等待10s,如果在这个组有其他的告警一起发送出去
  20. group_interval: 10s # 各个分组发送告警的间隔时间(如果多个分组都有告警,则每隔10s依次发送每个分组的告警信息)
  21. repeat_interval: 10m # 重复告警时间,默认1小时
  22. receiver: 'default-receiver' # 默认所有告警信息发送至 default-receiver
  23. routes: # 定义一个子路由,匹配critical级别的告警,发送至 cluster1
  24. - receiver: cluster1
  25. group_wait: 10s
  26. match_re:
  27. severity: critical
  28. receivers: # receivers 字段定义的就是上面指定的两个路由配置
  29. - name: 'default-receiver'
  30. email_configs:
  31. - to: '916551516@qq.com'
  32. send_resolved: true
  33. - name: 'cluster1'
  34. webhook_configs:
  35. - url: 'http://192.168.20.2:8060/dingtalk/alert/send'
  36. send_resolved: true
  37. inhibit_rules: # inhibit_rules 字段为告警抑制,同一指标有critical级别告警的话,就忽略warning告警信息
  38. - source_match:
  39. severity: 'critical'
  40. target_match:
  41. severity: 'warning'
  42. equal: ['alertname']

其中,group_by指定的标签,是源自于如下:

Prometheus实现钉钉 邮件告警 - 图8

是的,我们在定义group_by时,可以选择alert中包含的任意一个labels,根据自己需求来就行。那么这些labels是怎么来的呢?可以看看我们定义的Prometheus的告警规则,如下:

Prometheus实现钉钉 邮件告警 - 图9

是的,定义告警规则后,默认会有一些标签,但我们也可以在上面的配置中的labels中自定义一些标签,如上,severity: warnning 就是我们自定义的标签。

完整无注释的配置文件如下:

  1. $ cat >alertmanager-cm.yaml <<EOF
  2. kind: ConfigMap
  3. apiVersion: v1
  4. metadata:
  5. name: alertmanager
  6. namespace: prom
  7. data:
  8. alertmanager.yml: |-
  9. global:
  10. resolve_timeout: 1m
  11. smtp_smarthost: 'smtp.163.com:25'
  12. smtp_from: 'lv916551516@163.com'
  13. smtp_auth_username: 'lv916551516@163.com'
  14. smtp_auth_password: 'KRIUAMMLHGGYEGB'
  15. smtp_require_tls: false
  16. route:
  17. group_by: [alertname]
  18. group_wait: 10s
  19. group_interval: 10s
  20. repeat_interval: 10m
  21. receiver: 'default-receiver'
  22. routes:
  23. - receiver: cluster1
  24. group_wait: 10s
  25. match_re:
  26. severity: critical
  27. receivers:
  28. - name: 'default-receiver'
  29. email_configs:
  30. - to: '916551516@qq.com'
  31. send_resolved: true
  32. - name: 'cluster1'
  33. webhook_configs:
  34. - url: 'http://192.168.20.2:8060/dingtalk/alert/send'
  35. send_resolved: true
  36. inhibit_rules:
  37. - source_match:
  38. severity: 'critical'
  39. target_match:
  40. severity: 'warning'
  41. equal: ['alertname']
  42. EOF
  43. $ kubectl apply -f alertmanager-cm.yaml # 生成配置文件

当配置文件生成后,请自行重启alertmanager容器,使其配置生效,然后验证是否可以实现博文开头说的功能。

验证

如下,我这里critical级别的告警信息会通过钉钉机器人发送至钉钉群:

Prometheus实现钉钉 邮件告警 - 图10

warning级别的告警信息会发送至邮箱:

Prometheus实现钉钉 邮件告警 - 图11