Alertmanager接入钉钉和飞书告警

部署alertmanager 

 

采集的数据除了展示之后,更重要的是数据集异常告警。prometheus体系中告警是alertmanager服务。
部署步骤:

  1. 准备配置文件
  2. 更新prometheus
  3. 启动alertmanager服务
  4. 告警测试

新建告警服务配置目录 /root/prometheus/alertmanager

root@ubuntu-System-Product-Name:~/prometheus# tree . -L 2 . ├── alertmanager └── alertmanager.yml ├── docker-compose.yaml ├── grafana └── data └── prometheus ├── config └── data

创建alertmanager服务配置文件 alertmanager.yaml

global: resolve_timeout: 5m route: group_by: ['instance'] group_wait: 30s group_interval: 60s repeat_interval: 5m receiver: 'web.hook.prometheusalert' receivers: - name: 'web.hook.prometheusalert' webhook_configs: - url: 'http://172.16.9.124:9093'

参数解释:

参数解释
resolve_timeout: 5m 持续5分钟没收到告警信息后认为问题已解决
route 定义告警路由规则,可以定义多个receiver和group实现告警分组
group_by: ['instance'] 分组,处于同一组的告警会被合并为同一个通知。这里设置的是instance相同的告警会被合并为同一个通知
group_wait: 30s 30秒是个时间窗口,这个窗口内,同一个分组的所有消息会被合并为同一个通知
group_interval: 60s 同一个分组发送一次合并消息之后,每隔1分钟检查一次告警,判断是否要继续对此告警做操作
repeat_interval: 5m 发送报警间隔,如果指定时间内没有修复,则重新发送报警
receiver: 'web.hook.prometheusalert' 告警接受者,具体信息将在receivers区域中配置

注意:这里receiver配置了一个无效的webhook,所以alertmanager可以收到告警,但是暂时发送不出去。


将alertmanager集成到prometheus中,分为两步走:

  1. 新建告警规则文件rules.yml
  2. 更新prometheus.yml新增alertmanager相关配置

在 /root/prometheus/ptometheus/config 目录下新增告警规则文件 rules.yml,用于给prometheus服务触发告警的规则。
rules.yaml

groups: - name: 实例存活报警 rules: - alert: 服务器宕机报警 expr: up == 0 for: 30s labels: severity: emergency level: critical annotations: description: '服务器 {{ $labels.instance }}宕机'

该规则用于测试,当一个实例up状态为0超过30s就产生一个告警,告警的内容就是annotations中的description, 例如:服务器node01宕机。更多告警规则自行选择。

修改prometheus.yml相关的配置,新增告警服务和告警规则文件

global: scrape_interval: 30s # 每30s采集一次数据 evaluation_interval: 30s # 每30s做一次告警检测 # 告警服务 alerting: alertmanagers: - static_configs: - targets: ["172.16.9.124:9093"] # 告警规则文件 rule_files: - "rules.yml" scrape_configs: - job_name: prometheus static_configs: - targets: ['172.16.9.124:9090'] labels: instance: prometheus - job_name: node01 static_configs: - targets: ['172.16.9.124:9100'] labels: instance: node01 - job_name: node02 static_configs: - targets: ['192.168.123.62:9100'] labels: instance: node02

在docker-compose.yaml中新增alertmanager服务

version: '3' services: prometheus: image: prom/prometheus container_name: prometheus restart: always ports: - "9090:9090" volumes: - /root/prometheus/prometheus/config:/etc/prometheus - /root/prometheus/prometheus/data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.enable-lifecycle' grafana: image: grafana/grafana container_name: grafana restart: always ports: - "3000:3000" volumes: - /root/prometheus/grafana/data:/var/lib/grafana alertmanager: image: prom/alertmanager container_name: alertmanager restart: always ports: - "9093:9093" volumes: - /root/prometheus/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml

重启docker-compose

docker-compose down docker-compose up -d

登录 172.16.9.124:9093 可以看到告警服务正常启动

登录prometheus web页面,点击菜单Alerts,可以看到所有的告警规则以及触发状态。当前告警处于非active的状态。


触发一个告警规则,当一个node-exporter 停止30s就是触发告警规则。关闭node01 的 node-exporter

root@ubuntu-System-Product-Name:~/prometheus/prometheus/config# docker ps | grep node fa3754932320 prom/node-exporter "/bin/node_exporter" 24 hours ago Up 24 hours 0.0.0.0:9100->9100/tcp, :::9100->9100/tcp eager_lehmann root@ubuntu-System-Product-Name:~/prometheus/prometheus/config# docker stop fa3 fa3 root@ubuntu-System-Product-Name:~/prometheus/prometheus/config#

查看prometheus服务的页面,30s之后报警处于等待状态

60s之后报警处于激活状态

