菜单
Grafana Cloud 企业版 开源版

模板标签和注释

您可以使用模板在标签和注释中包含来自查询和表达式的 数据。例如,您可能希望根据查询的值设置警报的严重性标签,或者在摘要注释中使用查询中的实例标签,以便知道哪个服务器正在经历高 CPU 使用率。

在使用自定义标签和模板时,务必确保标签值在警报规则的连续评估之间不会发生更改,因为这最终会导致创建大量不同的警报。但是,模板为不同的警报生成不同的标签值是可以的。例如,不要将查询的值放在自定义标签中,因为这最终会导致每次值更改时都创建一组新的警报。而是使用注释。

所有模板都应使用 text/template 编写。无论您是在为标签还是注释编写模板,都应在您正在编写模板的标签或注释内内联编写每个模板。这意味着您无法在标签和注释之间共享模板,而是需要在您想要使用模板的任何位置复制模板。

每次评估警报规则时都会评估每个模板,并且会分别为每个警报评估。例如,如果您的警报规则具有模板化的摘要注释,并且警报规则有 10 个触发警报,则模板将执行 10 次,每次触发警报执行一次。您应尽量避免在模板中进行昂贵的计算。

注意

标签模板中的额外空格可能会破坏与通知策略的匹配。

示例

以下示例试图展示我们看到的模板最常见的用例。您可以逐字使用这些示例,或根据需要调整它们以适应您的用例。有关如何编写 text/template 的更多信息,请参阅 Grafana 中警报通知模板的初学者指南

要打印所有标签,用逗号分隔,请打印 $labels 变量

{{ $labels }}

例如,给定一个标签为 alertname=High CPU usagegrafana_folder=CPU alertsinstance=server1 的警报,这将打印

alertname=High CPU usage, grafana_folder=CPU alerts, instance=server1

如果您使用的是经典条件,则 $labels 将不包含查询中的任何标签。有关更多信息,请参阅 $labels 变量

要打印所有标签,每行一个,请使用 range 迭代每个键/值对并分别打印它们。这里 $k 指的是当前标签的名称,$v 指的是当前标签的值

{{ range $k, $v := $labels -}}
{{ $k }}={{ $v }}
{{ end }}

例如,给定一个标签为 alertname=High CPU usagegrafana_folder=CPU alertsinstance=server1 的警报,这将打印

alertname=High CPU usage
grafana_folder=CPU alerts
instance=server1

如果您使用的是经典条件,则 $labels 将不包含查询中的任何标签。有关更多信息,请参阅 $labels 变量

要打印单个标签,请使用 index 函数和 $labels 变量

The host {{ index $labels "instance" }} has exceeded 80% CPU usage for the last 5 minutes

例如,给定一个标签为 instance=server1 的警报,这将打印

The host server1 has exceeded 80% CPU usage for the last 5 minutes

如果您使用的是经典条件,则 $labels 将不包含查询中的任何标签。有关更多信息,请参阅 $labels 变量

要打印即时查询的值,您可以使用 index 函数和 $values 变量打印其 Ref ID

{{ index $values "A" }}

例如,给定一个返回 81.2345 值的即时查询,这将打印

81.2345

要打印范围查询的值,必须首先使用 reduce 表达式将其从时间序列减少到即时向量。然后,您可以通过使用其 Ref ID 而不是 reduce 表达式结果来打印。例如,如果 reduce 表达式取 A 的平均值并具有 Ref ID B,则您将编写

{{ index $values "B" }}

要打印即时查询的人性化值,请使用 humanize 函数

{{ humanize (index $values "A").Value }}

例如,给定一个返回 81.2345 值的即时查询,这将打印

81.234

要打印范围查询的人性化值,必须首先使用 reduce 表达式将其从时间序列减少到即时向量。然后,您可以通过使用其 Ref ID 而不是 reduce 表达式结果来打印。例如,如果 reduce 表达式取 A 的平均值并具有 Ref ID B,则您将编写

{{ humanize (index $values "B").Value }}

要将即时查询的值打印为百分比,请使用 humanizePercentage 函数

{{ humanizePercentage (index $values "A").Value }}

此函数期望值为 0 到 1 之间的十进制数。如果值改为 0 到 100 之间的十进制数,则可以在查询中将其除以 100 或使用数学表达式。如果查询是范围查询,则必须首先使用 reduce 表达式将其从时间序列减少到即时向量。

根据查询的值设置严重性

要根据查询的值设置严重性标签,请使用 if 语句和大于比较函数。在对 $values 进行比较时,请确保使用小数 (80.050.00.0 等),因为 text/template 不支持类型强制。您可以在 此处 找到所有受支持的比较函数列表。

{{ if (gt $values.A.Value 80.0) -}}
high
{{ else if (gt $values.A.Value 50.0) -}}
medium
{{ else -}}
low
{{- end }}

如果您正在使用经典条件,则无法使用$labels从查询中打印标签,而必须使用$values。原因是经典条件会丢弃这些标签以强制执行一维行为(每个警报规则最多一个警报)。如果经典条件不丢弃这些标签,则返回许多时间序列的查询会导致警报在触发和解决之间不断波动,因为标签会在每次评估警报规则时都会发生变化。

相反,$values变量包含所有触发条件的所有时间序列的缩减值。例如,如果您有一个警报规则,其中查询A返回两个时间序列,并且经典条件B有两个条件,则$values将包含B0B1B2B3。如果经典条件B只有一个条件,则$values将仅包含B0B1

要打印所有触发时间序列的所有标签,请使用以下模板(请确保将正则表达式中的B替换为经典条件的Ref ID,如果不同的话)

