Prometheus支持在告警的注解和标签以及服务的控制台页面中进行模板化。模板具有对本地数据库运行查询,数据迭代,条件判断,格式化数据等功能。Prometheus模板语言基于 Go 模板 系统。
简单告警字段模版
复制 alert : InstanceDown
expr : up == 0
for : 5m
labels :
severity : page
annotations :
summary : "Instance {{$labels.instance}} down"
description : "{{$labels.instance}} of job {{$labels.job}} has been down for more than 5 minutes."
警报字段模板在触发告警期间的每个规则迭代执行,因此请保持所有查询和模板的轻量级。如果您需要更复杂的告警模板,建议改为链接到控制台。
简单迭代
以下将显示实例列表及它们是否启动:
复制 {{ range query "up" }}
{{ .Labels.instance }} {{ .Value }}
{{ end }}
特殊的.
变量包含每次循环迭代的当前样本值
显示一个值
复制 {{ with query "some_metric { instance='someinstance' } " }}
{{ . | first | value | humanize }}
{{ end }}
Go 和 Go 的模板语言都是强类型的,因此必须检查返回的样本以避免执行错误。如,如果采集或规则尚未运行,或者主机已关闭,则可能发生这种情况。
随附的prom_query_drilldown
模板可以处理此类问题,允许格式化结果并链接到表达式浏览器 。
使用控制台 URL 参数
复制 {{ with printf "node_memory_MemTotal { job='node' , instance='%s' } " .Params.instance | query }}
{{ . | first | value | humanize1024 }}B
{{ end }}
如果以console.html?instance=hostname
进行访问,.Params.instance
将被赋值为hostname
。
高级迭代
复制 <table>
{{ range printf "node_network_receive_bytes{job='node',instance='%s',device!='lo'}" .Params.instance | query | sortByLabel "device"}}
<tr><th colspan=2>{{ .Labels.device }}</th></tr>
<tr>
<td>Received</td>
<td>{{ with printf "rate(node_network_receive_bytes{job='node',instance='%s',device='%s'}[5m])" .Labels.instance .Labels.device | query }}{{ . | first | value | humanize }}B/s{{end}}</td>
</tr>
<tr>
<td>Transmitted</td>
<td>{{ with printf "rate(node_network_transmit_bytes{job='node',instance='%s',device='%s'}[5m])" .Labels.instance .Labels.device | query }}{{ . | first | value | humanize }}B/s{{end}}</td>
</tr>{{ end }}
</table>
在这个示例中,我们遍历所有网络设备并显示每个网络设备的网络流量。
由于range
操作未指定变量,因此.Params.instance
在循环内不可用,.
是循环变量。
定义可重用的模版
Prometheus 支持定义可重复使用的模板。与控制台库 支持结合使用时,此功能特别强大,允许在各个控制台之间共享模板。
复制 {{ /* Define the template */ }}
{{ define "myTemplate" }}
do something
{{ end }}
{{ /* Use the template */ }}
{{ template "myTemplate" }}
模板被限制于仅支持一个参数。 args
函数可用于包装多个参数。
复制 {{ define "myMultiArgTemplate" }}
First argument : {{ .arg0 }}
Second argument : {{ .arg1 }}
{{ end }}
{{ template "myMultiArgTemplate" (args 1 2) }}