监控运维告警工具之PrometheusAlert

0    57    1

Tags:

👉 本文共约13523个字,系统预计阅读时间或需51分钟。

简介

https://github.com/feiyu563/PrometheusAlert

https://gitee.com/feiyu563/PrometheusAlert

官网:https://feiyu563.gitee.io/

文档:https://feiyu563.gitbook.io/prometheusalert/

PrometheusAlert是开源的运维告警中心消息转发系统,支持主流的监控系统Prometheus、Zabbix,日志系统Graylog2,Graylog3、数据可视化系统Grafana、SonarQube等支持WebHook接口的系统发出的预警消息,支持将收到的这些消息发送到钉钉,微信,飞书,腾讯短信,腾讯电话,阿里云短信,阿里云电话,华为短信,百度云短信,容联云电话,七陌短信,七陌语音,TeleGram,百度Hi(如流)等。

监控运维告警工具之PrometheusAlert

PrometheusAlert具备如下特性


  • 支持任意包含WebHook接口系统的消息作为消息来源,常见的如Prometheus,Zabbix,Graylog2,Graylog3,Grafana,SonarQube和其他WebHook接口的系统。
  • 支持多种类型的发送目标,支持钉钉,企业微信,email,飞书,腾讯短信,腾讯语音,阿里云短信,阿里云语音,华为短信,百度云短信,容联云电话,七陌短信,七陌语音,TeleGram,百度Hi(如流)。
  • 针对Prometheus增加了告警级别,并且支持按照不同级别发送消息到不同目标对象。
  • 简化Prometheus分组配置,支持按照具体消息发送到单个或多个接收方。
  • 增加手机号码配置项和号码自动轮询配置,可固定发送给单一个人告警信息,也可以通过自动轮询的方式发送到多个人员且支持按照不同日期发送到不同人员。
  • 增加Dashboard,提供配置测试,告警消息模版自定义,告警模版测试等功能
  • 增加自定义告警消息模版支持,可以通过自定义模版对任意服务WebHook进行支持
  • 增加代理支持
  • 增加支持mysql、sqlite3(默认)、postgres作为模版存储,便于集群化部署
  • 增加支持钉钉,企业微信的@某人功能
  • 增加支持阿里云-云监控告警
  • 增加随机轮询,目前仅针对ddurl,fsurl,wxurl有效,默认情况下如果上述Url配置的是多个地址,则多个地址全部发送,如开启该选项,则从多个地址中随机取一个地址发送,主要是为了避免消息发送频率过高导致触发部分机器人拦截消息
  • 增加支持将Prometheus告警记录写入到Elasticsearch7.x,可通过Kibana进行界面查看告警记录和配置表格导出。
  • 增加支持将Gitlab webhook event推送到企微和钉钉。
  • 增加告警路由和告警记录功能,可通过页面查看告警历史和操作告警消息路由。
  • 增加告警语音播报插件。
  • 增加支持飞书机器人应用。

系统接入PrometheusAlert流程

PrometheusAlert的原理就是通过自定义模版接口/prometheusalert接收各种告警系统或者任何带有WebHook功能的系统发来的消息,然后将收到的消息经过自定义模板渲染成消息文本,最终转发给不同的接收目标。

一般情况下如果使用的是钉钉,企业微信、飞书等机器人作为接收目标的,可以不去配置PrometheusAlert的配置文件app.conf;但是如果需要使用如短信,电话,邮箱等功能,则需要先配置好app.conf中的相关配置项方可使用。

安装配置

PrometheusAlert可以部署在本地和云平台上,支持windows、linux、公有云、私有云、混合云、容器和kubernetes。你可以根据实际场景或需求,选择相应的方式来部署PrometheusAlert:

Linux安装启动

Docker 安装启动

https://hub.docker.com/r/feiyu563/prometheus-alert

配置文件 app.conf 的内容可以使用环境变量的方式初始化。

所设置的变量前缀必须以 PA_ 开始,后面使用配置文件的配置项名称,但是需要将配置项中所有的 - 替换为 _

特别注意的是使用环境变量对配置项中的大小写并不敏感。

在windows系统中运行

在kubernetes中运行

使用helm部署


配置PrometheusAlert使用mysql作为后端数据存储


