报警模板语言
通知模板和警报规则模板(如注释和标签)都使用 Go 模板语言 text/template。
两种类型的模板都可以使用 Go 模板语言的相同关键字、函数和比较运算符,例如 range
、if
、and
、index
、eq
等。
但是,请务必注意,由于通知和警报规则在不同的上下文下运行,因此某些附加变量和函数仅可用于通知模板或警报规则模板。请参阅
本文档概述了 Go 模板语言中可用于通知和警报规则模板的函数和运算符。
打印
要打印某个值,请使用 {{
和 }}
。您可以打印 变量的值、变量的字段、函数的结果或 dot 的值。
{{ $values }}
{{ $values.A.Value }}
{{ humanize 1000.0 }}
{{ .Alerts }}
点
在 text/template
中,有一个特殊的游标称为 dot,写为 .
。您可以将此游标视为一个变量,其值取决于其在模板中的使用位置。
在通知模板的开头,dot (.
) 指代 通知数据。
{{ .Alerts }}
在注释和标签模板中,dot (.
) 初始化为所有警报数据。建议使用 $labels
和 $values
变量来直接访问警报标签和查询值。
If
您可以在模板中使用 if
语句。例如,当变量为空时可以打印 Variable empty
。
{{ if $element }}
Element value: {{$element}}
{{ else }}
Element is empty
{{ end }}
With
with
类似于 if
语句,但与 if
不同的是,它会更新 dot(.
) 以指代 with
中表达式的值。
{{ with $array }}
There are {{ len . }} item(s)
{{ else }}
There are no alerts
{{ end }}
Range
range
迭代数组或映射,dot (.
) 设置为数组的当前元素
{{ 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
中的变量必须在模板内部创建。例如,您可以使用 dot (.
) 的当前值创建一个变量,并将字符串或其他对象赋值给该变量,如下所示:
{{ $variable := . }}
{{ $variable := "This is a test" }}
{{ $variable }}
此模板输出
This is a test
模板
您可以创建可重用的模板,这些模板可以从其他模板或同一模板内执行。
使用 define
和双引号中的模板名称定义模板
{{ define "print_labels" }}
{{ end }}
您不应定义与 default 模板(如 __subject
、__text_values_list
、__text_alert_list
、default.title
和 default.message
)或其他通知模板中的模板同名的模板。如果模板与 default 模板或另一个通知模板中的模板同名,Grafana 可能会使用其中任意一个。当存在两个或多个同名模板时,Grafana 不会阻止或显示错误消息。
执行模板
您可以使用 template
、双引号中的模板名称以及应传递给模板的游标来执行已定义的模板。
{{ template "print_labels" . }}
在模板内部,dot 指代传递给模板的值。
例如,如果模板传入触发警报列表,则 dot 指代该触发警报列表。
{{ template "print_alerts" .Alerts }}
如果模板传入警报的排序标签,则 dot 指代排序标签列表。
{{ 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"