Alertmanager 是一个用于处理和管理 Prometheus 警报的开源工具。它负责接收来自 Prometheus 服务器的警报,进行去重、分组、静默、抑制等操作,并通过电子邮件、PagerDuty、Slack 等多种渠道发送通知。

主要功能
  1. 去重:合并相同或相似的警报,避免重复通知。
  2. 分组:将相关警报合并为一个通知,减少信息过载。
  3. 静默:临时屏蔽特定警报,避免干扰。
  4. 抑制:在特定条件下阻止某些警报的发送。
  5. 路由:根据标签将警报分发到不同的接收者或渠道。
  6. 通知:支持通过多种方式发送警报通知。
核心概念
  • Alert:由 Prometheus 生成的警报,包含标签、注解和状态。
  • Receiver:警报的接收者,如电子邮件或 Slack 频道。
  • Route:定义警报如何路由到接收者。
  • Silence:临时屏蔽特定警报的机制。

下载安装包:
地址: https://prometheus.io/download/#alertmanager

将安装包alertmanager-0.24.0.linux-amd64.tar.gz上传服务器

接上篇基于Alertmanager 配置钉钉告警_监控

tar zxf alertmanager-0.24.0.linux-amd64.tar.gz -C /usr/local/
mv /usr/local/alertmanager-0.24.0.linux-amd64/ /usr/local/alertmanager
  • 1.
  • 2.

接上篇基于Alertmanager 配置钉钉告警_grafana_02

接下来再安装一个插件prometheus-webhook-dingtalk 

由于 Alertmanager 没有内置钉钉的支持,因此需要通过 Webhook 的方式将告警信息发送到钉钉。prometheus-webhook-dingtalk 就是这样一个工具,它充当了 Alertmanager 和钉钉之间的桥梁:

  1. Alertmanager 将告警信息通过 Webhook 发送到 prometheus-webhook-dingtalk
  2. prometheus-webhook-dingtalk 将告警信息格式化为钉钉支持的格式(如 Markdown),并通过钉钉的 Webhook API 推送到指定的群聊。

下载安装包:
地址: https://github.com/timonwong/prometheus-webhook-dingtalk/releases/

上传到服务器进行解压安装

tar zxvf prometheus-webhook-dingtalk-2.1.0.linux-amd64.tar.gz -C /usr/local/
mv /usr/local/prometheus-webhook-dingtalk-2.1.0.linux-amd64/ /usr/local/prometheus-webhook-dingtalk
  • 1.
  • 2.

接上篇基于Alertmanager 配置钉钉告警_普罗米修斯_03

创建钉钉机器人:

【电脑端钉钉 】-【群聊】-【群设置】-【智能群助手】-【添加更多】-【添加机器人】-【自定义】-【添加】,编辑机器人名称和选择添加的群组,勾选加签,将生成的秘钥复制出来。

接上篇基于Alertmanager 配置钉钉告警_grafana_04

接上篇基于Alertmanager 配置钉钉告警_钉钉告警_05

修改prometheus-webhook-dingtalk配置,将以上信息填到文件中:

新建/usr/local/prometheus-webhook-dingtalk/config.yml,添加以下配置

targets:ding_webhook:# 钉钉webhook地址,根据自己的来填url: https://oapXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX# 创建机器人时获取到的加签秘钥,根据自己的来填secret: SECXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

接上篇基于Alertmanager 配置钉钉告警_linux_06

启动prometheus-webhook-dingtalk服务

nohup /usr/local/prometheus-webhook-dingtalk/prometheus-webhook-dingtalk --config.file=/usr/local/prome                                                        theus-webhook-dingtalk/config.yml &
  • 1.

查看插件提供的webhook地址:这个记好待会有用

接上篇基于Alertmanager 配置钉钉告警_钉钉告警_07

编辑alertmanager.yml配置文件,添加路由和接受者配置,注意url填写钉钉插件提供的webhook地址,就是上图圈起来那个,根据自己的情况来,而不是钉钉直接提供的那个webhook。

vim /usr/local/alertmanager/alertmanager.yml
  • 1.
route:#接收人receiver: 'webhook'#同组内告警等待时间。也就是告警产生后等待5s,如果有同组告警一起发出group_wait: 5s#两个组告警的间隔时间group_interval: 10s#重复告警的间隔时间,减少相同钉钉告警的发送频率repeat_interval: 30s#采用哪个标签来作为分组依据group_by: [alertname]routes:- receiver: webhook#配置告警消息接受者信息,常用的有 邮箱、wechat、webhook 等消息通知方式
receivers:
- name: 'webhook'webhook_configs:#钉钉插件提供的webhook地址- url: http://localhost:8060/dingtalk/ding_webhook/send#警报被解决之后是否通知send_resolved: true
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.

接下来编辑prometheus配置文件:

增加和修改prometheus.yml的alertmanager部分,让alertmanger能与Prometheus通信。

接上篇基于Alertmanager 配置钉钉告警_普罗米修斯_08

# my global config
global:scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.# scrape_timeout is set to the global default (10s).# Alertmanager configuration
alerting:alertmanagers:- static_configs:- targets:##修改成alertmanager服务器的ip和端口- 192.168.158.183:9093# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
# 指定告警规则的配置路径
rule_files:- "/usr/local/prometheus/rules/*.yml"# - "first_rules.yml"# - "second_rules.yml"# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
scrape_configs:# The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.- job_name: "prometheus"# metrics_path defaults to '/metrics'# scheme defaults to 'http'.static_configs:- targets: ["192.168.158.183:9090"]- job_name: 'linux'file_sd_configs:- files:- /usr/local/prometheus/node_exporter_targets.json#接收alertmanager的数据- job_name: 'alertmanager'static_configs:- targets: ['192.168.158.183:9093']
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.