{{ range $k, $v := $values -}}
{{ if (match "B[0-9]+" $k) -}}
{{ $k }}: {{ $v.Labels }}{{ end }}
{{ end }}

例如,两个时间序列超过单个条件的经典条件将打印

B0: instance=server1
B1: instance=server2

如果经典条件有两个或多个条件,并且时间序列同时超过多个条件,则其标签将针对超过的每个条件重复。

B0: instance=server1
B1: instance=server2
B2: instance=server1
B3: instance=server2

如果您需要打印唯一标签,则应考虑将警报规则从一维更改为多维。您可以通过用reduce和数学表达式替换经典条件来做到这一点。

要打印经典条件中的所有值,请采用前面的示例并将$v.Labels替换为$v.Value

{{ range $k, $v := $values -}}
{{ if (match "B[0-9]+" $k) -}}
{{ $k }}: {{ $v.Value }}{{ end }}
{{ end }}

例如,两个时间序列超过单个条件的经典条件将打印

B0: 81.2345
B1: 84.5678

如果经典条件有两个或多个条件,并且时间序列同时超过多个条件,则$values将包含所有条件的值。

B0: 81.2345
B1: 92.3456
B2: 84.5678
B3: 95.6789

变量

在对标签和注释进行模板化时,您可以使用以下变量

标签变量

$labels变量包含查询中的所有标签。例如,假设您有一个查询,该查询返回所有服务器的CPU使用率,并且您有一个警报规则,当任何服务器在过去5分钟内超过80%的CPU使用率时触发。您希望向警报添加一个摘要注释,告诉您哪台服务器正在经历高CPU使用率。使用$labels变量,您可以编写一个模板,打印一个类似于以下内容的人类可读句子:

CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes

如果您正在使用经典条件,则$labels将不包含查询中的任何标签。经典条件会丢弃这些标签以强制执行一维行为(每个警报规则最多一个警报)。如果您想在模板中使用查询中的标签,请使用此处的示例。

值变量

$value变量是一个字符串,包含警报规则中所有即时查询、阈值、reduce和数学表达式以及经典条件的标签和值。它不包含范围查询的结果,因为这些查询可以返回从10到10,000行或指标。如果它包含,对于特别大的查询,单个警报可能会使用数十MB的内存,并且Grafana会很快耗尽内存。

要在摘要中打印$value变量,您可以编写如下内容:

CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes: {{ $value }}

并且看起来像这样:

CPU usage for instance1 has exceeded 80% for the last 5 minutes: [ var='A' labels={instance=instance1} value=81.234 ]

此处var='A'指的是Ref ID为A的即时查询,labels={instance=instance1}指的是标签,value=81.234指的是过去5分钟内的平均CPU使用率。

如果您想打印部分字符串而不是完整字符串,请使用$values变量。它包含与$value相同的信息,但以结构化表格的形式呈现,并且比编写正则表达式来匹配您想要的文本更容易使用。

值变量

$values变量是一个表,包含所有即时查询和表达式的标签和浮点值,并按其Ref ID索引。

要打印Ref ID为A的即时查询的值

CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes: {{ index $values "A" }}

例如,给定一个带有标签instance=server1和值81.2345的即时查询的警报,这将打印:

CPU usage for instance1 has exceeded 80% for the last 5 minutes: 81.2345

如果Ref ID A中的查询是范围查询而不是即时查询,则添加一个Ref ID为B的reduce表达式,并将(index $values "A")替换为(index $values "B")

CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes: {{ index $values "B" }}

函数

在对标签和注释进行模板化时,您可以使用以下函数

args

args函数将对象列表转换为一个带有键arg0、arg1等的映射。这旨在允许将多个参数传递给模板。

{{define "x"}}{{.arg0}} {{.arg1}}{{end}}{{template "x" (args 1 "2")}}
1 2

externalURL

externalURL函数返回在ini文件(s)中配置的Grafana服务器的外部URL。

{{ externalURL }}
https://example.com/grafana

graphLink函数返回给定表达式和数据源在Explore中图形视图的路径。

{{ graphLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }}
/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":false,"range":true}]

humanize

humanize函数将十进制数字人性化。

{{ humanize 1000.0 }}
1k

humanize1024

humanize1024的工作方式类似于humanize,但使用1024作为基数而不是1000。

{{ humanize1024 1024.0 }}
1ki

humanizeDuration

humanizeDuration函数将以秒为单位的持续时间人性化。

{{ humanizeDuration 60.0 }}
1m 0s

humanizePercentage

humanizePercentage函数将比率值人性化为百分比。

{{ humanizePercentage 0.2 }}
20%

humanizeTimestamp

humanizeTimestamp函数将Unix时间戳人性化。

{{ humanizeTimestamp 1577836800.0 }}
2020-01-01 00:00:00 +0000 UTC

match

match函数将文本与正则表达式模式匹配。

{{ match "a.*" "abc" }}
true

pathPrefix

pathPrefix函数返回在ini文件(s)中配置的Grafana服务器的路径。

{{ pathPrefix }}
/grafana

tableLink函数返回给定表达式和数据源在Explore中表格视图的路径。

{{ tableLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }}
/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":true,"range":false}]

title

title函数将每个单词的首字母大写。

{{ title "hello, world!" }}
Hello, World!

toLower

toLower函数返回所有小写文本。

{{ toLower "Hello, world!" }}
hello, world!

toUpper

toUpper函数返回所有大写文本。

{{ toUpper "Hello, world!" }}
HELLO, WORLD!

reReplaceAll

reReplaceAll函数替换与正则表达式匹配的文本。

{{ reReplaceAll "localhost:(.*)" "example.com:$1" "localhost:8080" }}
example.com:8080