本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
模板化标签和注释
本文档主题专为支持 Grafana 9.x 版本的 Grafana 工作空间而设计。
有关支持 Grafana 版本 10.x 的 Grafana 工作空间,请参阅。在 Grafana 版本 10 中工作
有关支持 Grafana 8.x 版本的 Grafana 工作空间,请参阅。在 Grafana 版本 8 中工作
在 Grafana 中,你可以像在 Prometheus 中一样对标签和注释进行模板化。如果您之前使用过 Prometheus,那么您应该熟悉$labels
$value
和变量,它们包含警报的标签和值。即使警报不使用 Prometheus 数据源,您也可以在 Grafana 中使用相同的变量。如果你以前没有使用过 Prometheus,那么不用担心,因为在你关注本页的其余部分时,将解释这些变量中的每个变量以及如何对其进行模板化。
Go 的模板语言
标签和注释的模板是用 Go 的模板语言 te x
打开和关闭标签
在文本/模板中,}}
无论模板是打印变量还是运行 if 语句等控制结构,模板的开头{{
和结尾都是。这与其他模板语言(例如 Jinja)不同,在Jinja中,打印变量使用{{
}}
和控制结构使用{%
和。%}
Print (打印)
要打印某物的值,请使用{{
和}}
。您可以打印函数的结果或变量的值。例如,要打印$labels
变量,你可以写下以下内容:
{{ $labels }}
遍历标签
要遍历中的每个标签,$labels
可以使用。range
这里$k
指的是名称,$v
指的是当前标签的值。例如,如果您的查询返回了一个标签,instance=test
那么$k
将是instance
,$v
将是test
。
{{ range $k, $v := $labels }} {{ $k }}={{ $v }} {{ end }}
标签、值和值变量
标签变量
该$labels
变量包含查询中的标签。例如,检查实例是否已关闭的查询可能会返回一个带有已关闭实例名称的实例标签。例如,假设您的一个实例停机时间超过 5 分钟时会触发一条警报规则。您想在警报中添加摘要,告诉您哪个实例已关闭。使用该$labels
变量,您可以创建摘要,在摘要中打印实例标签:
Instance {{ $labels.instance }} has been down for more than 5 minutes
带圆点的标签
如果您要打印的标签名称中包含一个点(句号或句点),则在模板中使用相同的点将不起作用:
Instance {{ $labels.instance.name }} has been down for more than 5 minutes
这是因为模板正在尝试使用名为的不存在字段name
。$labels.instance
你应该改用这个index
函数,它会在$labels
变量instance.name
中打印标签:
Instance {{ index $labels "instance.name" }} has been down for more than 5 minutes
值变量
该$value
变量的工作原理与 Prometheus 不同。在 P $value
rometheus 中,是一个包含表达式值的浮点数,但在 Grafana 中,它是一个字符串,包含该警报规则的所有阈值、简化和数学表达式以及经典条件的标签和值。它不包含查询的结果,因为这些结果可以返回 10 到 10,000 行或指标。
如果您要在警报摘要中使用该$value
变量:
{{ $labels.service }} has over 5% of responses with 5xx errors: {{ $value }})
摘要可能如下所示:
api has an over 5% of responses with 5xx errors: [ var='B' labels={service=api} value=6.789 ]
这里var='B'
指的是带有 RefID B 的表达式。在 Grafana 中,所有查询和表达式都由 RefID 标识,ReFID 标识警报规则中的每个查询和表达式。类似地labels={service=api}
指标签,并value=6.789
引用值。
您可能已经观察到没有 RefID A。这是因为在大多数警报规则中,RefID A 指的是查询,而且由于查询可以返回许多行或时间序列,因此它们不包括在内。$value
值变量
如果$value
变量包含的信息超出了您的需求,则可以改为使用打印各个表达式的标签和值$values
。不同的是$value
,该$values
变量是一个对象表,其中包含每个表达式的标签和浮点值,并按其 RefID 索引。
如果您要在警报摘要B
中使用 RefID 打印表达式的值,请执行以下操作:
{{ $labels.service }} has over 5% of responses with 5xx errors: {{ $values.B }}%
摘要将仅包含以下值:
api has an over 5% of responses with 5xx errors: 6.789%
但是,当{{ $values.B }}
打印数字 6.789 时,它实际上是一个字符串,因为您正在打印同时包含 RefID B 的标签和值的对象,而不是 B 的浮点值。要使用 RefID B 的浮点值,必须使用中的字段。Value
$values.B
如果您要在警报摘要中对浮点值进行人性化处理:
{{ $labels.service }} has over 5% of responses with 5xx errors: {{ humanize $values.B.Value }}%
没有数据、运行时错误和超时
如果警报规则中的查询未返回任何数据,或者由于数据源错误或超时而失败,则使用该查询的任何阈值、减少或数学表达式也将不返回任何数据或错误。当这种情况发生时,这些表达式将不存在$values
。在使用 RefID 之前,最好先检查它是否存在,否则如果您的查询没有返回任何数据或出现错误,您的模板就会中断。你可以使用 if 语句来做到这一点:
{{ if $values.B }}{{ $labels.service }} has over 5% of responses with 5xx errors: {{ humanizePercentage $values.B.Value }}{{ end }}
经典条件
如果规则使用经典条件而不是 “阈值”、“减少” 和 “数学” 表达式,则$values
变量将根据参照 ID 和条件在经典条件中的位置建立索引。例如,如果您有一个经典条件,RefID B 包含两个条件,则$values
将包含两个条件B0
和B1
。
The first condition is {{ $values.B0 }}, and the second condition is {{ $values.B1 }}
函数
展开标签和注释时,还可使用以下功能:
args
该args
函数将对象列表转换为带有键 arg0、arg1 等的地图。这旨在允许将多个参数传递给模板。
示例
{{define "x"}}{{.arg0}} {{.arg1}}{{end}}{{template "x" (args 1 "2")}}
1 2
外部网址
该externalURL
函数返回 ini 文件中配置的 Grafana 服务器的外部 URL。
示例
{{ externalURL }}
https://example.com/grafana
GraphL
该graphLink
函数返回给定表达式和数据源的图形视图路径。在 Grafana 版本 9 中探索
示例
{{ 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
函数返回 ini 文件中配置的 Grafana 服务器的路径。
示例
{{ pathPrefix }}
/grafana
TableLink
该tableLink
函数返回给定表达式和数据源的表格视图路径。在 Grafana 版本 9 中探索
示例
{{ 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