菜单
Grafana Cloud Enterprise 开源

报警模板语言

通知模板和报警规则模板(例如标注和标签)都使用 Go 模板语言 text/template。

这两种类型的模板都可以使用 Go 模板语言的相同关键词、函数和比较运算符,例如 rangeifandindexeq 等等。

然而,需要注意的是,由于通知和报警规则在不同的上下文环境中运行,一些额外的变量和函数仅适用于通知模板或报警规则模板。请参考

本文档概述了 Go 模板语言中可用于通知和报警规则模板的函数和运算符。

打印

要打印某个值,请使用 {{}}。您可以打印变量的值、变量的字段、函数的结果或点号 (dot) 的值。

{{ $values }}
{{ $values.A.Value }}
{{ humanize 1000.0 }}
{{ .Alerts }}

点号 (Dot)

text/template 中,有一个特殊的光标称为点号 (dot),写作 .。您可以将此光标视为一个变量,其值会根据在模板中的使用位置而改变。

在通知模板的开头,点号 (.) 指的是 通知数据 (Notification Data)

{{ .Alerts }}

在标注和标签模板中,点号 (.) 使用所有警报数据进行初始化。建议改用 $labels$values 变量来直接访问警报标签和查询值。

注意

当在 rangewith 或编写用于其他模板的模板时,点号 (.) 可能指向其他内容。

If (如果)

您可以在模板中使用 if 语句。例如,当变量为空时,您可以打印 Variable empty

Go
{{ if $element }}
Element value: {{$element}}
{{ else }}
Element is empty
{{ end }}

With (带)

with 类似于 if 语句,但与 if 不同的是,它会将点号 (.) 更新为 with 表达式的值

Go
{{ with $array }}
There are {{ len . }} item(s)
{{ else }}
There are no alerts
{{ end }}

Range (范围)

range 会迭代数组或映射,并且点号 (.) 会被设置为数组的当前元素

Go
{{ range $array }}
{{ .itemPropertyName }}
{{ end }}

或者,您可以使用 else 处理空对象

Go
{{ range $array }}
  {{ .itemPropertyName }}
{{ else }}
  Empty array
{{ end }}

您还可以通过在 range 的开头定义 index 和 value 变量来获取 range 中每个项的索引

Go
{{ $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,通过返回第一个非空参数或最后一个参数。
printfmt.Sprint 的别名
printffmt.Sprintf 的别名
printlnfmt.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 中的变量必须在模板内创建。例如,您可以像这样创建一个包含当前点号 (.) 值的变量,并将字符串或其他对象赋值给它

Go
{{ $variable := . }}
{{ $variable := "This is a test" }}
{{ $variable }}

此模板输出

This is a test

模板

您可以创建可重用的模板,这些模板可以从其他模板或同一模板中执行。

使用 define 和双引号中的模板名称定义模板

Go
{{ define "print_labels" }}
{{ end }}

您不应定义与现有模板同名的模板,包括 __subject, __text_values_list, __text_alert_list, default.titledefault.message 等默认模板。如果创建的模板与默认模板或另一通知模板中的模板同名,Grafana 可能会使用其中任意一个。当存在两个或多个同名模板时,Grafana 不会阻止创建或显示错误消息。

执行模板

您可以使用 template、双引号中的模板名称以及应传递给模板的光标来执行已定义的模板

Go
{{ template "print_labels" . }}

在模板内部,点号指向传递给模板的值。

例如,如果一个模板被传递了一个触发警报列表,那么点号就指向该触发警报列表

Go
{{ template "print_alerts" .Alerts }}

如果模板被传递了警报的排序标签,那么点号就指向该排序标签列表

Go
{{ template "print_labels" .SortedLabels }}

这在编写可重用模板时非常有用。例如,要打印所有警报,您可以编写以下内容

Go
{{ template "print_alerts" .Alerts }}

然后,要只打印触发警报,您可以这样写

Go
{{ template "print_alerts" .Alerts.Firing }}

这之所以有效,是因为 .Alerts.Alerts.Firing 都是警报列表。

Go
{{ define "print_alerts" }}
{{ range . }}
{{ template "print_labels" .SortedLabels }}
{{ end }}
{{ end }}

注意

与通知模板不同,您不能为标签和标注创建独立的、可重用的模板。在报警规则模板中,您需要在标签或标注字段内内联编写每个模板。

注释

您可以使用 {{/**/}} 添加注释

Go
{{/* This is a comment */}}

为避免添加换行符,请使用

Go
{{- /* This is a comment with no leading or trailing line breaks */ -}}

缩进

您可以使用缩进(制表符和空格)和换行符,使模板更易读

Go
{{ range .Alerts }}
  {{ range .Labels.SortedPairs }}
    {{ .Name }} = {{ .Value }}
  {{ end }}
{{ end }}

然而,模板中的缩进也会体现在文本中。

移除空格和换行符

在 text/template 中,使用 {{--}} 来移除开头和结尾的空格及换行符。

例如,当使用缩进和换行符使模板更易读时

Go
{{ range .Alerts }}
  {{ range .Labels.SortedPairs }}
    {{ .Name }} = {{ .Value }}
  {{ end }}
{{ end }}

缩进和换行符也会体现在文本中

    alertname = "Test"

    grafana_folder = "Test alerts"

您可以通过将每个 range 开头的 }} 更改为 -}} 来从文本中移除缩进和换行符

Go
{{ range .Alerts -}}
  {{ range .Labels.SortedPairs -}}
    {{ .Name }} = {{ .Value }}
  {{ end }}
{{ end }}

模板中的缩进和换行符现在不再体现在文本中

alertname = "Test"
grafana_folder = "Test alerts"