到这里告警就部署完成了,因为没有给告警receiver配置可用的webhook,所以告警消息能收到但不能发送出去。下一步就部署能将告警消息发送到各个终端的服务 prometheusAlert。


alertmanager 是告警处理模块,但是告警消息的发送方法并不丰富。如果需要将告警接入飞书,钉钉,微信等,还需要有相应的SDK适配。prometheusAlert就是这样的SDK,可以将告警消息发送到各种终端上。

prometheus Alert 是开源的运维告警中心消息转发系统,支持主流的监控系统 prometheus,日志系统 Graylog 和数据可视化系统 Grafana 发出的预警消息。通知渠道支持钉钉、微信、华为云短信、腾讯云短信、腾讯云电话、阿里云短信、阿里云电话等。

部署prometheusAlert相关步骤:

  1. 创建飞书机器人
  2. 准备配置文件
  3. 启动 prometheusAlert服务
  4. 对接告警服务
  5. 调试告警模板

创建飞书机器人步骤比较简单

添加自定义关键词,后续在发送的告警消息中一定要包含该关键字,如果没有飞书机器人会丢掉消息。

拿到最重要的webhook地址,后面作为告警地址使用
https://open.feishu.cn/open-apis/bot/v2/hook/b56175a-eb8e-4498-b5a-0b712c0a3d4f
不要尝试使用这个webhook,当你能看到的时候,该webhook已经失效了😌。


新建目录 /root/prometheus/prometheus-alert/db用于保存prometheusAlert的数据库文件,当服务重新部署时不会丢失配置信息。

prometheus ├── alertmanager └── alertmanager.yml ├── docker-compose.yaml ├── grafana └── data ├── alerting ├── csv ├── grafana.db ├── plugins └── png ├── prometheus ├── config ├── prometheus.yml └── rules.yml └── data ├── 01HJHKAFY3SB9XYD71NECDARSV ├── chunks_head ├── lock ├── queries.active └── wal └── prometheus-alert └── db

docker-compose.yml 中新增prometheus-alert服务

version: '3' services: prometheus: image: prom/prometheus container_name: prometheus restart: always ports: - "9090:9090" volumes: - /root/prometheus/prometheus/config:/etc/prometheus - /root/prometheus/prometheus/data:/prometheus command: - '--config.file=/etc/prometheus/prometheus.yml' - '--storage.tsdb.path=/prometheus' - '--web.enable-lifecycle' grafana: image: grafana/grafana container_name: grafana restart: always ports: - "3000:3000" volumes: - /root/prometheus/grafana/data:/var/lib/grafana alertmanager: image: prom/alertmanager container_name: alertmanager restart: always ports: - "9093:9093" volumes: - /root/prometheus/alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml prometheus-alert: image: feiyu563/prometheus-alert:latest container_name: prometheus-alert restart: always ports: - "9094:8080" volumes: - /root/prometheus/prometheus-alert/db:/app/db environment: - PA_LOGIN_USER=alertuser - PA_LOGIN_PASSWORD=123456 - PA_TITLE=prometheusAlert - PA_OPEN_FEISHU=1 - PA_OPEN_DINGDING=0 - PA_OPEN_WEIXIN=1

参数解释:

  • PA_LOGIN_USER=alertuser 登录账号
  • PA_LOGIN_PASSWORD=123456 登录密码
  • PA_TITLE=prometheusAlert 系统title
  • PA_OPEN_FEISHU=1 开启飞书支持
  • PA_OPEN_DINGDING=0 开启钉钉支持
  • PA_OPEN_WEIXIN=1 开启微信支持
  • /root/prometheus/prometheus-alert/db 将数据库映射出来

重启服务

docker-compose down docker-compose up -d

查看服务启动状态

root@ubuntu-System-Product-Name:~/prometheus# docker-compose ps Name Command State Ports ----------------------------------------------------------------------------------------------------------- alertmanager /bin/alertmanager --config ... Up 0.0.0.0:9093->9093/tcp,:::9093->9093/tcp grafana /run.sh Up 0.0.0.0:3000->3000/tcp,:::3000->3000/tcp prometheus /bin/prometheus --config.f ... Up 0.0.0.0:9090->9090/tcp,:::9090->9090/tcp prometheus-alert /bin/sh /app/docker-entryp ... Up (healthy) 0.0.0.0:9094->8080/tcp,:::9094->8080/tcp

查看日志
docker logs -f 5ec

登录web页面

prometheusAlert到这了就部署完成了,目前只是部署好该服务,还没有将服务器接入到告警消息流中。


prometheusAlert是用于将告警服务alertmanager产生的消息发送给终端,也就是将消息格式化,适配不同的终端,如邮件,短信,微信,钉钉,飞书等不同的接口。

将alertmanager告警消息的接受者指定为prometheus-alert提供的url。修改告警规则rules.yml,添加webhook_configs中url配置。
rules.py

