PrometheusAlert 是开源的运维告警中心消息转发系统,支持主流的监控系统 Prometheus、Zabbix,日志系统 Graylog2,Graylog3、数据可视化系统 Grafana、SonarQube。阿里云 - 云监控,以及所有支持 WebHook 接口的系统发出的预警消息,支持将收到的这些消息发送到钉钉,微信,email,飞书,腾讯短信,腾讯电话,阿里云短信,阿里云电话,华为短信,百度云短信,容联云电话,七陌短信,七陌语音,TeleGram,百度 Hi(如流) 等
项目地址:
https://github.com/feiyu563/PrometheusAlert
原本计划使用 PrometheusAlert 进行报警发短信操作,但是发现怎么调试都不通,再加上 PrometheusAlert 日志打印核心地方较少,调试很麻烦,下面记录一下我查找问题的记录。
自定义模板测试
首先 PrometheusAlert 很方便的提供了一个调试页面,可以编写 golang 模板进行调试,还可以发送 json 内容进行渲染,这对于调试问题是一个很好的方法,但是我们在不知道 json 结构体的情况下很容易出现问题。
当我们填入一段错误的 json 时,页面返回是一个空没有任何返回,通过查看源码可以发现返回空的原因。
在函数方法 PrometheusAlert 中会针对 prometheus 的消息进行处理,并进行反序列化处理,如果这里的 json 内容是错误的,那么 p_alertmanager_json 里面的内容也就是空的,这将会导致下面的逻辑被忽略,message 是一个空值,也就返回了空
可以在 json 序列化处增加打印,更好的调试问题。
当我们提供的调试 json 不争取的时候也能正确的看到错误信息
由于官方并没有提供具体的 json 消息体内容,只说让在日志里面找。这里为了方便大家调试我把自己用的 json 消息体提供给大家,大家可以用来调试问题。
{
"receiver": "ding",
"status": "firing",
"alerts": [{
"status": "firing",
"labels": {
"alertname": "DNS 设置错误",
"env": "dev",
"hostname": "Dddn.com",
"intance": "172.31.52.149",
"module": "dns",
"process": "opsinspecion"
},
"annotations": {
"description": "DNS search 不是 ddn.com",
"summary": ""},"startsAt":"2023-06-05T16:30:12.375044513+08:00","endsAt":"0001-01-01T00:00:00Z","generatorURL":"",
"fingerprint": "774babf2d9ea114a"
}],
"groupLabels": {"alertname": "DNS 设置错误"},
"commonLabels": {
"alertname": "DNS 设置错误",
"env": "dev",
"hostname": "Dddn.com",
"intance": "172.31.52.149",
"module": "dns",
"process": "opsinspecion"
},
"commonAnnotations": {
"description": "DNS search 不是 ddn.com",
"summary": ""},"externalURL":"http://node2:9093","version":"4","groupKey":"{}/{job=~\"^(?:.*)$\"}:{alertname=\"DNS 设置错误 \"}"
}
再次测试我们发现会出现如下提示
这个时候就是因为阿里云短信模板没有按照代码里设置的变量进行传参导致的。
可以看到后台日志报错如下:
isv.SMS_TEMPLATE_ILLEGAL
官方排错指南
检查 app.conf 中短信签名与短信模板的配置,如果确定都没有问题,那么继续检查短信模板中的变量设置,因为我们之前 zabbix 短信变量设置了两个,所以 PrometheusAlert 无法发送短信,PrometheusAlert 默认参数为 code,这个时候要么修改短信模板,要么就改动源码中的参数。
为了兼容老系统的报警,我这边对源码进行了修改。
根据阿里云短信模板的内容进行修改适配
controllers/aliyun.go
注释官方的 json 字符串拼接,更改为新的短信模板参数
再次测试短信发送,成功~