PrometheusAlert默认使用sqlite3作为后端自定义模板的存储,这种方式适合于单机部署,满足绝大部分生产场景使用。考虑到部分企业对于服务的高可用要求较高,同时也为了让PrometheusAlert更易于横向扩展,用户可以更改PrometheusAlert的默认存储为mysql。(推荐使用mysql 5.7及以上版本)

  • 1.创建数据库
  • 2.开启PrometheusAlert配置文件中关于mysql的配置 conf/app.conf,数据库名称与上面创建的数据一致,并启动PrometheusAlert,PrometheusAlert启动时会自动初始化数据库表。

  • 3.利用Navicat或命令行将db目录中的 prometheusalert.sql 导入数据库prometheusalert

  • 4.重启PrometheusAlert,这样即完成配置PrometheusAlert使用mysql数据库作为默认后端存储。

PrometheusAlert语音播报插件部署


  • PrometheusAlert语音播报插件目前仅支持windows系统部署,用于将从PrometheusAlert接收到的告警消息文本转换为语音播报给用户。

插件存放在源码PrometheusAlertVoice目录下,可直接运行

默认配置文件setup.ini

图形界面

监控运维告警工具之PrometheusAlert

监控运维告警工具之PrometheusAlert

所有配置文件内容

PrometheusAlert/conf/app-example.conf

Prometheus 接入PrometheusAlert配置

需要更改Alertmanager的配置,将所有告警信息都转发到PrometheusAlert,参考如下Alertmanager配置如下:

PS:示例内容是默认选择的钉钉机器人的自定义模板prometheus-dd,如使用其他接收端,请更改Url参数中的typetpl即可,具体接口参数可参考 [接口说明]()

配置完成后,重启或者reload Alertmanager,使配置生效即可。

最终告警效果:

本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

img

多个告警接口配置,例如钉钉和email同时配置:

Grafana接入PrometheusAlert配置

参考:https://gitee.com/feiyu563/PrometheusAlert/blob/master/doc/readme/system-grafana.md

首先使用管理员或者具有告警配置权限的帐号登录进 Grafana 管理页面,登录后进入 Alerting——>Contact point ——> New contact point ——> 接入方式选择 webhook(在该webhook中配置fsurl可实现分组告警):

图片

配置完成后点击 Test ,飞书查看接收到测试消息即成功(at=all 实现@所有人)!

首先使用管理员或者具有告警配置权限的帐号登录进Grafana管理页面,登录后进入notification channels配置。

grafana1

注意此处的地址需要去PrometheusAlert的模版页面获取,如发送给钉钉的grafana模版http://[prometheusalert_url]:8080/prometheusalert?type=dd&tpl=grafana-dd&ddurl=钉钉机器人地址&at=18888888888

grafana2

PrometheusAlert的模版页面

grafana4

配置完成后保存即可.继续进行告警消息配置,选择任意一个折线图,点击编辑,进入aler配置,配置参考下图:

grafana3

grafana4

最终告警效果:

grafana5

钉钉告警配置


开启钉钉机器人

打开钉钉,进入钉钉群中,选择群设置-->智能群助手-->添加机器人-->自定义,可参下图:

监控运维告警工具之PrometheusAlert

监控运维告警工具之PrometheusAlert

新版本的钉钉加了安全设置,只需选择安全设置中的 自定义关键词 即可,并将关键词设置为 Prometheus或者app.conf中设置的title值均可,参考下图

image-20230228090411548

监控运维告警工具之PrometheusAlert

复制图中的Webhook地址,并填入PrometheusAlert配置文件app.conf中对应配置项即可。

PS: 钉钉机器人目前已经支持 @某人 ,使用该功能需要取得对应用户的钉钉关联手机号码,如下图:

监控运维告警工具之PrometheusAlert

钉钉目前支持只支持markdown语法的子集,具体支持的元素如下:

钉钉相关配置:

钉钉告警模板:

如何使用

以Prometheus配合自定义模板为例:

Prometheus配置参考:

错误

报错:[I] [prometheusalert.go:449] [1677630294256745168] [dingding]
{"status":1111,"wait":5,"source":"x5","punish":"deny","uuid":"3cd29dcxxxxxee4e27b07027","errcode": 130101,"errmsg": "send too fast, exceed 20 times per minute"}

