报警模板语言
通知模板和报警规则模板(例如标注和标签)都使用 Go 模板语言 text/template。
这两种类型的模板都可以使用 Go 模板语言的相同关键词、函数和比较运算符,例如 range
、if
、and
、index
、eq
等等。
然而,需要注意的是,由于通知和报警规则在不同的上下文环境中运行,一些额外的变量和函数仅适用于通知模板或报警规则模板。请参考
本文档概述了 Go 模板语言中可用于通知和报警规则模板的函数和运算符。
打印
要打印某个值,请使用 {{
和 }}
。您可以打印变量的值、变量的字段、函数的结果或点号 (dot) 的值。
{{ $values }}
{{ $values.A.Value }}
{{ humanize 1000.0 }}
{{ .Alerts }}
点号 (Dot)
在 text/template
中,有一个特殊的光标称为点号 (dot),写作 .
。您可以将此光标视为一个变量,其值会根据在模板中的使用位置而改变。
在通知模板的开头,点号 (.
) 指的是 通知数据 (Notification Data)。
{{ .Alerts }}
在标注和标签模板中,点号 (.
) 使用所有警报数据进行初始化。建议改用 $labels
和 $values
变量来直接访问警报标签和查询值。
If (如果)
您可以在模板中使用 if
语句。例如,当变量为空时,您可以打印 Variable empty
{{ if $element }}
Element value: {{$element}}
{{ else }}
Element is empty
{{ end }}
With (带)
with
类似于 if
语句,但与 if
不同的是,它会将点号 (.
) 更新为 with
表达式的值
{{ with $array }}
There are {{ len . }} item(s)
{{ else }}
There are no alerts
{{ end }}
Range (范围)
range
会迭代数组或映射,并且点号 (.
) 会被设置为数组的当前元素
{{ range $array }}
{{ .itemPropertyName }}
{{ end }}
或者,您可以使用 else
处理空对象
{{ range $array }}
{{ .itemPropertyName }}
{{ else }}
Empty array
{{ end }}
您还可以通过在 range
的开头定义 index 和 value 变量来获取 range 中每个项的索引
{{ $num_items := len $array }}
{{ range $index, $item := $array }}
This is item {{ $index }} out of {{ $num_items }}
{{ end }}
此外,您可以使用 {{break}}
停止剩余的迭代,或使用 {{continue}}
停止当前迭代并继续下一个迭代。
函数
text/template
中可用的全局函数有
函数 | 描述 |
---|---|
and | 返回其参数的布尔 AND,通过返回第一个空参数或最后一个参数。 |
call | 返回调用第一个参数的结果,第一个参数必须是函数,其余参数作为调用参数。 |
html | 返回其参数文本表示形式的 HTML 转义等价物。 |
index | 返回使用后续参数对第一个参数进行索引的结果,例如 {{ index $labels "instance" }} 返回 $labels 映射变量中的 instance 键。 |
slice | 返回使用剩余参数对第一个参数进行切片的结果。 |
js | 返回其参数文本表示形式的 JavaScript 转义等价物。 |
len | 返回其参数的整数长度,例如 {{ len $array }} |
not | 返回其单个参数的布尔否定。 |
or | 返回其参数的布尔 OR,通过返回第一个非空参数或最后一个参数。 |
print | fmt.Sprint 的别名 |
printf | fmt.Sprintf 的别名 |
println | fmt.Sprintln 的别名 |
urlquery | 返回其参数文本表示形式的转义值,该值适用于嵌入 URL 查询中 |
有关更多详细信息,请参考 text/template 中函数的官方文档。
比较运算符
text/template 中也提供了布尔比较运算符
函数 | 描述 |
---|---|
eq | 返回 arg1 == arg2 的布尔值 |
ne | 返回 arg1 != arg2 的布尔值 |
lt | 返回 arg1 < arg2 的布尔值 |
le | 返回 arg1 <= arg2 的布尔值 |
gt | 返回 arg1 > arg2 的布尔值 |
ge | 返回 arg1 >= arg2 的布尔值 |
变量
text/template 中的变量必须在模板内创建。例如,您可以像这样创建一个包含当前点号 (.
) 值的变量,并将字符串或其他对象赋值给它
{{ $variable := . }}
{{ $variable := "This is a test" }}
{{ $variable }}
此模板输出
This is a test
模板
您可以创建可重用的模板,这些模板可以从其他模板或同一模板中执行。
使用 define
和双引号中的模板名称定义模板
{{ define "print_labels" }}
{{ end }}
您不应定义与现有模板同名的模板,包括 __subject
, __text_values_list
, __text_alert_list
, default.title
和 default.message
等默认模板。如果创建的模板与默认模板或另一通知模板中的模板同名,Grafana 可能会使用其中任意一个。当存在两个或多个同名模板时,Grafana 不会阻止创建或显示错误消息。
执行模板
您可以使用 template
、双引号中的模板名称以及应传递给模板的光标来执行已定义的模板
{{ template "print_labels" . }}
在模板内部,点号指向传递给模板的值。
例如,如果一个模板被传递了一个触发警报列表,那么点号就指向该触发警报列表
{{ template "print_alerts" .Alerts }}
如果模板被传递了警报的排序标签,那么点号就指向该排序标签列表
{{ template "print_labels" .SortedLabels }}
这在编写可重用模板时非常有用。例如,要打印所有警报,您可以编写以下内容
{{ template "print_alerts" .Alerts }}
然后,要只打印触发警报,您可以这样写
{{ template "print_alerts" .Alerts.Firing }}
这之所以有效,是因为 .Alerts
和 .Alerts.Firing
都是警报列表。
{{ define "print_alerts" }}
{{ range . }}
{{ template "print_labels" .SortedLabels }}
{{ end }}
{{ end }}
注意
与通知模板不同,您不能为标签和标注创建独立的、可重用的模板。在报警规则模板中,您需要在标签或标注字段内内联编写每个模板。
注释
您可以使用 {{/*
和 */}}
添加注释
{{/* This is a comment */}}
为避免添加换行符,请使用
{{- /* This is a comment with no leading or trailing line breaks */ -}}
缩进
您可以使用缩进(制表符和空格)和换行符,使模板更易读
{{ range .Alerts }}
{{ range .Labels.SortedPairs }}
{{ .Name }} = {{ .Value }}
{{ end }}
{{ end }}
然而,模板中的缩进也会体现在文本中。
移除空格和换行符
在 text/template 中,使用 {{-
和 -}}
来移除开头和结尾的空格及换行符。
例如,当使用缩进和换行符使模板更易读时
{{ range .Alerts }}
{{ range .Labels.SortedPairs }}
{{ .Name }} = {{ .Value }}
{{ end }}
{{ end }}
缩进和换行符也会体现在文本中
alertname = "Test"
grafana_folder = "Test alerts"
您可以通过将每个 range 开头的 }}
更改为 -}}
来从文本中移除缩进和换行符
{{ range .Alerts -}}
{{ range .Labels.SortedPairs -}}
{{ .Name }} = {{ .Value }}
{{ end }}
{{ end }}
模板中的缩进和换行符现在不再体现在文本中
alertname = "Test"
grafana_folder = "Test alerts"