global: resolve_timeout: 5m route: group_by: ['instance'] group_wait: 10m group_interval: 10s repeat_interval: 10m receiver: 'web.hook.prometheusalert' receivers: - name: 'web.hook.prometheusalert' webhook_configs: - url: 'http://172.16.9.124:9094/prometheusalert?type=fs&tpl=prometheus-fs&fsurl=https://open.feishu.cn/open-apis/bot/v2/hook/5f4b9c9b-9fed-4bb9-af26-3e1ce174d145'

http://172.16.9.124:9094/prometheusalert?type=fs&tpl=prometheus-fs&fsurl=xxx
是prometheus-alert提供的固定格式,

  • type=fs表示为飞书
  • tpl=prometheus-fs 表示是prometheus消息
  • fsurl 为飞书机器人的webhook,就是创建飞书机器人拿到的webhook

这些参数非常关键,通过type和tpl可以匹配到prometheus-alert上的模板,以上参数匹配到就是飞书的模板。当消息到来的时候,会自动适配到飞书模板,发送给飞书机器人。

重启alertmanager让配置生效

docker-compose start alermanager

重启之后飞书应该就能收到告警消息了

如果不能收到告警消息,排查三个地方,查看告警信息的流向:
一、prometheus 触发的告警。
是否产生了告警消息

二、prometheusAlert 接收到的告警msg。
当prometheusAlert对接alertmanager之后,告警消息就能发送过来,从日志中可以看到prometheusAlert接收到的错误信息。

三、prometheusAlert web端显示发送的告警。
查看prometheusAlert的消息统计信息,是否有消息发送进来和出去。如果从日志中看到有消息进来,但是统计页面没有消息出去,那就是服务模板配置有问题,有问题——看日志。
image.png


默认告警模板很难满足所有人的审美,如果要选择更多模板,可以使用prometheusAlert提供的模板功能完成。默认的模板如下:

进入模板编辑页面

红框内容都是必填内容,分别是模板的内容,日志中json格式的告警消息,飞书机器人的地址。

其中模板可以从这里去找:https://github.com/feiyu563/prometheusAlert/issues/30,比如说我个人喜欢这个

填写相应的信息

点击测试,能够发送该模板的消息到飞书机器人

当告警恢复了之后,还会发送一个恢复的消息

为了方便测试,把模板和告警日志也搬过来
模板

{{ range $k,$v:=.alerts }}{{if eq $v.status "resolved"}}<font color="green">**告警恢复信息**</font> 事件: **{{$v.labels.alertname}}** 告警类型:{{$v.status}} 告警级别: {{$v.labels.level}} 开始时间: {{GetCSTtime $v.startsAt}} 结束时间: {{GetCSTtime $v.endsAt}} 主机: {{$v.labels.instance}} <font color="green">**事件详情: {{$v.annotations.description}}**</font> {{else}}**告警信息** 事件: **{{$v.labels.alertname}}** 告警类型:{{$v.status}} 告警级别: {{$v.labels.level}} 开始时间: {{GetCSTtime $v.startsAt}} 主机: {{$v.labels.instance}} <font color="red">**事件详情: {{$v.annotations.description}}**</font> {{end}} {{ end }}

日志

{"msg_type":"interactive","email":"xxxxxxxxxxx@qq.com","card":{"config":{"wide_screen_mode":true,"enable_forward":true},"elements":[{"tag":"div","text":{"content":"\r\n\r\n**[prometheus告警信息](http://b616a9009165:9090/graph?g0.expr=up+%3D%3D+0\u0026g0.tab=1)**\r\n*[服务器宕机报警](http://054ff0c0b9ab:9093)*\r\n告警级别:critical\r\n开始时间:2023-12-28 01:38:28\r\n结束时间:0001-01-01 00:00:00\r\n故障主机IP:node01\r\n**服务器 node01宕机**\r\n\r\n","tag":"lark_md"},"content":"","elements":null},{"tag":"hr","text":{"content":"","tag":""},"content":"","elements":null},{"tag":"note","text":{"content":"","tag":""},"content":"","elements":[{"tag":"lark_md","text":{"content":"","tag":""},"content":"prometheusAlert","elements":null}]}],"header":{"title":{"content":"prometheusAlert","tag":"plain_text"},"template":"red"}}}

ok,到此为止prometheus的搭建就完成了,撒花🎉🎉🎉

整个过程步骤较多,即使是我第二次搭建也出现了很多问题。有问题也不要慌,多看日志,搜索报错记录,分析可能的报错原因,问题终会解决👌。

 

 

参考文档: https://www.cnblogs.com/goldsunshine/p/17954957

https://blog.csdn.net/Real_cTo/article/details/139179597

 
posted @ 2025-09-28 14:33  Oops!#  阅读(133)  评论(0)    收藏  举报