菜单
Grafana Cloud 企业版 开源

报警模板语言

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

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

但是,请务必注意,由于通知和警报规则在不同的上下文下运行,因此某些附加变量和函数仅可用于通知模板或警报规则模板。请参阅

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

打印

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

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

text/template 中,有一个特殊的游标称为 dot,写为 .。您可以将此游标视为一个变量,其值取决于其在模板中的使用位置。

在通知模板的开头,dot (.) 指代 通知数据

Go
{{ .Alerts }}

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

注意

rangewith 中使用,或者在其他模板中编写 模板 时,dot (.) 可能会指代其他内容。

If

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

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

With

with 类似于 if 语句,但与 if 不同的是,它会更新 dot(.) 以指代 with 中表达式的值。

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

Range

range 迭代数组或映射,dot (.) 设置为数组的当前元素

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 中的变量必须在模板内部创建。例如,您可以使用 dot (.) 的当前值创建一个变量,并将字符串或其他对象赋值给该变量,如下所示:

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

此模板输出

This is a test

模板

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

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

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

您不应定义与 default 模板(如 __subject__text_values_list__text_alert_listdefault.titledefault.message)或其他通知模板中的模板同名的模板。如果模板与 default 模板或另一个通知模板中的模板同名,Grafana 可能会使用其中任意一个。当存在两个或多个同名模板时,Grafana 不会阻止或显示错误消息。

执行模板

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

Go
{{ template "print_labels" . }}

在模板内部,dot 指代传递给模板的值。

例如,如果模板传入触发警报列表,则 dot 指代该触发警报列表。

Go
{{ template "print_alerts" .Alerts }}

如果模板传入警报的排序标签,则 dot 指代排序标签列表。

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"