注释和标签模板参考
警报规则中的注释和标签可以使用纯文本定义。但是,您也可以定义模板,使用警报规则查询中的动态数据自定义其值。
例如,您可以模板化 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 }}1khumanize1024
humanize1024 的工作原理类似于 humanize,但使用 1024 作为基数而不是 1000
{{ humanize1024 1024.0 }}1kihumanizeDuration
humanizeDuration 函数将以秒为单位的持续时间人类化
{{ humanizeDuration 60.0 }}1m 0shumanizePercentage
humanizePercentage 函数将 0 到 1 之间的比率值人类化为百分比
{{ humanizePercentage 0.2 }}20%humanizeTimestamp
humanizeTimestamp 函数将 Unix 时间戳人类化
{{ humanizeTimestamp 1577836800.0 }}2020-01-01 00:00:00 +0000 UTCtoTime
toTime 函数将以秒为单位的 Unix 时间戳转换为时间。
{{ toTime 1727802106 }}2024-10-01 17:01:46 +0000 UTCtitle
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.commatch
match 函数将文本与正则表达式模式匹配
{{ match "a.*" "abc" }}truereReplaceAll
reReplaceAll 函数替换与正则表达式匹配的文本
{{ reReplaceAll "localhost:(.*)" "example.com:$1" "localhost:8080" }}example.com:8080graphLink
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" }}3600stripDomain
stripDomain 移除 FQDN 的域名部分,保留端口不变
{{ stripDomain "example.com:8080" }}example:8080tableLink
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 2safeHtml
safeHtml 函数将字符串标记为不需要自动转义的 HTML
{{ safeHtml "<b>Text</b>"}}<b>Text</b>externalURL
externalURL 函数返回在 ini 文件中配置的 Grafana 服务器的外部 URL
{{ externalURL }}https://example.com/grafanapathPrefix
pathPrefix 函数返回在 ini 文件中配置的 Grafana 服务器的路径
{{ pathPrefix }}/grafana与通知模板的差异
通知模板和警报规则模板都使用 Go 模板系统。然而,通知模板中可用的函数和变量与注释和标签模板中使用的不同,后者在本文档中描述。
注释和标签模板在单个警报实例的上下文中操作,而通知模板应用于包含一组警报的通知。
例如,通知模板提供 .Alerts 变量,其中包含通知中所有触发和已解决的警报列表。此变量在警报规则模板中不可用,警报规则模板在单个警报实例的上下文中操作。
此外,您不能像通知模板那样重用标签和注释的模板。相反,您需要在标签或注释字段中内联编写每个模板,并手动复制到您想要重用模板的任何位置。



