模板化标签和注释 - Amazon Managed Grafana

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

模板化标签和注释

本文档主题专为支持 Grafana 版本 10.x 的 Grafana 工作空间而设计。

有关支持 Grafana 9.x 版本的 Grafana 工作空间,请参阅。在 Grafana 版本 9 中工作

有关支持 Grafana 8.x 版本的 Grafana 工作空间,请参阅。在 Grafana 版本 8 中工作

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

所有模板都应使用文本/ 模板编写。无论您是模板化标签还是注释,都应将每个模板内联写在要模板化的标签或注释中。这意味着您无法在标签和批注之间共享模板,而是需要将模板复制到任何要使用的地方。

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

示例

以下示例没有编写完整的文本/模板教程,而是试图展示我们在模板中看到的最常见的用例。您可以逐字使用这些示例,也可以根据您的用例根据需要对其进行调整。有关如何编写文本/模板的更多信息,请参阅文本/模板文档。

打印所有标签,用逗号分隔

要打印所有标签(以逗号分隔),请打印$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 变量

打印单个标签

要打印单个标签,请使用带有$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.00.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将包含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

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