注释和标签模板参考
警报规则中的注释和标签可以使用纯文本定义。但是,您也可以定义模板,使用警报规则查询中的动态数据自定义其值。
例如,您可以模板化 summary
注释以包含来自查询值的信息,为响应人员提供相关的告警上下文。有关各种用例,请参阅模板注释和标签。
在模板中,变量代表查询中的动态值,而函数则执行操作来转换或格式化这些数据。
变量
变量代表警报规则查询中的动态值,可以在模板中显示或访问。
符号 $
和 .
用于引用变量及其属性。您可以使用 $
符号后跟变量名直接在警报规则定义中引用变量。类似地,您可以使用点 (.
) 表示法在警报规则模板中访问变量的属性。
{{ $values.A.Value }}
模板基于 Go 模板系统。有关附加信息,请参阅模板语言。
模板化注释和标签时,可以使用以下变量
变量 | 描述 |
---|---|
$labels | 包含来自查询的所有标签,仅限于查询标签。 |
$values | 包含所有即时查询和表达式的标签和浮点值,按其引用 ID 索引。 |
$value | 一个字符串,包含警报规则中所有即时查询的标签和值;阈值、聚合、数学表达式和经典条件。当使用单个数据源时,它返回查询的值。通常建议使用$values。 |
$labels
$labels
变量包含来自查询的所有标签。它不包含用户配置和保留的标签,仅包含查询标签。

