标签和注解模板示例
通过模板化,您可以将查询中的动态数据添加到告警标签和注解中。动态数据增强了告警上下文,使响应人员能够更轻松地快速评估和解决问题。
本页提供了标签和注解模板化的常见示例。有关模板化的更多信息,请参阅
注解示例
注解向告警实例添加额外详细信息,常用于提供有助于识别问题和指导响应的有用信息。
注解的一个常见用例是显示触发告警的特定查询值或阈值。
例如,您可以显示来自 $values
变量的查询值,以告知触发告警的 CPU 值。
CPU usage has exceeded 80% ({{ $values.A.value }}) for the last 5 minutes.
或者,您可以使用 index()
函数如下获取查询值。
CPU usage has exceeded 80% ({{ index $values "A" }}) for the last 5 minutes.
CPU usage has exceeded 80% (81.2345) for the last 5 minutes.
包含标签以获取额外详细信息
为了提供额外的上下文,您可以使用 $labels
变量包含查询中的标签。
例如,前面的示例也可以包含受影响的 instance
。
CPU usage for {{ $labels.instance }} has exceeded 80% ({{ $values.A.Value }}) for the last 5 minutes.
CPU usage for Instance 1 has exceeded 80% (81.2345) for the last 5 minutes.
您可以将查询返回的任何标签合并到模板中。例如,以下模板包含有关告警发生的环境和区域的信息。
Alert triggered in {{ $labels.environment }} on {{ $labels.region }} region.
Alert triggered in production on AMER region.
打印范围查询
要打印即时查询的值,您可以使用 index
函数或 $values
变量打印其 Ref ID
{{ $values.A.Value }}
对于范围查询,使用 reduce 表达式将其从时序数据缩减为即时向量。然后,您可以通过引用其 Ref ID 来打印结果。例如,如果 reduce 表达式对 Ref ID 为 B
的 A
进行平均,则您将打印 $values.B
{{ $values.B.Value }}
人性化显示查询值
要人性化显示即时查询的值,请使用 humanize
函数
{{ humanize $values.A.Value }}
或者
{{ humanize (index $values "A").Value }}
554.9
要将即时查询的值打印为百分比,请使用 humanizePercentage
函数
{{ humanizePercentage $values.A.Value }}
10%
有关显示或格式化数据的更多函数,请参阅
标签示例
标签决定了告警如何路由和管理,确保通知在正确的时间发送给正确的团队。如果您的查询返回的标签未能完全捕获所需的上下文,您可以创建一个新标签并根据查询数据设置其值。
基于查询值
以下是根据查询值创建 severity
标签的示例
{{- if (gt $values.A.Value 90.0) -}}critical
{{- else if (gt $values.A.Value 80.0) -}}high
{{- else if (gt $values.A.Value 60.0) -}}medium
{{- else -}}low
{{- end -}}
在此示例中,severity
标签由查询值决定
- 值高于 90 时为
critical
, - 值高于 80 时为
high
, - 值高于 60 时为
medium
, - 以及值低于 60 时为
low
。
然后,您可以使用 severity
标签控制告警的处理方式。例如,您可以立即发送 critical
告警,同时将 low
级别告警路由给团队进行进一步调查。
注意
告警实例通过其标签集唯一标识。
- 避免在标签中显示查询值,因为这会创建大量告警实例——每个不同的标签集对应一个。请改为在注解中使用查询值。
- 如果模板化标签的值发生变化,它会映射到不同的告警实例,并且当前标签值不再存在时,先前的实例会转换到
No data
状态。
基于查询标签
您可以使用标签来区分来自不同环境(例如生产、预发布、开发)的告警。例如,您可能想添加一个标签,根据实例的标签设置环境。以下是模板化方法
{{- if eq $labels.instance "prod-server-1" -}}
production
{{- else if eq $labels.instance "staging-server-1" -}}
staging
{{- else -}}
development
{{- end -}}
这将打印
- 例如,对于实例
prod-server-1
,标签将是production
。 - 对于
staging-server-1
,标签将是staging
。 - 所有其他实例将标记为
development
。
为了使此模板更灵活,您可以使用正则表达式通过 match()
函数将实例名称与实例名称前缀匹配
{{- if match "^prod-server-.*" $labels.instance -}}
production
{{- else if match "^staging-server-.*" $labels.instance -}}
staging
{{- else -}}
development
{{- end -}}
传统告警模板
对于使用 Grafana 传统告警系统的用户,仍然可以利用模板从告警条件中提取有用信息。但是,请务必注意,如果您使用的是经典条件,则不能使用 $labels
打印查询中的标签,而必须使用 $values
。原因是经典条件会丢弃这些标签以强制执行单维度行为(每个告警规则最多一个告警)。如果经典条件不丢弃这些标签,那么返回许多时序数据的查询将导致告警在触发和解决状态之间不断切换,因为标签在每次评估告警规则时都会发生变化。
相反,$values
变量包含所有正在触发的条件对应的所有时序数据的缩减值。例如,如果您有一个告警规则,其中查询 A 返回两个时序数据,并且经典条件 B 有两个条件,那么 $values
将包含 B0
、B1
、B2
和 B3
。如果经典条件 B 只有一个条件,那么 $values
将只包含 B0
和 B1
。
打印经典条件的所有标签
要打印所有触发时序数据的所有标签,请使用以下模板(如果经典条件的 Ref ID 不同,请确保在正则表达式中将 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 和 math 表达式来实现。
打印经典条件的所有值
要打印经典条件的所有值,请参考前面的示例,并将 $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