本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
模板化标签和注释
本文档主题专为支持 Grafana 版本 10.x 的 Grafana 工作空间而设计。
有关支持 Grafana 9.x 版本的 Grafana 工作空间,请参阅。在 Grafana 版本 9 中工作
有关支持 Grafana 8.x 版本的 Grafana 工作空间,请参阅。在 Grafana 版本 8 中工作
您可以使用模板将来自查询和表达式的数据包含在标签和注释中。例如,您可能想根据查询的值为警报设置严重性标签,或者在摘要注释中使用查询中的实例标签,以便知道哪台服务器的 CPU 使用率较高。
所有模板都应使用文本/
每当评估警报规则时,都会对每个模板进行评估,并针对每个警报分别进行评估。例如,如果您的警报规则具有模板化的摘要注释,而警报规则有 10 个触发警报,则模板将执行 10 次,每个警报执行一次。你应该尽量避免在模板中进行昂贵的计算。
示例
以下示例没有编写完整的文本/模板教程,而是试图展示我们在模板中看到的最常见的用例。您可以逐字使用这些示例,也可以根据您的用例根据需要对其进行调整。有关如何编写文本/模板的更多信息,请参阅文本/模板文档。
打印所有标签,用逗号分隔
要打印所有标签(以逗号分隔),请打印$labels
变量:
{{ $labels }}
例如,给定一个带有标签的警报alertname=High CPU
usage
,grafana_folder=CPU alerts
和instance=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
usage
,grafana_folder=CPU alerts
和instance=server1
,这将打印:
alertname=High CPU usage grafana_folder=CPU alerts instance=server1
注意
如果您使用的是经典条件,则$labels
不会包含查询中的任何标签。有关更多信息,请参阅 $labels 变量。
打印单个标签
要打印单个标签,请使用带有$labels
变量的index
函数:
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表达式将其从时间序列简化为即时向量。然后,您可以改用其引用 ID 打印缩减表达式的结果。例如,如果 reduce 表达式取了 A 的平均值并具有 Ref ID B,则可以这样写:
{{ index $values "B" }}
打印查询的人性化值
要打印即时查询的人性化值,请使用以下humanize
函数:
{{ humanize (index $values "A").Value }}
例如,给定一个返回值 81.2345 的即时查询,这将打印:
81.234
要打印范围查询的人性化值,必须先将其从时间序列简化为带有 reduce 表达式的即时向量。然后,您可以改用其引用 ID 打印缩减表达式的结果。例如,如果 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.0
50.0
0.0
,因此在进行比较时,请务必使用小数(、、等)。您可以在此
{{ 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
将包含B0
B1
、B2
和B3
。如果经典条件 B 只有一个条件,$values
则只包含B0
和B1
。
要打印所有触发时间序列的所有标签,请使用以下模板(如果不同,请务必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
Variables
模板化标签和注释时,可以使用以下变量:
标签变量
该$labels
变量包含查询中的所有标签。例如,假设您有一个查询返回所有服务器的 CPU 使用率,并且您有一个警报规则,当您的任何服务器在过去 5 分钟内超过 80% 的 CPU 使用率时,就会触发该规则。您想在警报中添加摘要注释,告诉您哪台服务器的 CPU 使用率较高。使用该$labels
变量,您可以编写一个打印人类可读句子的模板,例如:
CPU usage for {{ index $labels "instance" }} has exceeded 80% for the last 5 minutes
注意
如果您使用的是经典条件,则$labels
不会包含查询中的任何标签。经典条件会丢弃这些标签以强制执行单维行为(每条警报规则最多只能有一个警报)。如果您想在模板中使用查询中的标签,请按照之前的 “打印经典条件中的所有标签” 示例进行操作。
值变量
该$value
变量是一个字符串,包含所有即时查询的标签和值;阈值、缩小和数学表达式以及警报规则中的经典条件。它不包含范围查询的结果,因为范围查询可以返回 10 到 10,000 行或指标。如果是这样,对于特别大的查询,单个警报可能会占用 10 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
变量是一个包含所有即时查询和表达式的标签和浮点值的表,并按其引用 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 的简化表达式并替换(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
函数返回 Grafana 服务器的外部网址。
{{ externalURL }}
https://example.com/grafana
GraphL
该graphLink
函数返回给定表达式和数据源的图形视图路径。在 Grafana 版本 10 中探索
{{ graphLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }}
/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":false,"range":true}]
人性化
该humanize
函数使十进制数字变得人性化。
{{ humanize 1000.0 }}
1k
人性化1024
其humanize1024
工作原理类似于humanize
但使用 1024 而不是 1000 作为基础。
{{ humanize1024 1024.0 }}
1ki
人性化持续时间
该humanizeDuration
功能人性化了以秒为单位的持续时间。
{{ humanizeDuration 60.0 }}
1m 0s
人性化百分比
该humanizePercentage
函数将比率值与百分比进行人性化处理。
{{ humanizePercentage 0.2 }}
20%
人性化时间戳
该humanizeTimestamp
函数使Unix时间戳变得人性化。
{{ humanizeTimestamp 1577836800.0 }}
2020-01-01 00:00:00 +0000 UTC
比赛
该match
函数将文本与正则表达式模式进行匹配。
{{ match "a.*" "abc" }}
true
路径前缀
该pathPrefix
函数返回 Grafana 服务器的路径。
{{ pathPrefix }}
/grafana
TableLink
该tableLink
函数返回给定表达式和数据源的表格视图路径。在 Grafana 版本 10 中探索
{{ 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