监控运维告警工具之PrometheusAlert
Tags: GrafanaPrometheusPrometheusAlert企业微信告警发送告警邮件告警平台告警路由时区电话告警监控短信告警钉钉告警飞书告警
简介
https://github.com/feiyu563/PrometheusAlert
https://gitee.com/feiyu563/PrometheusAlert
文档:https://feiyu563.gitbook.io/prometheusalert/
PrometheusAlert是开源的运维告警中心消息转发系统,支持主流的监控系统Prometheus、Zabbix,日志系统Graylog2,Graylog3、数据可视化系统Grafana、SonarQube等支持WebHook接口的系统发出的预警消息,支持将收到的这些消息发送到钉钉,微信,飞书,腾讯短信,腾讯电话,阿里云短信,阿里云电话,华为短信,百度云短信,容联云电话,七陌短信,七陌语音,TeleGram,百度Hi(如流)等。
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中的相关配置项方可使用。
- 1.安装好PrometheusAlert 参考:安装部署PrometheusAlert
- 2.配置 app.conf [可选] 参考:【 app.conf 默认参数配置】
- 3.配置告警系统接入PrometheusAlert 参考:【告警系统接入PrometheusAlert配置】
安装配置
PrometheusAlert可以部署在本地和云平台上,支持windows、linux、公有云、私有云、混合云、容器和kubernetes。你可以根据实际场景或需求,选择相应的方式来部署PrometheusAlert:
Linux安装启动
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #打开PrometheusAlert releases页面,根据需要选择需要的版本下载到本地解压并进入解压后的目录 如linux版本(https://github.com/feiyu563/PrometheusAlert/releases/download/v4.8.2/linux.zip) wget https://github.com/feiyu563/PrometheusAlert/releases/download/v4.8.2/linux.zip unzip linux.zip mv linux /usr/local/ cd /usr/local/prometheusAlert/ chmod +x PrometheusAlert #运行PrometheusAlert ./PrometheusAlert (#后台运行请执行 nohup ./PrometheusAlert &) #启动后可使用浏览器打开以下地址查看:http://127.0.0.1:8080 #默认登录帐号和密码在app.conf中有配置 |
Docker 安装启动
https://hub.docker.com/r/feiyu563/prometheus-alert
配置文件 app.conf 的内容可以使用环境变量的方式初始化。
所设置的变量前缀必须以 PA_
开始,后面使用配置文件的配置项名称,但是需要将配置项中所有的 -
替换为 _
。
特别注意的是使用环境变量对配置项中的大小写并不敏感。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #创建配置文件 mkdir /etc/prometheusalert-center/ wget https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/conf/app-example.conf -O /etc/prometheusalert-center/app.conf #启动PrometheusAlert并挂载配置文件 docker rm -f prometheus-alert docker run -itd \ --name prometheus-alert -h prometheus-alert \ -v /etc/prometheusalert-center:/app/conf \ -p 8081:8080 \ feiyu563/prometheus-alert:latest docker exec -it prometheus-alert sh #启动后可使用浏览器打开以下地址查看:http://127.0.0.1:8080 #默认登录帐号和密码在app.conf中有配置 |
在windows系统中运行
1 2 3 4 5 6 7 8 | #打开PrometheusAlert releases页面,根据需要选择需要的版本下载到本地解压并进入解压后的目录 如windows版本(https://github.com/feiyu563/PrometheusAlert/releases/download/v4.8.1/windows.zip) #进入程序目录并双击运行 PrometheusAlert.exe即可 cd windows/ #启动后可使用浏览器打开测试地址:http://127.0.0.1:8080 #默认登录帐号和密码在app.conf中有配置 |
在kubernetes中运行
1 2 3 4 5 | #Kubernetes中运行可以直接执行以下命令行即可(注意默认的部署模版中未挂载模版数据库文件 db/PrometheusAlertDB.db,为防止模版数据丢失,请自行增加挂载配置 ) kubectl apply -n monitoring -f https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/example/kubernetes/PrometheusAlert-Deployment.yaml #启动后可使用浏览器打开以下地址查看:http://[YOUR-PrometheusAlert-URL]:8080 #默认登录帐号和密码在app.conf中有配置 |
使用helm部署
1 2 3 4 5 6 7 8 9 10 11 | #clone项目源代码 git clone https://github.com/feiyu563/PrometheusAlert.git cd PrometheusAlert/example/helm #如需修改配置文件,请更新config中的app.conf #helm部署模版支持配置Ingress域名,可在values.yaml中进行配置 #配置修改完成后,通过以下命令启动即可(注意默认的部署模版中未挂载模版数据库文件 db/PrometheusAlertDB.db,为防止模版数据丢失,请自行增加挂载配置 ) helm upgrade --install monitor prometheusalert -n monitoring #启动后可使用浏览器打开以下地址查看: http://[Ingress_url]:[Ingress_port] #默认登录帐号和密码在app.conf中有配置 |
配置PrometheusAlert使用mysql作为后端数据存储
PrometheusAlert默认使用sqlite3作为后端自定义模板的存储,这种方式适合于单机部署,满足绝大部分生产场景使用。考虑到部分企业对于服务的高可用要求较高,同时也为了让PrometheusAlert更易于横向扩展,用户可以更改PrometheusAlert的默认存储为mysql。(推荐使用mysql 5.7及以上版本)
- 1.创建数据库1CREATE DATABASE prometheusalert CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
2.开启PrometheusAlert配置文件中关于mysql的配置 conf/app.conf,数据库名称与上面创建的数据一致,并启动PrometheusAlert,PrometheusAlert启动时会自动初始化数据库表。
123456#数据库驱动,支持sqlite3,mysql,如使用mysql,请开启db_host,db_user,db_password,db_name的注释db_driver=mysqldb_host=127.0.0.1:3306db_user=rootdb_password=rootdb_name=prometheusalert- 3.利用
Navicat
或命令行将db目录
中的prometheusalert.sql
导入数据库prometheusalert
12use prometheusalertsource prometheusalert.sql - 4.重启PrometheusAlert,这样即完成配置PrometheusAlert使用mysql数据库作为默认后端存储。
PrometheusAlert语音播报插件部署
- PrometheusAlert语音播报插件目前仅支持windows系统部署,用于将从PrometheusAlert接收到的告警消息文本转换为语音播报给用户。
插件存放在源码PrometheusAlertVoice
目录下,可直接运行
默认配置文件setup.ini
1 2 3 4 5 6 | [SERVER] #配置插件监听端口 PORT=9999 #设置语音播报语速的快慢,该参数的范围是从-10到10之间 SPEED=1 TITLE=PrometheusAlert语音播报 |
图形界面
所有配置文件内容
PrometheusAlert/conf/app-example.conf
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 | #---------------------↓全局配置----------------------- appname = PrometheusAlert #登录用户名 login_user=prometheusalert #登录密码 login_password=prometheusalert #监听地址 httpaddr = "0.0.0.0" #监听端口 httpport = 8080 runmode = dev #设置代理 proxy = http://123.123.123.123:8080 proxy = #开启JSON请求 copyrequestbody = true #告警消息标题 title=PrometheusAlert #链接到告警平台地址 GraylogAlerturl=http://graylog.org #钉钉告警 告警logo图标地址 logourl=https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png #钉钉告警 恢复logo图标地址 rlogourl=https://raw.githubusercontent.com/feiyu563/PrometheusAlert/master/doc/alert-center.png #短信告警级别(等于3就进行短信告警) 告警级别定义 0 信息,1 警告,2 一般严重,3 严重,4 灾难 messagelevel=3 #电话告警级别(等于4就进行语音告警) 告警级别定义 0 信息,1 警告,2 一般严重,3 严重,4 灾难 phonecalllevel=4 #默认拨打号码(页面测试短信和电话功能需要配置此项) defaultphone=xxxxxxxx #故障恢复是否启用电话通知0为关闭,1为开启 phonecallresolved=0 #是否前台输出file or console logtype=file #日志文件路径 logpath=logs/prometheusalertcenter.log #转换Prometheus,graylog告警消息的时区为CST时区(如默认已经是CST时区,请勿开启) prometheus_cst_time=0 #数据库驱动,支持sqlite3,mysql,postgres如使用mysql或postgres,请开启db_host,db_port,db_user,db_password,db_name的注释 db_driver=sqlite3 #db_host=127.0.0.1 #db_port=3306 #db_user=root #db_password=root #db_name=prometheusalert #是否开启告警记录 0为关闭,1为开启 AlertRecord=0 #是否开启告警记录定时删除 0为关闭,1为开启 RecordLive=0 #告警记录定时删除周期,单位天 RecordLiveDay=7 # 是否将告警记录写入es7,0为关闭,1为开启 alert_to_es=0 # es地址,是[]string # beego.Appconfig.Strings读取配置为[]string,使用";"而不是"," to_es_url=http://localhost:9200 # to_es_url=http://es1:9200;http://es2:9200;http://es3:9200 # es用户和密码 # to_es_user=username # to_es_pwd=password #---------------------↓webhook----------------------- #是否开启钉钉告警通道,可同时开始多个通道0为关闭,1为开启 open-dingding=1 #默认钉钉机器人地址 ddurl=https://oapi.dingtalk.com/robot/send?access_token=xxxxx #是否开启 @所有人(0为关闭,1为开启) dd_isatall=1 #是否开启微信告警通道,可同时开始多个通道0为关闭,1为开启 open-weixin=1 #默认企业微信机器人地址 wxurl=https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxx #是否开启飞书告警通道,可同时开始多个通道0为关闭,1为开启 open-feishu=1 #默认飞书机器人地址 fsurl=https://open.feishu.cn/open-apis/bot/hook/xxxxxxxxx # webhook 发送 http 请求的 contentType, 如 application/json, application/x-www-form-urlencoded,不配置默认 application/json wh_contenttype=application/json #---------------------↓腾讯云接口----------------------- #是否开启腾讯云短信告警通道,可同时开始多个通道0为关闭,1为开启 open-txdx=0 #腾讯云短信接口key TXY_DX_appkey=xxxxx #腾讯云短信模版ID 腾讯云短信模版配置可参考 prometheus告警:{1} TXY_DX_tpl_id=xxxxx #腾讯云短信sdk app id TXY_DX_sdkappid=xxxxx #腾讯云短信签名 根据自己审核通过的签名来填写 TXY_DX_sign=腾讯云 #是否开启腾讯云电话告警通道,可同时开始多个通道0为关闭,1为开启 open-txdh=0 #腾讯云电话接口key TXY_DH_phonecallappkey=xxxxx #腾讯云电话模版ID TXY_DH_phonecalltpl_id=xxxxx #腾讯云电话sdk app id TXY_DH_phonecallsdkappid=xxxxx #---------------------↓华为云接口----------------------- #是否开启华为云短信告警通道,可同时开始多个通道0为关闭,1为开启 open-hwdx=0 #华为云短信接口key HWY_DX_APP_Key=xxxxxxxxxxxxxxxxxxxxxx #华为云短信接口Secret HWY_DX_APP_Secret=xxxxxxxxxxxxxxxxxxxxxx #华为云APP接入地址(端口接口地址) HWY_DX_APP_Url=https://rtcsms.cn-north-1.myhuaweicloud.com:10743 #华为云短信模板ID HWY_DX_Templateid=xxxxxxxxxxxxxxxxxxxxxx #华为云签名名称,必须是已审核通过的,与模板类型一致的签名名称,按照自己的实际签名填写 HWY_DX_Signature=华为云 #华为云签名通道号 HWY_DX_Sender=xxxxxxxxxx #---------------------↓阿里云接口----------------------- #是否开启阿里云短信告警通道,可同时开始多个通道0为关闭,1为开启 open-alydx=0 #阿里云短信主账号AccessKey的ID ALY_DX_AccessKeyId=xxxxxxxxxxxxxxxxxxxxxx #阿里云短信接口密钥 ALY_DX_AccessSecret=xxxxxxxxxxxxxxxxxxxxxx #阿里云短信签名名称 ALY_DX_SignName=阿里云 #阿里云短信模板ID ALY_DX_Template=xxxxxxxxxxxxxxxxxxxxxx #是否开启阿里云电话告警通道,可同时开始多个通道0为关闭,1为开启 open-alydh=0 #阿里云电话主账号AccessKey的ID ALY_DH_AccessKeyId=xxxxxxxxxxxxxxxxxxxxxx #阿里云电话接口密钥 ALY_DH_AccessSecret=xxxxxxxxxxxxxxxxxxxxxx #阿里云电话被叫显号,必须是已购买的号码 ALY_DX_CalledShowNumber=xxxxxxxxx #阿里云电话文本转语音(TTS)模板ID ALY_DH_TtsCode=xxxxxxxx #---------------------↓容联云接口----------------------- #是否开启容联云电话告警通道,可同时开始多个通道0为关闭,1为开启 open-rlydh=0 #容联云基础接口地址 RLY_URL=https://app.cloopen.com:8883/2013-12-26/Accounts/ #容联云后台SID RLY_ACCOUNT_SID=xxxxxxxxxxx #容联云api-token RLY_ACCOUNT_TOKEN=xxxxxxxxxx #容联云app_id RLY_APP_ID=xxxxxxxxxxxxx #---------------------↓邮件配置----------------------- #是否开启邮件 open-email=0 #邮件发件服务器地址 Email_host=smtp.qq.com #邮件发件服务器端口 Email_port=465 #邮件帐号 Email_user=xxxxxxx@qq.com #邮件密码 Email_password=xxxxxx #邮件标题 Email_title=运维告警 #默认发送邮箱 Default_emails=xxxxx@qq.com,xxxxx@qq.com #---------------------↓七陌云接口----------------------- #是否开启七陌短信告警通道,可同时开始多个通道0为关闭,1为开启 open-7moordx=0 #七陌账户ID 7MOOR_ACCOUNT_ID=Nxxx #七陌账户APISecret 7MOOR_ACCOUNT_APISECRET=xxx #七陌账户短信模板编号 7MOOR_DX_TEMPLATENUM=n #注意:七陌短信变量这里只用一个var1,在代码里写死了。 #----------- #是否开启七陌webcall语音通知告警通道,可同时开始多个通道0为关闭,1为开启 open-7moordh=0 #请在七陌平台添加虚拟服务号、文本节点 #七陌账户webcall的虚拟服务号 7MOOR_WEBCALL_SERVICENO=xxx # 文本节点里被替换的变量,我配置的是text。如果被替换的变量不是text,请修改此配置 7MOOR_WEBCALL_VOICE_VAR=text #---------------------↓telegram接口----------------------- #是否开启telegram告警通道,可同时开始多个通道0为关闭,1为开启 open-tg=0 #tg机器人token TG_TOKEN=xxxxx #tg消息模式 个人消息或者频道消息 0为关闭(推送给个人),1为开启(推送给频道) TG_MODE_CHAN=0 #tg用户ID TG_USERID=xxxxx #tg频道name或者id, 频道name需要以@开始 TG_CHANNAME=xxxxx #tg api地址, 可以配置为代理地址 #TG_API_PROXY="https://api.telegram.org/bot%s/%s" #---------------------↓workwechat接口----------------------- #是否开启workwechat告警通道,可同时开始多个通道0为关闭,1为开启 open-workwechat=0 # 企业ID WorkWechat_CropID=xxxxx # 应用ID WorkWechat_AgentID=xxxx # 应用secret WorkWechat_AgentSecret=xxxx # 接受用户 WorkWechat_ToUser="zhangsan|lisi" # 接受部门 WorkWechat_ToParty="ops|dev" # 接受标签 WorkWechat_ToTag="" # 消息类型, 暂时只支持markdown # WorkWechat_Msgtype = "markdown" #---------------------↓百度云接口----------------------- #是否开启百度云短信告警通道,可同时开始多个通道0为关闭,1为开启 open-baidudx=0 #百度云短信接口AK(ACCESS_KEY_ID) BDY_DX_AK=xxxxx #百度云短信接口SK(SECRET_ACCESS_KEY) BDY_DX_SK=xxxxx #百度云短信ENDPOINT(ENDPOINT参数需要用指定区域的域名来进行定义,如服务所在区域为北京,则为) BDY_DX_ENDPOINT=http://smsv3.bj.baidubce.com #百度云短信模版ID,根据自己审核通过的模版来填写(模版支持一个参数code:如prometheus告警:{code}) BDY_DX_TEMPLATE_ID=xxxxx #百度云短信签名ID,根据自己审核通过的签名来填写 TXY_DX_SIGNATURE_ID=xxxxx #---------------------↓百度Hi(如流)----------------------- #是否开启百度Hi(如流)告警通道,可同时开始多个通道0为关闭,1为开启 open-ruliu=0 #默认百度Hi(如流)机器人地址 BDRL_URL=https://api.im.baidu.com/api/msg/groupmsgsend?access_token=xxxxxxxxxxxxxx #百度Hi(如流)群ID BDRL_ID=123456 #---------------------↓bark接口----------------------- #是否开启telegram告警通道,可同时开始多个通道0为关闭,1为开启 open-bark=0 #bark默认地址, 建议自行部署bark-server BARK_URL=https://api.day.app #bark key, 多个key使用分割 BARK_KEYS=xxxxx # 复制, 推荐开启 BARK_COPY=1 # 历史记录保存,推荐开启 BARK_ARCHIVE=1 # 消息分组 BARK_GROUP=PrometheusAlert #---------------------↓语音播报----------------------- #语音播报需要配合语音播报插件才能使用 #是否开启语音播报通道,0为关闭,1为开启 open-voice=1 VOICE_IP=127.0.0.1 VOICE_PORT=9999 #---------------------↓飞书机器人应用----------------------- #是否开启feishuapp告警通道,可同时开始多个通道0为关闭,1为开启 open-feishuapp=1 # APPID FEISHU_APPID=cli_xxxxxxxxxxxxx # APPSECRET FEISHU_APPSECRET=xxxxxxxxxxxxxxxxxxxxxx # 可填飞书 用户open_id、user_id、union_ids、部门open_department_id AT_USER_ID="xxxxxxxx" |
Prometheus 接入PrometheusAlert配置
需要更改Alertmanager的配置,将所有告警信息都转发到PrometheusAlert,参考如下Alertmanager配置如下:
PS:示例内容是默认选择的钉钉机器人的自定义模板prometheus-dd
,如使用其他接收端,请更改Url参数中的type
和tpl
即可,具体接口参数可参考 [接口说明]()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | global: resolve_timeout: 5m route: group_by: ['instance'] group_wait: 10s group_interval: 10s repeat_interval: 10m receiver: 'web.hook.prometheusalert' receivers: - name: 'web.hook.prometheusalert' webhook_configs: - url: 'http://[prometheusalert_url]:8080/prometheusalert?type=dd&tpl=prometheus-dd&ddurl=https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxxx&at=18888888888' |
配置完成后,重启或者reload Alertmanager,使配置生效即可。
最终告警效果:
多个告警接口配置,例如钉钉和email同时配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | cat > /usr/local/alertmanager/alertmanager.yml <<"EOF" global: resolve_timeout: 5m route: group_by: ['instance'] group_wait: 10s group_interval: 10s repeat_interval: 10m receiver: 'web.hook.prometheusalert' receivers: - name: 'web.hook.prometheusalert' webhook_configs: - url: 'http://127.0.0.1:8080/prometheusalert?type=dd&tpl=prometheus-dd&ddurl=https://oapi.dingtalk.com/robot/send?access_token=XXXXXXXXXXXX&at=1828888888' - url: 'http://127.0.0.1:8080/prometheusalert?type=email&tpl=prometheus-email&email=lhrbest@qq.com,646634621@qq.com' EOF |
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配置。
注意此处的地址需要去PrometheusAlert的模版页面获取,如发送给钉钉的grafana模版http://[prometheusalert_url]:8080/prometheusalert?type=dd&tpl=grafana-dd&ddurl=钉钉机器人地址&at=18888888888
PrometheusAlert的模版页面
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 | {{ define "myalert" }} [{{.Status}}] {{ .Labels.alertname }} Labels: {{ range .Labels.SortedPairs }} {{ .Name }}: {{ .Value }} {{ end }} {{ if gt (len .Annotations) 0 }} Annotations: {{ range .Annotations.SortedPairs }} {{ .Name }}: {{ .Value }} {{ end }} {{ end }} {{ if gt (len .SilenceURL ) 0 }} Silence alert: {{ .SilenceURL }} {{ end }} {{ if gt (len .DashboardURL ) 0 }} Go to dashboard: {{ .DashboardURL }} {{ end }} {{ end }} {{ define "mymessage" }} {{ if gt (len .Alerts.Firing) 0 }} {{ len .Alerts.Firing }} firing: {{ range .Alerts.Firing }} {{ template "myalert" .}} {{ end }} {{ end }} {{ if gt (len .Alerts.Resolved) 0 }} {{ len .Alerts.Resolved }} resolved: {{ range .Alerts.Resolved }} {{ template "myalert" .}} {{ end }} {{ end }} {{ end }} |
配置完成后保存即可.继续进行告警消息配置,选择任意一个折线图,点击编辑,进入aler配置,配置参考下图:
最终告警效果:
钉钉告警配置
开启钉钉机器人
打开钉钉,进入钉钉群中,选择群设置-->智能群助手-->添加机器人-->自定义,可参下图:
新版本的钉钉加了安全设置,只需选择安全设置中的 自定义关键词 即可,并将关键词设置为 Prometheus或者app.conf中设置的title值均可,参考下图
复制图中的Webhook地址,并填入PrometheusAlert配置文件app.conf中对应配置项即可。
PS: 钉钉机器人目前已经支持 @某人
,使用该功能需要取得对应用户的钉钉关联手机号码,如下图:
钉钉目前支持只支持markdown语法的子集,具体支持的元素如下:
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 | 标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 ###### 六级标题 引用 > A man who stands for nothing will fall for anything. 文字加粗、斜体 **bold** *italic* 链接 [this is a link](http://name.com) 图片  无序列表 - item1 - item2 有序列表 1. item1 2. item2 |
钉钉相关配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #---------------------↓全局配置----------------------- #告警消息标题 title=PrometheusAlert #钉钉告警 告警logo图标地址 logourl=https://www.malibucity.org/images/GraphicLinks/2/button%20template%20interior_alert_1.png #钉钉告警 恢复logo图标地址 rlogourl=https://www.malibucity.org/images/GraphicLinks/2/button%20template%20interior_alert_1.png #---------------------↓webhook----------------------- #是否开启钉钉告警通道,可同时开始多个通道0为关闭,1为开启 open-dingding=1 #默认钉钉机器人地址 ddurl=https://oapi.dingtalk.com/robot/send?access_token=xxxxx #是否开启 @所有人(0为关闭,1为开启) dd_isatall=1 |
钉钉告警模板:
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 | {{ $var := .externalURL}}{{ range $k,$v:=.alerts }} {{if eq $v.status "resolved"}} ## [Prometheus恢复信息]({{$v.generatorURL}}) #### [{{$v.labels.alertname}}]({{$var}}) ##### 当前时间: {{GetCSTtime ""}} - 告警级别:{{$v.labels.severity}} - 开始时间:{{GetCSTtime $v.startsAt}} - 结束时间:{{GetCSTtime $v.endsAt}} - 故障主机:**{{$v.labels.instance}}** - 详细内容:{{$v.annotations.description}}  {{else}} ## [Prometheus告警信息]({{$v.generatorURL}}) #### [{{$v.labels.alertname}}]({{$var}}) ##### 当前时间: {{GetCSTtime ""}} - 告警级别:{{$v.labels.severity}} - 开始时间:{{GetCSTtime $v.startsAt}} - 结束时间:{{""}} - 故障主机IP:**{{$v.labels.instance}}** - 详细内容:{{$v.annotations.description}} ##  {{end}} {{ end }} {{ $urimsg:=""}}{{ range $key,$value:=.commonLabels }}{{$urimsg = print $urimsg $key "%3D%22" $value "%22%2C" }}{{end}}[★★★ 点我屏蔽该告警 ★★★ ]({{$var}}/#/silences/new?filter=%7B{{SplitString $urimsg 0 -3}}%7D) |
如何使用
以Prometheus配合自定义模板为例:
Prometheus配置参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | global: resolve_timeout: 5m route: group_by: ['instance'] group_wait: 10s group_interval: 10s repeat_interval: 10m receiver: 'web.hook.prometheusalert' receivers: - name: 'web.hook.prometheusalert' webhook_configs: - url: 'http://[prometheusalert_url]:8080/prometheusalert?type=dd&tpl=prometheus-dd&ddurl=https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxxx&at=18888888888' |
错误
报错:[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相关配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #---------------------↓邮件配置----------------------- #是否开启邮件 open-email=1 #邮件发件服务器地址 Email_host=smtp.qq.com #邮件发件服务器端口 Email_port=465 #邮件帐号 Email_user=123456789@qq.com #邮件密码 Email_password=xxxxxxx #邮件标题 Email_title=运维告警 #默认发送邮箱 Default_emails=123456@qq.com,123456@baidu.com |
如何使用
以Prometheus配合自定义模板为例:
Prometheus配置参考:
1 2 3 4 5 6 7 8 9 10 11 12 | 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://[prometheusalert_url]:8080/prometheusalert?type=email&tpl=prometheus-email&email=Email地址,Email地址2' |
邮件告警模板配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | {{ $var := .externalURL}}{{ range $k,$v:=.alerts }} {{if eq $v.status "resolved"}} <h1><a href ={{$v.generatorURL}}>Prometheus恢复信息</a></h1> <h2><a href ={{$var}}>{{$v.labels.alertname}}</a></h2> <h5>告警级别:{{$v.labels.severity}}</h5> <h5>开始时间:{{GetCSTtime $v.startsAt}}</h5> <h5>结束时间:{{GetCSTtime $v.endsAt}}</h5> <h5>故障主机IP:{{$v.labels.instance}}</h5> <h5>详细内容:{{$v.annotations.description}}</h5> <img src=https://www.malibucity.org/images/GraphicLinks/2/button%20template%20interior_alert_1.png /> {{else}} <h1><a href ={{$v.generatorURL}}>Prometheus告警信息</a></h1> <h2><a href ={{$var}}>{{$v.labels.alertname}}</a></h2> <h5>告警级别:{{$v.labels.severity}}</h5> <h5>开始时间:{{GetCSTtime $v.startsAt}}</h5> <h5>结束时间:{{""}}</h5> <h5>故障主机IP:{{$v.labels.instance}}</h5> <h5>详细内容:{{$v.annotations.description}}</h5> <img src=https://www.malibucity.org/images/GraphicLinks/2/button%20template%20interior_alert_1.png /> {{end}} {{ end }} |
企业微信告警配置
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的路由功能。
路由功能使用案例
假设默认的Prometheus Alertmanager配置如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | 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://127.0.0.1:8080/prometheusalert?type=dd&tpl=prometheus-dd&ddurl=https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxxx&at=18888888888' |
在该配置下,所有Prometheus的告警消息均会通过PrometheusAlert的自定义模板 prometheus-dd
渲染消息后,转发到钉钉机器人 https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxxx
,并@手机号为 18888888888
的相关人员。
在许多场景下,可能存在需要将告警消息按照不同的分类发送给不同的接收目标和人员,比如:
- 将告警消息 label 中包含
level=4
的告警采用腾讯云电话的自定义模板,并转发给用户1999999999。则可以参考下图新增路由即可
- 将告警消息 label 中包含
app=kube-metrics
和env=dev
的告警采用飞书的自定义模板,并转发给飞书机器人https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxx-xxxxx-xxxx-xxxxx
。则可以参考下图新增路由即可
Prometheus 告警消息的 label 可以去PrometheusAlert页面的告警记录中查看,如图所示
官网详细目录
- 【PrometheusAlert入门】
- 【 app.conf 默认参数配置】
- 【告警系统接入PrometheusAlert配置】
- 【Dashboard页面功能使用】
- 【版本更新说明】
- 【如何对PrometheusAlert进行二次开发】
- 通用自定义模板共享链接
- Prometheus rules共享链接
告警通知错误码
参考:https://help.aliyun.com/document_detail/431934.html
本文介绍告警通知相关的错误码信息。
配置错误
故障级别 | 故障类型 | 故障详情 | 故障说明 | 解决方案 |
---|---|---|---|---|
error | AlertPolicyNotConfigured | Alert xxx has no alert policy configured | 未在告警监控规则中设置告警策略,告警无法被路由分组合并,导致对应的告警被忽略。 | 修改告警监控规则,设置正确的告警策略。 |
AlertPolicyNotExist | alert policy xxx does not exist | 告警监控规则所绑定的告警策略不存在,导致对应的告警被忽略。 | 创建同名的告警策略或者使用其他告警策略。 | |
AlertPolicyInvalid | alert policy xxx format is error | 告警策略格式错误,告警无法被解析,导致对应的告警被忽略。 | 修改告警策略或者删除该告警策略并重新创建同名的告警策略。 | |
GroupPolicyEmpty | Group policy of alert policy xxx is empty | 未设置告警策略中的路由合并策略,导致对应的告警被忽略。 | 设置告警策略中的路由合并策略,避免为空。 | |
ActionPolicyNotExist | action policy xxx does not exist | 行动策略不存在,导致使用了该行动策略的告警不被发送。 | 创建行动策略或者使用其他行动策略。 | |
ActionPolicyInvalid | action policy xxx is invalid | 行动策略格式错误,导致使用了该行动策略的告警不被发送。 | 修改行动策略或者删除该行动策略后再重新创建同名行动策略。 | |
ActionPolicyEmpty | Primary(Secondary) policy for action policy xxx is empty | 第一、第二行动策略为空,导致使用该行动策略的告警不被发送。 | 修改行动策略,确保不为空。 | |
warn | AlertPolicyInheritanceLoop | alert policy xxx has inheritance loop with yyy | 告警策略集成存在循环,例如A继承B,B又继承A。如果设置为A,则按照B、A的顺序生效。如果设置为B,则按照A、B的顺序生效。不会无限解析继承链。 | 修改告警策略,避免存在循环继承。 |
UserNotExist | user xxx does not exist | 目标用户不存在,导致该用户不会被通知。 | 创建该用户或者设置行动策略使用其他用户。 | |
UserGroupNotExist | group xxx does not exist | 目标用户组不存在,导致该用户组不会被通知。 | 创建该用户组或者设置行动策略使用其他用户组。 | |
UserGroupEmpty | group xxx is empty | 目标用户组为空,导致该用户组不会被通知。 | 为该用户组添加用户。 | |
OncallGroupNotExist | oncall group xxx does not exist | 目标值班组不存在,导致该值班组不会被通知。 | 创建该值班组或者设置行动策略使用其他值班组。 | |
ContentTemplateNotExist | content template xxx does not exist | 目标内容模板不存在,导致使用该内容模板的通知渠道被忽略。 | 创建该内容模板或者设置行动策略使用其他内容模板。 | |
CalendarNotExist | calendar xxx does not exist | 目标日历不存在,导致使用该日历的值班组被忽略。 | 创建该日历或者设置值班组使用其它日历。 | |
ChannelQuotaNotExist | channel quota does not exist | 渠道配额不存在,导致发送通知时忽略Quota限制。 | 创建渠道配额。 | |
ChannelQuotaInvalid | channel quota format is invalid | 渠道配额为空,导致发送通知时忽略Quota限制。 | 修改渠道配额的内容,确保限制不为空。 |
钉钉通知错误码
错误码 | 错误信息 | 说明 | 解决方法 |
---|---|---|---|
130101 | send too fast, exceed 20 times per minute | 钉钉限制每个机器人每分钟最多发送20条消息。 | 避免多个告警同时使用一个机器人发送通知,您可以创建多个机器人进行分流。使用告警合并等降噪手段实现通知降噪。 |
310000 | keywords not in content | 通知内容中不包含任何关键词。 | 设置钉钉机器人安全设置中的其中一个自定义关键字为告警。 |
310000 | sign not match | 签名不匹配。 | 请设置钉钉机器人的安全设置为自定义关键字且其中一个关键字设置为告警。 |
310000 | ip X.X.X.X not in whitelist | IP地址不在白名单中。 | 设置钉钉机器人的安全设置为自定义关键字,且其中一个关键字设置为告警。 |
300001 | token is not exist | 机器人的Webhook地址不存在。 | 检查机器人的Webhook地址是否正确。检查对应的机器人是否被移除。 |
40035 | 缺少参数 access_token | 机器人的Webhook地址缺少access_token参数。 | 检查机器人的Webhook地址是否正确。 |
400102 | bot is stopped | 机器人已被禁用。 | 检查当前机器人的状态。使用状态正常的机器人的Webhook地址。 |
450103 | only group admin can @ All | 仅群主和群管理员可@所有人。 | 在行动策略中,设置提醒方式为指定成员或不提醒。 |
企业微信通知错误码
错误码 | 错误信息 | 说明 | 解决方法 |
---|---|---|---|
45009 | api freq out of limit | 企业微信限制每个机器人每分钟最多发送20条消息。 | 避免多个告警同时使用一个机器人发送通知,您可以创建多个机器人进行分流。使用告警合并等降噪手段实现通知降噪。 |
40058 | markdown.content exceed max length 4096. invalid Request Parameter | 企业微信限制机器人通知长度不超过4096字节。 | 调整内容模板配置,减少渲染后的通知内容长度。 |
93000 | invalid webhook url | 机器人Webhook地址不正确。 | 检查机器人的Webhook配置是否正确。 |
飞书通知错误码
错误码 | 错误信息 | 说明 | 解决方法 |
---|---|---|---|
9499 | too many request | 飞书限制每个机器人每分钟最多发送20条消息。 | 避免多个告警同时使用一个机器人发送通知,您可以创建多个机器人进行分流。使用告警合并等降噪手段实现通知降噪。 |
11246 | 不固定,例如path: message-\u003ecard-\u003e1th block(markdown)-\u003e5th md(center); err_msg: unsupported type of html tag; err_type: validation; | 一般是通知内容格式错误。 | 请根据实际的错误信息进行排查。 |
19001 | param invalid: incoming webhook access token invalid | 机器人Webhook地址不正确。 | 检查机器人的Webhook是否正确。 |
19007 | Bot Not Enabled | 机器人已被禁用。 | 检查当前机器人的状态。使用状态正常的机器人的Webhook地址。 |
19024 | Key Words Not Found | 消息内容中不包含任何关键词。 | 设置飞书机器人安全设置中的其中一个自定义关键字为告警。 |
总结
1、使用该工具,简化了很多配置
2、邮件不能发送,多半是模板配置问题;收邮件时,在垃圾箱找找,可以在服务端配置白名单;可以使用QQ邮箱,也可以使用企业邮箱
3、