在/usr/local/prometheus/路径建立rules文件夹

接上篇基于Alertmanager 配置钉钉告警_普罗米修斯_09

在rules文件夹中创建node_rules.yml用来配置主机节点的告警

[root@prometheus prometheus]# cat  rules/node_rules.yml
groups:- name: node_alertsrules:# 规则 1: CPU 使用率过高- alert: HighCPUUsageexpr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80for: 5mlabels:severity: criticalannotations:summary: "High CPU usage on {{ $labels.instance }}"description: "CPU usage is above 80% for more than 5 minutes on {{ $labels.instance }}."# 规则 2: 内存使用率过高- alert: HighMemoryUsageexpr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100 > 80for: 5mlabels:severity: criticalannotations:summary: "High memory usage on {{ $labels.instance }}"description: "Memory usage is above 80% for more than 5 minutes on {{ $labels.instance }}."# 规则 3: 磁盘使用率过高- alert: HighDiskUsageexpr: 100 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"} * 100) > 80for: 5mlabels:severity: warningannotations:summary: "High disk usage on {{ $labels.instance }}"description: "Disk usage is above 80% for more than 5 minutes on {{ $labels.instance }}."# 规则 4: 节点宕机- alert: InstanceDownexpr: up == 0for: 1mlabels:severity: criticalannotations:summary: "Instance {{ $labels.instance }} down"description: "{{ $labels.instance }} has been down for more than 1 minute."
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38.
  • 39.
  • 40.
  • 41.
  • 42.
  • 43.

在/usr/local/prometheus/node_exporter_targets.json文件中添加测试节点

接上篇基于Alertmanager 配置钉钉告警_linux_10

重启prometheus

ps -ef |grep prometheus |grep -v grep |awk '{print $2}' |xargs kill -9
nohup /usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml &
  • 1.
  • 2.

启动Alertmanager

nohup /usr/local/alertmanager/alertmanager --config.file /usr/local/alertmanager/alertmanager.yml &
  • 1.

启动钉钉插件prometheus-webhook-dingtalk

nohup /usr/local/prometheus-webhook-dingtalk/prometheus-webhook-dingtalk --config.file=/usr/local/prometheus-webhook-dingtalk/config.yml &
  • 1.

查看grafana、alertmanager、prometheus端口都已经启动

接上篇基于Alertmanager 配置钉钉告警_钉钉告警_11

接下来关闭刚才添加的测试机器

接上篇基于Alertmanager 配置钉钉告警_linux_10

等了一会查看钉钉出现了告警

接上篇基于Alertmanager 配置钉钉告警_linux_13

接下来优化告警消息:

1、使用中文发送告警信息

修改prometheus-webhook-dingtalk/config.yml文件添加以下字段

targets:ding_webhook:url: https://oapXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXsecret: SEC6c2bf6d8XXXXXXXXXXXXXXXXXXXXXXXmessage:title: 'Prometheus - {{ if eq .Status "resolved" }}恢复通知{{ else }}告警通知{{ end }}'text: |- **告警名称**: {{ .CommonLabels.alertname }}- **当前状态**: {{ .Status }}{{ if eq .Status "resolved" }}- **描述**: 实例 {{ .CommonLabels.instance }} 已恢复正常。- **可能影响的服务**: 没有影响的服务{{ else }}- **描述**: {{ .CommonAnnotations.description }}- **可能影响的服务**: {{ .CommonAnnotations.impact }}{{ end }}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.

接上篇基于Alertmanager 配置钉钉告警_钉钉告警_14

2、告知故障的影响范围

修改/usr/local/prometheus/rules/node_rules.yml配置文件,添加以下信息

.............# 规则 4: 节点宕机- alert: InstanceDownexpr: up == 0for: 1mlabels:severity: criticalannotations:summary: "实例 {{ $labels.instance }} 已宕机"description: "实例 {{ $labels.instance }} 已宕机。"impact: |{{- if eq $labels.instance "192.168.158.182:9900" }}K8S中pod调度,导致服务无法正常使用。{{- else if eq $labels.instance "192.168.158.183:9900" }}无法访问监控系统。{{- else }}可能影响的服务:未知。{{- end }}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.

接上篇基于Alertmanager 配置钉钉告警_监控_15

重启/prometheus-webhook-dingtalk服务:

ps -ef |grep prometheus-we |grep -v grep |awk -F " " '{print $2}' |xargs kill -9#为了区分nohup的启动日志,建议进入各自的目录执行
cd /usr/local/prometheus-webhook-dingtalk/
nohup /usr/local/prometheus-webhook-dingtalk/prometheus-webhook-dingtalk --config.file=/usr/local/prometheus-webhook-dingtalk/config.yml &
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

重启prometheus服务:

ps -ef |grep prometheus |grep -v grep |awk '{print $2}' |xargs kill -9cd /usr/local/prometheusnohup /usr/local/prometheus/prometheus --config.file=/usr/local/prometheus/prometheus.yml &
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.

查看端口都已经启动

接上篇基于Alertmanager 配置钉钉告警_钉钉告警_16

查看钉钉最新消息已经修改为中文提示和告知影响范围

接上篇基于Alertmanager 配置钉钉告警_钉钉告警_17

启动故障机器再次查看消息

接上篇基于Alertmanager 配置钉钉告警_linux_18

后续继续更新监控其他服务