菜单
Grafana Cloud 企业版 开源版

使用 Go 的模板语言

您使用 Go 的模板语言 text/template 编写通知模板。

在开始创建自己的通知模板之前,建议您阅读本主题,该主题为您提供 Go 的模板语言和在 text/template 中编写模板的概述。

在 text/template 中,有一个特殊的游标称为点,写为 .。您可以将此游标视为一个变量,其值根据它在模板中的使用位置而变化。例如,在通知模板的开头,. 指向名为 ExtendedData 的内容,该内容包含多个字段,包括 AlertsStatusGroupLabelsCommonLabelsCommonAnnotationsExternalURL。但是,当在列表上进行范围循环时,在 with 内部使用时,或者编写要在其他模板中使用的功能模板时,点可能会指向其他内容。您可以在 创建通知模板 中看到此示例,以及 参考 中的所有数据和功能。

打开和关闭标签

在 text/template 中,模板以 {{ 开头,以 }} 结尾,无论模板是打印变量还是执行控制结构(如 if 语句)。这与其他模板语言(如 Jinja)不同,后者在打印变量时使用 {{}},而在控制结构中使用 {%%}

打印

要打印某项的值,请使用 {{}}。您可以打印点、点字段、函数结果和 变量 的值。例如,要打印 Alerts 字段(其中点指的是 ExtendedData),您可以编写以下内容

{{ .Alerts }}

遍历警报

要只打印每个警报的标签,而不是关于警报的所有信息,您可以使用 range 来遍历 ExtendedData 中的警报

{{ range .Alerts }}
{{ .Labels }}
{{ end }}

在范围内部,点不再指向 ExtendedData,而是指向 Alert。您可以使用 {{ .Labels }} 来打印每个警报的标签。这是因为 {{ range .Alerts }} 会更改点,使其指向列表中当前警报。范围结束时,点将重置为它在范围开始之前具有的值,在本例中是 ExtendedData

{{ range .Alerts }}
{{ .Labels }}
{{ end }}
{{/* does not work, .Labels does not exist here */}}
{{ .Labels }}
{{/* works, cursor was reset */}}
{{ .Status }}

遍历注释和标签

让我们编写一个模板,以 标签名称为 $name,值为 $value 的格式打印每个警报的标签,其中 $name$value 包含每个标签的名称和值。

与之前的示例一样,使用范围遍历 .Alerts 中的警报,使点指向列表中当前警报,然后对排序后的标签使用第二个范围,使点再次更新,指向当前标签。在第二个范围内部,使用 .Name.Value 来打印每个标签的名称和值

{{ range .Alerts }}
{{ range .Labels.SortedPairs }}
The name of the label is {{ .Name }}, and the value is {{ .Value }}
{{ end }}
{{ range .Annotations.SortedPairs }}
The name of the annotation is {{ .Name }}, and the value is {{ .Value }}
{{ end }}
{{ end }}

index 函数

要打印特定注释或标签,请使用 index 函数。

{{ range .Alerts }}
The name of the alert is {{ index .Labels "alertname" }}
{{ end }}

if 语句

您可以在模板中使用 if 语句。例如,要打印 没有警报(如果 .Alerts 中没有警报),您可以编写以下内容

{{ if .Alerts }}
There are alerts
{{ else }}
There are no alerts
{{ end }}

With

With 与 if 语句类似,但是与 if 语句不同,with 会更新点,使其指向 with 的值

{{ with .Alerts }}
There are {{ len . }} alert(s)
{{ else }}
There are no alerts
{{ end }}

变量

text/template 中的变量必须在模板内部创建。例如,要创建一个名为 $variable 的变量,其值为点的当前值,您可以编写以下内容

{{ $variable := . }}

您可以在范围或 with 内部使用 $variable,它将指向变量定义时的点的值,而不是点的当前值。

例如,您无法编写使用第二个范围内 {{ .Labels }} 的模板,因为这里点指向当前标签,而不是当前警报

{{ range .Alerts }}
{{ range .Labels.SortedPairs }}
{{ .Name }} = {{ .Value }}
{{/* does not work because in the second range . is a label not an alert */}}
There are {{ len .Labels }}
{{ end }}
{{ end }}

您可以通过在第一个范围中以及第二个范围之前定义一个名为 $alert 的变量来解决此问题

{{ range .Alerts }}
{{ $alert := . }}
{{ range .Labels.SortedPairs }}
{{ .Name }} = {{ .Value }}
{{/* works because $alert refers to the value of dot inside the first range */}}
There are {{ len $alert.Labels }}
{{ end }}
{{ end }}

带索引的范围

您可以在范围的开头定义索引和值变量,从而获取范围中每个警报的索引

{{ $num_alerts := len .Alerts }}
{{ range $index, $alert := .Alerts }}
This is alert {{ $index }} out of {{ $num_alerts }}
{{ end }}

定义模板

您可以使用 `define` 和模板名称(用双引号括起来)定义模板。您不应该定义与其他模板同名的模板,包括默认模板,例如 `__subject`、`__text_values_list`、`__text_alert_list`、`default.title` 和 `default.message`。如果创建的模板与默认模板或其他通知模板中的模板同名,Grafana 可能会使用其中任何一个模板。当存在两个或多个同名模板时,Grafana 不会阻止或显示错误消息。

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

执行模板

您可以使用 `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 .Alerts -}}
  {{ range .Labels.SortedPairs -}}
    {{ .Name }} = {{ .Value }}
  {{ end }}
{{ end }}

现在,模板中的缩进和换行符已从文本中消失。

alertname = "Test"
grafana_folder = "Test alerts"