Alertmanager: 确认通知模板的展开
首先
在设置Alertmanager的通知模板时,您可能想要在本地确认模板是否按照预期进行展开。这种情况下,使用amtool的template render子命令可以方便地使用任意数据来展开模板。
安装amtool。
amtool 是Alertmanager的命令行工具。amtool可以在发布的二进制文件中找到,也可以通过go get单独安装。从v0.23.0版本开始,amtool实现了template render子命令来展开通知模板。
go get github.com/prometheus/alertmanager/cmd/amtool
确认模板的展开
使用amtool的模板渲染子命令来展开模板。
如果想要使用名为 slack.text 的模板来复制 slack.tmpl 模板文件,可以按照以下方式进行操作。 data.json 是用于传递给模板的 JSON 格式数据(稍后介绍)。
amtool template render \
--template.glob=slack.tmpl \
--template.text='{{ template "slack.text" . }}' \
--template.data=data.json
执行完后,将显示模板的展开结果。
• *<https://1.example.com/|alert1>*: desc1
• *<https://2.example.com/|alert2>*: desc2
–template.glob 是一个必需的参数,但通过指定诸如 /dev/null 等假引用,也可以仅验证模板字符串而不实际应用。
amtool template render \
--template.glob=/dev/null \
--template.text='{{- .Status | toUpper }}{{ if eq .Status "firing" }} {{ .Alerts.Firing | len }} ALERTS{{ end }} ({{ .GroupLabels.cluster }})' \
--template.data=data.json
同样的结果将被显示出来。
FIRING 2 ALERTS (cluster-A)
准备模板数据
模板数据可以通过 –template.data 参数指定为 JSON 格式的文件。如果省略此参数,则会使用默认的虚拟数据。然而,标签、注释等键和值在每个环境中都可能不同,因此大多数情况下需要自己准备数据。
传递给模板的数据格式在通知模板参考中进行了说明。例如,在前面的确认中,我们使用了以下数据。不幸的是,在v0.23版本中,暂时不支持直接使用YAML格式,但是您可以使用下一节介绍的方法来使用YAML。
{
"Status": "firing",
"Alerts": [
{
"Status": "firing",
"Labels": {
"alertname": "alert1"
},
"Annotations": {
"runbook": "https://1.example.com/",
"description": "desc1"
}
},
{
"Status": "firing",
"Labels": {
"alertname": "alert2"
},
"Annotations": {
"runbook": "https://2.example.com/",
"description": "desc2"
}
}
],
"GroupLabels": {
"cluster": "cluster-A"
}
}
使用YAML格式的模板数据
如果使用JSON格式编辑数据感到困难,那么在运行时准备数据并将其转换为JSON格式会很方便。在下面的示例中,我们使用bash的进程替换(<(command))以及yq工具将data.yaml转换为JSON格式。
amtool template render \
--template.glob=/dev/null \
--template.text='{{- .Status | toUpper }}{{ if eq .Status "firing" }} {{ .Alerts.Firing | len }} ALERTS{{ end }} ({{ .GroupLabels.cluster }})' \
--template.data=<(yq e -o=json . data.yaml)
最后
不仅限于Alertmanager,模板在编辑时往往会添加多余的空格和换行等错误。如果编写了复杂的模板,请务必尝试使用amtool的template render功能。