钉钉机器人发送频率限制是 20条/每分钟,如果超过限制,会返回 send too fast 错误信息,限制发送10分钟

邮件告警配置

https://gitee.com/feiyu563/PrometheusAlert/blob/master/doc/readme/conf-email.md

Email相关配置:

如何使用

以Prometheus配合自定义模板为例:

Prometheus配置参考:

邮件告警模板配置:

企业微信告警配置

https://feiyu563.gitbook.io/prometheusalert/conf/conf-wechat

https://feiyu563.gitbook.io/prometheusalert/conf/conf-workwechat

飞书告警配置

https://feiyu563.gitbook.io/prometheusalert/conf/conf-feishuapp

阿里云短信和电话告警配置

https://feiyu563.gitbook.io/prometheusalert/conf/conf-aliyun

时区问题

https://gitee.com/feiyu563/PrometheusAlert/blob/master/doc/readme/system-func.md

告警路由功能

https://feiyu563.gitbook.io/prometheusalert/web/web-router

简介

PrometheusAlert的告警路由目前仅支持Prometheus的告警消息。

告警路由的功能是通过过滤来自Prometheus告警消息中的label来实现将消息转发到不同的模板和模板对应的接收目标。整体设计类似Alertmanager的路由功能。

image-20230228171043690

路由功能使用案例

假设默认的Prometheus Alertmanager配置如下:

在该配置下,所有Prometheus的告警消息均会通过PrometheusAlert的自定义模板 prometheus-dd 渲染消息后,转发到钉钉机器人 https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxxx ,并@手机号为 18888888888 的相关人员。

在许多场景下,可能存在需要将告警消息按照不同的分类发送给不同的接收目标和人员,比如:

  • 将告警消息 label 中包含 level=4 的告警采用腾讯云电话的自定义模板,并转发给用户1999999999。则可以参考下图新增路由即可

监控运维告警工具之PrometheusAlert

  • 将告警消息 label 中包含 app=kube-metricsenv=dev 的告警采用飞书的自定义模板,并转发给飞书机器人 https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx-xxxxx-xxxx-xxxxx 。则可以参考下图新增路由即可

image-20230228171133085

Prometheus 告警消息的 label 可以去PrometheusAlert页面的告警记录中查看,如图所示

监控运维告警工具之PrometheusAlert

官网详细目录

告警通知错误码

参考:https://help.aliyun.com/document_detail/431934.html

本文介绍告警通知相关的错误码信息。

配置错误

故障级别故障类型故障详情故障说明解决方案
errorAlertPolicyNotConfiguredAlert xxx has no alert policy configured未在告警监控规则中设置告警策略,告警无法被路由分组合并,导致对应的告警被忽略。修改告警监控规则,设置正确的告警策略。
AlertPolicyNotExistalert policy xxx does not exist告警监控规则所绑定的告警策略不存在,导致对应的告警被忽略。创建同名的告警策略或者使用其他告警策略。
AlertPolicyInvalidalert policy xxx format is error告警策略格式错误,告警无法被解析,导致对应的告警被忽略。修改告警策略或者删除该告警策略并重新创建同名的告警策略。
GroupPolicyEmptyGroup policy of alert policy xxx is empty未设置告警策略中的路由合并策略,导致对应的告警被忽略。设置告警策略中的路由合并策略,避免为空。
ActionPolicyNotExistaction policy xxx does not exist行动策略不存在,导致使用了该行动策略的告警不被发送。创建行动策略或者使用其他行动策略。
ActionPolicyInvalidaction policy xxx is invalid行动策略格式错误,导致使用了该行动策略的告警不被发送。修改行动策略或者删除该行动策略后再重新创建同名行动策略。
ActionPolicyEmptyPrimary(Secondary) policy for action policy xxx is empty第一、第二行动策略为空,导致使用该行动策略的告警不被发送。修改行动策略,确保不为空。
warnAlertPolicyInheritanceLoopalert policy xxx has inheritance loop with yyy告警策略集成存在循环,例如A继承B,B又继承A。如果设置为A,则按照B、A的顺序生效。如果设置为B,则按照A、B的顺序生效。不会无限解析继承链。修改告警策略,避免存在循环继承。
UserNotExistuser xxx does not exist目标用户不存在,导致该用户不会被通知。创建该用户或者设置行动策略使用其他用户。
UserGroupNotExistgroup xxx does not exist目标用户组不存在,导致该用户组不会被通知。创建该用户组或者设置行动策略使用其他用户组。
UserGroupEmptygroup xxx is empty目标用户组为空,导致该用户组不会被通知。为该用户组添加用户。
OncallGroupNotExistoncall group xxx does not exist目标值班组不存在,导致该值班组不会被通知。创建该值班组或者设置行动策略使用其他值班组。
ContentTemplateNotExistcontent template xxx does not exist目标内容模板不存在,导致使用该内容模板的通知渠道被忽略。创建该内容模板或者设置行动策略使用其他内容模板。
CalendarNotExistcalendar xxx does not exist目标日历不存在,导致使用该日历的值班组被忽略。创建该日历或者设置值班组使用其它日历。
ChannelQuotaNotExistchannel quota does not exist渠道配额不存在,导致发送通知时忽略Quota限制。创建渠道配额。
ChannelQuotaInvalidchannel quota format is invalid渠道配额为空,导致发送通知时忽略Quota限制。修改渠道配额的内容,确保限制不为空。

