- 背景
想通过prometheusalert实现阿里云短信告警。结果在配置完altermanager和prometheusalert,以及阿里云短信服务中的各种签名和短信模板之后,在prometheusalert web ui上测试模板时一直报“模板变量JSON格式错误 或 JSON变量属性与模板占位符不一致”及“模版中的变量code(\r\nMemory使用率超过80%\r\n)不符合[用户昵称]的变量规范!”和“只能向已回复授权信息的手机号发送”问题。
- 问题分析
1、“模板变量JSON格式错误 或 JSON变量属性与模板占位符不一致”问题
问题原因:向阿里云短信服务器推送的json字符串与阿里云短信模板中的模板字段不匹配导致。
通过联系阿里云客服得知阿里云接收到的传参格式不对,多出来了一个无值且无分隔符的code字段。导致阿里云返回告警:"模板变量JSON格式错误 或 JSON变量属性与模板占位符不一致"。
通过分析源码得知:
prometheusalet代码中硬编码code字段。原因可能是,开发者以验证码场景为例编写的代码,为考虑通用性,或后续未更新代码适配阿里云短信的其他使用场景。
解决方法:
重新申请一个仅含有code字段的阿里云短信模板,配合prometheusalert对应的阿里云模板使用(prometheusalert上对应阿里云短信的模板:{{ range $k,$v:=.alerts }}{{$v.annotations.description}}{{ end }})。虽然只能传输一个字段,但可跑通业务,我们可以在阿里云短信模板字段规定的字段类型和长度中用尽量少的字数描述更多的信息。
2、“只能向已回复授权信息的手机号发送”问题
测试签名和测试模板只能对控制台添加的测试号码发送短信。
3、“模版中的变量code(\r\nMemory使用率超过80%\r\n)不符合[用户昵称]的变量规范!”问题
问题原因:变量对应值中共包含’\r\n’,因为在prometheusalert中定义阿里云模板时使用了换行符导致。如下所示:
修改为:
即可解决。