例如,假设您的查询返回所有服务器的 CPU 使用率,并且您有一个警报规则,当任何服务器在过去 5 分钟内 CPU 使用率超过 80% 时触发。您希望在警报中添加一个摘要注释,告诉您哪台服务器的 CPU 使用率很高。使用 $labels
变量,您可以编写一个模板,打印出人类可读的句子,例如
CPU usage for {{ $labels.instance }} has exceeded 80% for the last 5 minutes
此模板的结果将是
CPU usage for server1 has exceeded 80% for the last 5 minutes
如果您使用的是经典条件,则
$labels
将不包含查询中的任何标签。经典条件会丢弃这些标签,以强制执行一维行为(每个警报规则最多只有一个警报)。如果您想在模板中使用来自查询的标签,请参阅此处的示例。
$values
$values
变量是一个表,包含所有即时查询和表达式的标签和浮点值,按其引用 ID 索引(例如,A
、B
、C
等)。它不包含范围查询的结果,因为它们可以返回数百或数千行。
每个引用 ID,例如 $values.A
,都有以下属性
属性 | 类型 | 描述 |
---|---|---|
值 | 浮点数 | 即时查询或表达式返回的值。 |
标签 | 键/值对 | 与实例查询或表达式关联的标签。 |
这是之前的示例,现在打印即时查询的值,其引用 ID 为 A
{{ $values.A.Value }} CPU usage for {{ $labels.instance }} over the last 5 minutes.
如果警报带有标签 instance=server1
且查询返回 81.2345
,则模板将打印
81.2345 CPU usage for instance1 over the last 5 minutes.
如果引用 ID A
中的查询是范围查询而不是即时查询,则添加一个引用 ID 为 B
的聚合表达式,并将 $values.A.Value
替换为 $values.B.Value
{{ $values.B.Value }} CPU usage for {{ $labels.instance }} over the last 5 minutes.
或者,您可以使用 index()
函数检索查询值
{{ index $values "B" }} CPU usage for {{ index $labels "instance" }} over the last 5 minutes.
$value
$value
变量是一个字符串,包含警报规则中所有即时查询的标签和值;阈值、聚合、数学表达式和经典条件。
当警报规则中使用单个数据源时,$value
将直接返回查询值。
此示例打印 $value
变量
{{ $value }}: CPU usage has exceeded 80% for the last 5 minutes.
当使用多个数据源时,它将显示类似这样的内容
[ var='A' labels={instance=instance1} value=81.234, , [ var='B' labels={instance=instance2} value=1 ] ]: CPU usage has exceeded 80% for the last 5 minutes.
但是使用单个数据源时,它只会显示查询的值
81.234: CPU usage has exceeded 80% for the last 5 minutes.
相反,我们建议使用$values,它包含与 $value
相同的信息,但结构化为更易于使用的表格格式。
函数
函数可以在模板中执行操作,例如转换或格式化数据。
请注意,Go 模板语言提供的函数,例如 index
、and
、printf
和 len
,以及许多其他函数,都可用。
此外,以下函数也适用于模板化注释和标签
数字
名称 | 参数 | 返回 | 描述 |
---|---|---|---|
humanize | 数字或字符串 | 字符串 | 将十进制数字人类化。 |
humanize1024 | 数字或字符串 | 字符串 | 与 humanize 类似,但使用 1024 作为基数而不是 1000。 |
humanizeDuration | 数字或字符串 | 字符串 | 将以秒为单位的持续时间人类化。 |
humanizePercentage | 数字或字符串 | 字符串 | 将比率值人类化为百分比。 |
humanizeTimestamp | 数字或字符串 | 字符串 | 将 Unix 时间戳人类化。 |
toTime | 数字或字符串 | 时间 | 将以秒为单位的 Unix 时间戳转换为时间。 |
字符串
名称 | 参数 | 返回 | 描述 |
---|---|---|---|
title | 字符串 | 字符串 | 将每个单词的首字母大写。 |
toUpper | 字符串 | 字符串 | 将所有文本转换为大写。 |
toLower | 字符串 | 字符串 | 将所有文本转换为小写。 |
stripPort | 字符串 | 字符串 | 仅返回主机名。 |
match | 模式,文本 | 布尔值 | 将文本与正则表达式模式匹配。 |
reReplaceAll | 模式,替换字符串,文本 | 字符串 | 替换与正则表达式匹配的文本。 |
graphLink | 表达式 | 字符串 | 返回给定表达式和数据源在 Explore 中的图形视图路径。 |
tableLink | 表达式 | 字符串 | 返回给定表达式和数据源在 Explore 中的表格视图路径。 |
parseDuration | 字符串 | 浮点数 | 解析持续时间字符串(如“1h”)为它所代表的秒数。 |
stripDomain | 字符串 | 字符串 | 返回移除 FQDN 域名部分的结果。 |
其他
名称 | 参数 | 返回 | 描述 |
---|---|---|---|
args | []interface{} | map[string]interface{} | 将对象列表转换为带有键 arg0, arg1 等的 map。 |
safeHtml | 字符串 | 字符串 | 将字符串标记为不需要自动转义的 HTML。 |
externalURL | 无 | 字符串 | 返回在 ini 文件中配置的 Grafana 服务器的外部 URL。 |
pathPrefix | 无 | 字符串 | 返回在 ini 文件中配置的 Grafana 服务器的路径。 |
关于这些函数的进一步上下文,请注意 Grafana 中的模板基于 Prometheus 模板实现,从而能够在 Grafana 中使用这些函数和类似于 Prometheus 的模板来格式化告警消息。
humanize
humanize
函数将十进制数字人类化
{{ humanize 1000.0 }}
1k
humanize1024
humanize1024
的工作原理类似于 humanize
,但使用 1024 作为基数而不是 1000
{{ humanize1024 1024.0 }}
1ki
humanizeDuration
humanizeDuration
函数将以秒为单位的持续时间人类化
{{ humanizeDuration 60.0 }}
1m 0s
humanizePercentage
humanizePercentage
函数将 0 到 1 之间的比率值人类化为百分比
{{ humanizePercentage 0.2 }}
20%
humanizeTimestamp
humanizeTimestamp
函数将 Unix 时间戳人类化
{{ humanizeTimestamp 1577836800.0 }}
2020-01-01 00:00:00 +0000 UTC
toTime
toTime
函数将以秒为单位的 Unix 时间戳转换为时间。
{{ toTime 1727802106 }}
2024-10-01 17:01:46 +0000 UTC
title
title
函数将每个单词的首字母大写
{{ title "hello, world!" }}
Hello, World!
toUpper
toUpper
函数将所有文本转换为大写
{{ toUpper "Hello, world!" }}
HELLO, WORLD!
toLower
toLower
函数将所有文本转换为小写
{{ toLower "Hello, world!" }}
hello, world!
stripPort
stripPort
将字符串分割为主机名和端口,然后仅返回主机名
{{ stripPort "example.com:8080" }}
example.com
match
match
函数将文本与正则表达式模式匹配
{{ match "a.*" "abc" }}
true
reReplaceAll
reReplaceAll
函数替换与正则表达式匹配的文本
{{ reReplaceAll "localhost:(.*)" "example.com:$1" "localhost:8080" }}
example.com:8080
graphLink
graphLink
函数返回给定表达式和数据源在 Explore 中的图形视图路径
{{ graphLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }}
/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":false,"range":true}]
parseDuration
parseDuration
函数解析持续时间字符串(如“1h”)为它所代表的秒数。
{{ parseDuration "1h" }}
3600
stripDomain
stripDomain
移除 FQDN 的域名部分,保留端口不变
{{ stripDomain "example.com:8080" }}
example:8080
tableLink
tableLink
函数返回给定表达式和数据源在 Explore 中的表格视图路径
{{ tableLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }}
/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":true,"range":false}]
args
args
函数将对象列表转换为带有键 arg0, arg1 等的 map。这旨在允许将多个参数传递给模板
{{define "x"}}{{.arg0}} {{.arg1}}{{end}}{{template "x" (args 1 "2")}}
1 2
safeHtml
safeHtml
函数将字符串标记为不需要自动转义的 HTML
{{ safeHtml "<b>Text</b>"}}
<b>Text</b>
externalURL
externalURL
函数返回在 ini 文件中配置的 Grafana 服务器的外部 URL
{{ externalURL }}
https://example.com/grafana
pathPrefix
pathPrefix
函数返回在 ini 文件中配置的 Grafana 服务器的路径
{{ pathPrefix }}
/grafana
与通知模板的差异
通知模板和警报规则模板都使用 Go 模板系统。然而,通知模板中可用的函数和变量与注释和标签模板中使用的不同,后者在本文档中描述。
注释和标签模板在单个警报实例的上下文中操作,而通知模板应用于包含一组警报的通知。
例如,通知模板提供 .Alerts
变量,其中包含通知中所有触发和已解决的警报列表。此变量在警报规则模板中不可用,警报规则模板在单个警报实例的上下文中操作。
此外,您不能像通知模板那样重用标签和注释的模板。相反,您需要在标签或注释字段中内联编写每个模板,并手动复制到您想要重用模板的任何位置。