钉钉通知错误码

错误码错误信息说明解决方法
130101send too fast, exceed 20 times per minute钉钉限制每个机器人每分钟最多发送20条消息。避免多个告警同时使用一个机器人发送通知,您可以创建多个机器人进行分流。使用告警合并等降噪手段实现通知降噪。
310000keywords not in content通知内容中不包含任何关键词。设置钉钉机器人安全设置中的其中一个自定义关键字为告警
310000sign not match签名不匹配。请设置钉钉机器人的安全设置自定义关键字且其中一个关键字设置为告警
310000ip X.X.X.X not in whitelistIP地址不在白名单中。设置钉钉机器人的安全设置自定义关键字,且其中一个关键字设置为告警
300001token is not exist机器人的Webhook地址不存在。检查机器人的Webhook地址是否正确。检查对应的机器人是否被移除。
40035缺少参数 access_token机器人的Webhook地址缺少access_token参数。检查机器人的Webhook地址是否正确。
400102bot is stopped机器人已被禁用。检查当前机器人的状态。使用状态正常的机器人的Webhook地址。
450103only group admin can @ All仅群主和群管理员可@所有人。在行动策略中,设置提醒方式为指定成员或不提醒。

企业微信通知错误码

错误码错误信息说明解决方法
45009api freq out of limit企业微信限制每个机器人每分钟最多发送20条消息。避免多个告警同时使用一个机器人发送通知,您可以创建多个机器人进行分流。使用告警合并等降噪手段实现通知降噪。
40058markdown.content exceed max length 4096. invalid Request Parameter企业微信限制机器人通知长度不超过4096字节。调整内容模板配置,减少渲染后的通知内容长度。
93000invalid webhook url机器人Webhook地址不正确。检查机器人的Webhook配置是否正确。

飞书通知错误码

错误码错误信息说明解决方法
9499too many request飞书限制每个机器人每分钟最多发送20条消息。避免多个告警同时使用一个机器人发送通知,您可以创建多个机器人进行分流。使用告警合并等降噪手段实现通知降噪。
11246不固定,例如path: message-\u003ecard-\u003e1th block(markdown)-\u003e5th md(center); err_msg: unsupported type of html tag; err_type: validation;一般是通知内容格式错误。请根据实际的错误信息进行排查。
19001param invalid: incoming webhook access token invalid机器人Webhook地址不正确。检查机器人的Webhook是否正确。
19007Bot Not Enabled机器人已被禁用。检查当前机器人的状态。使用状态正常的机器人的Webhook地址。
19024Key Words Not Found消息内容中不包含任何关键词。设置飞书机器人安全设置中的其中一个自定义关键字为告警

总结

1、使用该工具,简化了很多配置

2、邮件不能发送,多半是模板配置问题;收邮件时,在垃圾箱找找,可以在服务端配置白名单;可以使用QQ邮箱,也可以使用企业邮箱

3、

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部