报警模板语言
通知模板和警报规则模板(如注释和标签)都使用 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"


