

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

# 探索警报
<a name="v9-alerting-explore"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

无论您是开始使用还是扩展实施 Grafana Alerting，都可以了解关键概念和可用功能的更多信息，这些关键概念和可用功能可帮助您创建、管理和响应警报，并提高团队快速解决问题的能力。

首先，我们来看看 Grafana Alerting 提供的不同警报规则类型。

## 警报规则类型
<a name="v9-alerting-explore-rule-types"></a>

**Grafana 管理的警报**

Grafana 管理的规则是最灵活的警报规则类型。通过这些规则，您可以创建警报，而这些警报可以作用于我们支持的任何数据来源中的数据。除了支持多个数据来源，您还可以添加表达式来转换数据和设置警报条件。这是唯一允许在单个规则定义中从多个数据来源发出警报的规则类型。

**Mimir 和 Loki 规则**

要创建 Mimir 或 Loki 警报，您必须拥有兼容的 Prometheus 或 Loki 数据来源。您可以通过测试数据来源并观察是否支持 Ruler API 来检查您的数据来源是否支持通过 Grafana 创建规则。

**记录规则**

记录规则仅适用于兼容的 Prometheus 或 Loki 数据来源。记录规则让您可以预先计算经常需要或计算开销较大的表达式，将其结果另存为一组新的时间序列。如果要对聚合数据运行警报，或者如果您的控制面板重复查询计算开销较大的表达式，此功能将非常有用。

## 关键概念和功能
<a name="v9-alerting-explore-features"></a>

下表列出了关键概念、功能及其定义，旨在帮助您充分利用 Grafana Alerting。


| 关键概念或功能 | 定义 | 
| --- | --- | 
|  警报的数据来源  |  选择数据来源，从中查询指标、日志和跟踪，并以可视化方式展示。  | 
|  警报预置  |  管理您的警报资源，并使用文件预置或 Terraform 将其预置到 Grafana 系统。  | 
|  Alertmanager  |  管理警报实例的路由和分组。  | 
|  警报规则  |  用于确定警报规则何时触发的一组评估标准。警报规则包含一个或多个查询和表达式、一个条件、评估频率，以及满足条件的持续时间。一条警报规则可以生成多个警报实例。  | 
|  警报实例  |  警报实例是警报规则的实例。单维警报规则有一个警报实例。多维警报规则有一个或多个警报实例。与多个结果匹配的单个警报规则（例如 CPU 对 10 VMs）被视为多个（在本例中为 10）警报实例。这个数字可能会随时间变化。例如，监控系统 VMs 中所有人 CPU 使用率的警报规则添加的警报实例更多。 VMs 有关警报实例配额的更多信息，请参阅 [达到配额错误](v9-alerting-managerules-grafana.md#v9-alerting-rule-quota-reached)。  | 
|  警报组  |  默认情况下，Alertmanager 使用根通知策略的标签对警报实例进行分组。这可以控制发送到联系点的警报实例的去重和分组。  | 
|  联系点  |  定义触发警报规则时如何通知您的联系人。  | 
|  消息模板  |  创建可重复使用的自定义模板，并在联系点中使用。  | 
|  通知策略  |  一组规则，规定在何处、何时以及如何将警报分组并路由到联系点。  | 
|  标签和标签匹配程序  |  标签可通过唯一方式标识警报规则。它们将警报规则与通知策略及静默关联起来，确定应由哪条策略处理这些警报规则，以及哪些警报规则应该被静默。  | 
|  静默  |  停止来自一个或多个警报实例的通知。静默和静音定时的区别在于，静默会持续指定的时间，而静音定时则按计划重复。使用标签匹配程序可使警报实例静默。  | 
|  静音定时  |  指定您不希望生成或发送新通知的时间间隔。您也可以在周期性时间段（如维护时间段）冻结警报通知。必须关联到现有通知策略。  | 

# 数据来源
<a name="v9-alerting-explore-datasources"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

有许多[数据来源](AMG-data-sources-builtin.md)与 Grafana Alerting 兼容。每个数据来源都由一个插件支持。您可以使用下面列出的内置数据来源之一。

这些都是与 Amazon Managed Grafana 兼容并受其支持的数据来源。
+ [连接到 AlertManager 数据来源](data-source-alertmanager.md)
+ [Connect 连接到亚马逊 CloudWatch 数据源](using-amazon-cloudwatch-in-AMG.md)
+ [Connect 连接到亚马逊 OpenSearch 服务数据源](using-Amazon-OpenSearch-in-AMG.md)
+ [Connect 连接到 AWS IoT SiteWise 数据源](using-iotsitewise-in-AMG.md)
+ [Connect 连接到 AWS IoT TwinMaker 数据源](AMG-iot-twinmaker.md)
+ [连接到 Amazon Managed Service for Prometheus 和开源 Prometheus 数据来源](prometheus-data-source.md)
+ [连接到 Amazon Timestream 数据来源](timestream-datasource.md)
+ [连接到 Amazon Athena 数据来源](AWS-Athena.md)
+ [连接到 Amazon Redshift 数据来源](AWS-Redshift.md)
+ [Connect 连接到 AWS X-Ray 数据源](x-ray-data-source.md)
+ [连接到 Azure Monitor 数据来源](using-azure-monitor-in-AMG.md)
+ [连接到 Google Cloud Monitoring 数据来源](using-google-cloud-monitoring-in-grafana.md)
+ [连接到 Graphite 数据来源](using-graphite-in-AMG.md)
+ [连接到 InfluxDB 数据来源](using-influxdb-in-AMG.md)
+ [连接到 Loki 数据来源](using-loki-in-AMG.md)
+ [连接到 Microsoft SQL Server 数据来源](using-microsoft-sql-server-in-AMG.md)
+ [连接到 MySQL 数据来源](using-mysql-in-AMG.md)
+ [连接到 OpenTSDB 数据来源](using-opentsdb-in-AMG.md)
+ [连接到 PostgreSQL 数据来源](using-postgresql-in-AMG.md)
+ [连接到 Jaeger 数据来源](jaeger-data-source.md)
+ [连接到 Zipkin 数据来源](zipkin-data-source.md)
+ [连接到 Tempo 数据来源](tempo-data-source.md)
+ [配置用于测试 TestData 的数据源](testdata-data-source.md)

# 关于警报规则
<a name="v9-alerting-explore-rules"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

警报规则是一组评估标准，用于确定警报实例是否会触发。该规则包含一个或多个查询和表达式、一个条件、评估频率，以及满足条件的持续时间（可选）。

当查询和表达式选择要评估的数据集时，条件设置警报必须达到或超过该阈值才能创建警报。

时间间隔指定评估警报规则的频率。配置的持续时间表示必须满足条件的持续时间。警报规则还可以定义缺少数据时的警报行为。

**Topics**
+ [警报规则类型](v9-alerting-explore-rules-types.md)
+ [警报实例](v9-alerting-rules-instances.md)
+ [命名空间和组](v9-alerting-rules-grouping.md)
+ [通知模板化](v9-alerting-rules-notification-templates.md)

# 警报规则类型
<a name="v9-alerting-explore-rules-types"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

Grafana 支持多种警报规则类型。以下各节将解释这些类型的优缺点，以帮助您为用例选择正确的警报类型。

Grafana 管理的警报

Grafana 管理的规则是最灵活的警报规则类型。通过这些规则，您可以创建警报，而这些警报可以作用于任何现有数据来源中的数据。

除了支持任何数据来源，您还可以添加[表达式](v9-panels-query-xform-expressions.md)来转换数据和设置警报条件。

Mimir、Loki 和 Cortex 规则

要创建 Mimir、Loki 或 Cortex 警报，您必须拥有兼容的 Prometheus 数据来源。您可以通过测试数据来源，并检查是否支持 Ruler API 的详细信息来检查数据来源是否兼容。

记录规则

记录规则仅适用于兼容的 Prometheus 数据来源，如 Mimir、Loki 和 Cortex。

记录规则允许您将表达式的结果保存到一组新的时间序列中。如果要对聚合数据运行警报，或者您的控制面板重复查询同一表达式，这将非常有用。

阅读有关 Prometheus 中[记录规则](https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/)的更多信息。

# 警报实例
<a name="v9-alerting-rules-instances"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

Grafana 管理的警报支持多维警报。每条警报规则可以生成多个警报实例。如果您在单个表达式中观察到多个序列，这将非常有用。

请看下面的 PromQL 表达式：

```
sum by(cpu) (
  rate(node_cpu_seconds_total{mode!="idle"}[1m])
)
```

使用此表达式的规则将创建与评估期间 CPUs 观察到的警报数量一样多的警报实例，从而允许单个规则报告每个 CPU 的状态。

# 命名空间和组
<a name="v9-alerting-rules-grouping"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

您可以使用 Grafana 管理的规则文件夹以及 Mimir、Loki 或 Prometheus 规则和组名称的命名空间来整理警报。

**命名空间**

创建 Grafana 管理的规则时，可使用文件夹执行访问控制，并授予或拒绝对特定文件夹内所有规则的访问权限。

**组**

组中的所有规则按相同的**时间间隔**进行评估。

组中的警报规则和记录规则将始终**按顺序**进行评估，这意味着不会同时按出现的顺序评估任何规则。

**提示**  
如果您希望按不同的时间间隔同时评估规则，请考虑将其存储在不同的组中。

# 通知模板化
<a name="v9-alerting-rules-notification-templates"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

通过联系点发送的通知是使用通知模板生成的。Grafana 的默认模板基于 [Go 模板系统](https://golang.org/pkg/text/template)，其中一些字段作为文本评估，而另一些字段则作为 HTML 评估（可能会影响转义）。

默认模板 [default\$1template.go](https://github.com/grafana/alerting/blob/main/templates/default_template.go) 是自定义模板的有用参考。

大部分联系点字段都可以模板化，因此您可以创建可重复使用的自定义模板，并在多个联系点中使用它们。要了解使用模板的自定义通知，请参阅 [自定义通知](v9-alerting-notifications.md)。

**嵌套模板**

您可以将模板嵌入到其他模板中。

例如，您可以使用 `define` 关键字定义一个模板片段：

```
{{ define "mytemplate" }}
  {{ len .Alerts.Firing }} firing. {{ len .Alerts.Resolved }} resolved.
{{ end }}
```

然后，您可以使用 `template` 关键字将自定义模板嵌入到此片段中。例如：

```
Alert summary:
{{ template "mytemplate" . }}
```

您可以使用以下内置模板选项嵌入自定义模板。


| Name | 注意 | 
| --- | --- | 
|  `default.title`  |  显示概览状态信息。  | 
|  `default.message`  |  提供已触发和已解决警报的格式化摘要。  | 
|  `teams.default.message`  |  类似于 `default.messsage`，针对 Microsoft Teams 进行了格式化。  | 

**通知模板中的 HTML**

警报通知模板中的 HTML 已转义。不支持在生成的通知中渲染 HTML。

某些通知程序支持其他更改通知外观的方法。例如，Grafana 会将警报电子邮件的基本模板安装到 `<grafana-install-dir>/public/emails/ng_alert_notification.html`。您可以编辑此文件，以更改所有警报电子邮件的外观。

# 基于数值数据的警报
<a name="v9-alerting-explore-numeric"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

本主题将介绍 Grafana 如何处理数值数据而非时间序列数据的警报。

在某些数据来源中，非时间序列的数值数据可以直接发出警报，或传递到服务器端表达式 (SSE)。这样可以在数据来源中进行更多处理，从而提高效率，还可以简化警报规则。当基于数值数据（而不是时间序列数据）生成警报时，不需要将每个带标签的时间序列缩减为一个单一数字。相反，带标签的数字会返回给 Grafana。

**表格数据**

查询表格数据的后端数据来源支持此功能：
+ SQL 数据来源，比如 MySQL、Postgres、MSSQL 和 Oracle。
+ 基于 Azure Kusto 的服务：Azure Monitor（日志）、Azure Monitor（Azure Resource Graph）和 Azure Data Explorer。

如果满足以下条件，则使用 Grafana 管理的警报或 SSE 的查询在这些数据来源中会被视为数值查询：
+ 在数据来源查询中，“格式为”选项设置为“表”。
+ 从查询返回给 Grafana 的表响应仅包含一个数值（例如 int、double、float）列和可选的附加字符串列。

如果存在字符串列，这些列将成为标签。列的名称将成为标签名称，每行的值将成为相应标签的值。如果返回多行，则每行都应通过其标签进行唯一标识。

**示例**

对于名为 “DiskSpace” 的 MySQL 表：


| 时间 | Host | 磁盘 | PercentFree | 
| --- | --- | --- | --- | 
|  2021-June-7  |  web1  |  /etc  |  3  | 
|  2021-June-7  |  web2  |  /var  |  4  | 
|  2021-June-7  |  web3  |  /var  |  8  | 
|  ...  |  ...  |  ...  |  ...  | 

您可以查询按时间筛选的数据，而不将时间序列返回给 Grafana。例如，当可用空间低于 5% 时，将按主机、磁盘触发警报：

```
SELECT Host , Disk , CASE WHEN PercentFree  < 5.0 THEN PercentFree  ELSE 0 END FROM ( 
   SELECT
      Host, 
      Disk, 
      Avg(PercentFree) 
   FROM DiskSpace
   Group By
      Host, 
      Disk 
   Where __timeFilter(Time)
```

此查询会向 Grafana 返回以下表响应：


| Host | 磁盘 | PercentFree | 
| --- | --- | --- | 
|  web1  |  /etc  |  3  | 
|  web2  |  /var  |  4  | 
|  web3  |  /var  |  0  | 

如果在警报规则中将此查询用作**条件**，则对值为非零的情况发出警报。因此，将生成三个警报实例：


| 标签 | Status | 
| --- | --- | 
|  \$1Host=web1,disk=/etc\$1  |  警报  | 
|  \$1Host=web2,disk=/var\$1  |  警报  | 
|  \$1Host=web3,disk=/var\$1  |  Normal  | 

# 标签和注释
<a name="v9-alerting-explore-labels"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

标签和注释包含警报的相关信息。标签和注释具有相同的结构：一组命名值；但其预期用途不同。标签或等效注释的示例为 `alertname="test"`。

标签和注释之间的主要区别在于，标签用于将警报与所有其他警报区分开来，而注释则用于向现有警报添加其他信息。

例如，假设两个 CPU 过高警报：一个是针对 `server1`，一个是针对 `server2`。在这样的示例中，我们可能有一个名为 `server` 的标签，其中第一个警报带有标签 `server="server1"`，第二个警报带有标签 `server="server2"`。但我们可能还想为每个警报添加描述，例如 `"The CPU usage for server1 is above 75%."`，其中 `server1` 和 `75%` 替换为服务器的名称和 CPU 使用率（有关如何执行此操作，请参阅 [模板化标签和注释](v9-alerting-explore-labels-templating.md) 上的文档）。这种描述更适合作为注释。

## 标签
<a name="v9-alerting-explore-labels-labels"></a>

标签包含用于识别警报的信息。标签的示例为 `server=server1`。每个警报可以有多个标签，警报的完整标签集称为其标签集。正是这个标签集可以识别警报。

例如，一个警报具有标签集 `{alertname="High CPU usage",server="server1"}`，而另一个警报具有标签集 `{alertname="High CPU usage",server="server2"}`。这是两个独立的警报，因为尽管它们的 `alertname` 标签相同，但 `server` 标签却不同。

警报的标签集是数据来源中的标签、警报规则中的自定义标签和许多保留标签（比如 `alertname`）的组合。

**自定义标签**

自定义标签是警报规则中的附加标签。与注释一样，自定义标签必须有一个名称，其值可包含文本和模板代码的组合，在警报触发时进行评估。有关如何模板化自定义标签的文档，请在[此处](v9-alerting-explore-labels-templating.md)查找。

在模板中使用自定义标签时，请务必确保标签值在警报规则的连续评估之间不会发生变化，因为这最终会创建大量不同的警报。但是，模板可以为不同的警报生成不同的标签值。例如，不要将查询的值放在自定义标签中，因为这最终会在每次值更改时创建一组新的警报。改为使用注释。

此外，请务必确保警报的标签集没有两个或多个同名标签。如果自定义标签与数据来源中的标签同名，则会替换该标签。但如果自定义标签与保留标签同名，则该自定义标签将从警报中省略。

## Annotations
<a name="v9-alerting-explore-labels-annotations"></a>

注释是为现有警报添加其他信息的命名对。Grafana 中有许多建议的注释，例如 `description`、`summary`、`runbook_url`、`dashboardUId` 和 `panelId`。与自定义标签一样，注释必须有一个名称，其值可包含文本和模板代码的组合，在警报触发时进行评估。如果注释包含模板代码，则在触发警报时会对模板进行一次评估。即使警报已解决，也不会重新评估。有关如何模板化注释的文档，请在[此处](v9-alerting-explore-labels-templating.md)查找。

# 标签匹配的工作原理
<a name="v9-alerting-explore-labels-matching"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

使用标签和标签匹配程序将警报规则与通知策略和静默相关联。这提供了一种非常灵活的方式来管理您的警报实例，指定由哪个策略处理这些实例，以及哪些警报需要静默。

标签匹配程序由 3 个不同的部分组成：**标签**、**值**和**运算符**。
+ **标签**字段是要匹配的标签名称。必须与标签名称完全匹配。
+ **值**字段与指定**标签**名称的相应值匹配。匹配方式取决于**运算符**值。
+ **运算符**字段是与标签值匹配的运算符。可用的运算符有：


| 运算符 | 说明 | 
| --- | --- | 
|  `=`  |  选择与该值完全相等的标签。  | 
|  `!=`  |  选择与该值不相等的标签。  | 
|  `=~`  |  选择与该值正则表达式匹配的标签。  | 
|  `!~`  |  选择不与该值正则表达式匹配的标签。  | 

如果您使用多个标签匹配程序，则使用 AND 逻辑运算符将其组合在一起。这意味着所有匹配程序都必须匹配，才能将规关联到策略。

**示例方案**

如果为警报定义了一组标签：

```
{ foo=bar, baz=qux, id=12 }
```

那么：
+ 定义为 `foo=bar` 的标签匹配程序与此警报规则匹配。
+ 定义为 `foo!=bar` 的标签匹配程序*不*与此警报规则匹配。
+ 定义为 `id=~[0-9]+` 的标签匹配程序与此警报规则匹配。
+ 定义为 `baz!~[0-9]+` 的标签匹配程序与此警报规则匹配。
+ 定义为 `foo=bar` 和 `id=~[0-9]+` 的两个标签匹配程序与此警报规则匹配。

# Grafana Alerting 中的标签
<a name="v9-alerting-explore-labels-alerting"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

本主题解释了为什么标签是警报的基本组成部分。
+ 警报的完整标签集是 Grafana 警报中唯一标识警报的部分。
+ Alertmanager 使用标签将警报与通知策略中的静默和警报组进行匹配。
+ 警报 UI 显示评估该规则期间生成的每个警报实例的标签。
+ 联系点可以访问标签，以动态生成通知，其中包含与生成通知的警报相关的特定信息。
+ 可将标签添加到[警报规则](v9-alerting-managerules.md)。标签可手动配置，使用模板函数，并可以引用其他标签。如果标签之间发生冲突，则添加到警报规则的标签优先（Grafana 保留标签除外，更多信息见下文）。

**外部 Alertmanager 兼容性**

Grafana 的内置 Alertmanager 支持 Unicode 标签键和值。如果您使用的是外部 Prometheus Alertmanager，则标签键必须与其[数据模型](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels)兼容。这意味着标签键只能包含 **ASCII 字母**、**数字**和**下划线**，并与正则表达式 `[a-zA-Z_][a-zA-Z0-9_]*` 匹配。任何无效字符都将被 Grafana Alerting 引擎移除或替换，然后根据以下规则发送到外部 Alertmanager：
+ `Whitespace` 将被移除。
+ `ASCII characters` 将替换为 `_`。
+ `All other characters` 将替换为小写的十六进制表示形式。如果是第一个字符，则带有前缀 `_`。

**注意**  
如果将多个标签键清理为相同的值，则重复项将附加原始标签的短哈希作为后缀。

**Grafana 保留标签**

**注意**  
Grafana 保留带有前缀 `grafana_` 的标签，用于特殊用途。如果添加以 `grafana_` 开头的手动配置标签，在发生冲突的情况下，该标签将被覆盖。

Grafana 保留标签的使用方式与手动配置的标签相同。当前可用的保留标签列表：


| 标签 | 说明 | 
| --- | --- | 
|  grafana\$1folder  |  包含警报的文件夹标题。  | 

# 模板化标签和注释
<a name="v9-alerting-explore-labels-templating"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

在 Grafana 中，您可以像在 Prometheus 中一样对标签和注释进行模板化。如果您之前使用过 Prometheus，那么应该熟悉 `$labels` 和 `$value` 变量，包括警报的标签和值。即使警报不使用 Prometheus 数据来源，您也可以在 Grafana 中使用相同的变量。如果您以前没有使用过 Prometheus，请不要担心，因为本页的其余部分将介绍这些变量以及如何对其模板化。

## Go 的模板语言
<a name="v9-alerting-explore-labels-templating-go"></a>

标签和注释的模板是用 Go 的模板语言 [text/template](https://pkg.go.dev/text/template) 编写的。

**开始和结束标签**

在 text/template 中，模板以 `{{` 开头，以 `}}` 结尾，无论模板是打印变量还是运行 if 语句等控制结构。这与 Jinja 等其他模板语言不同，在 Jinja 中，打印变量使用 `{{` 和 `}}`，控制结构使用 `{%` 和 `%}`。

**Print (打印)**

要打印某项的值，请使用 `{{` 和 `}}`。您可以打印函数的结果或变量的值。例如，要打印 `$labels` 变量，您可以编写以下内容：

```
{{ $labels }}
```

**遍历标签**

要遍历 `$labels` 中的每个标签，可以使用 `range`。这里 `$k` 是指名称，`$v` 是指当前标签的值。例如，如果您的查询返回一个标签 `instance=test`，那么 `$k` 将是 `instance`，`$v` 将是 `test`。

```
{{ range $k, $v := $labels }}
{{ $k }}={{ $v }}
{{ end }}
```

## 标签、值和值变量
<a name="v9-alerting-explore-labels-templating-variables"></a>

**标签变量**

`$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
```

这是因为模板尝试使用 `$labels.instance` 中不存在的字段（名为 `name`）。您应该改用 `index` 函数，该函数会在 `$labels` 变量中打印标签 `instance.name`：

```
Instance {{ index $labels "instance.name" }} has been down for more than 5 minutes
```

**值变量**

`$value` 变量的工作原理与 Prometheus 不同。在 Prometheus 中，`$value` 是一个包含表达式值的浮点数，但在 Grafana 中，却是一个字符串，包含该警报规则的所有阈值、Reduce 和 Math 表达式以及经典条件的标签和值。但不包含查询的结果，因为这些查询可以返回 10 到 10000 行或指标。

如果您要在警报摘要中使用 `$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 索引。

如果要在警报摘要中打印带有 RefID `B` 的表达式值：

```
{{ $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 的浮点值，必须使用 `$values.B` 中的 `Value` 字段。如果要对警报摘要中的浮点值进行人性化处理：

```
{{ $labels.service }} has over 5% of responses with 5xx errors: {{ humanize $values.B.Value }}%
```

**无数据、运行时错误和超时**

如果警报规则中的查询未返回任何数据，或者由于数据来源错误或超时而失败，则使用该查询的任何阈值、Reduce 或 Math 表达式也将不返回任何数据或错误。当这种情况发生时，这些表达式将缺失 `$values`。最好在使用 RefID 之前检查 RefID 是否存在，否则，如果您的查询没有返回任何数据或错误，模板将会中断。您可使用 if 语句实现：

```
{{ if $values.B }}{{ $labels.service }} has over 5% of responses with 5xx errors: {{ humanizePercentage $values.B.Value }}{{ end }}
```

## 经典条件
<a name="v9-alerting-explore-labels-templating-classic"></a>

如果规则使用经典条件而不是阈值、Reduce 和 Math 表达式，则 `$values` 变量将由 Ref ID 和条件在经典条件中的位置进行索引。例如，如果您有一个带有 RefID B 的经典条件，其中包含两个条件，则 `$values` 将包含两个条件 `B0` 和 `B1`。

```
The first condition is {{ $values.B0 }}, and the second condition is {{ $values.B1 }}
```

## 函数
<a name="v9-alerting-explore-labels-templating-functions"></a>

在展开标签和注释时，可以使用以下函数：

**args**

`args` 函数将对象列表转换为带有 arg0、arg1 等键的映射。这是为了允许将多个参数传递给模板。

**示例**

```
{{define "x"}}{{.arg0}} {{.arg1}}{{end}}{{template "x" (args 1 "2")}}
```

```
1 2
```

**externalURL**

`externalURL` 函数返回 ini 文件中配置的 Grafana 服务器的外部 URL。

**示例**

```
{{ externalURL }}
```

```
https://example.com/grafana
```

**graphLink**

`graphLink` 函数返回给定表达式和数据来源在 [Grafana 9 中的 Explore](v9-explore.md) 中图形视图的路径。

**示例**

```
{{ graphLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }}
```

```
/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":false,"range":true}]
```

**humanize**

`humanize` 函数对十进制数字进行人性化处理。

**示例**

```
{{ humanize 1000.0 }}
```

```
1k
```

**humanize1024**

`humanize1024` 的工作原理类似于 `humanize`，但使用 1024（而不是 1000）作为基数。

**示例**

```
{{ humanize1024 1024.0 }}
```

```
1ki
```

**humanizeDuration**

`humanizeDuration` 函数对持续时间（秒）进行人性化处理。

**示例**

```
{{ humanizeDuration 60.0 }}
```

```
1m 0s
```

**humanizePercentage**

`humanizePercentage` 函数将比率值人性化处理为百分比。

**示例**

```
{{ humanizePercentage 0.2 }}
```

```
20%
```

**humanizeTimestamp**

`humanizeTimestamp` 函数对 Unix 时间戳进行人性化处理。

**示例**

```
{{ humanizeTimestamp 1577836800.0 }}
```

```
2020-01-01 00:00:00 +0000 UTC
```

**match**

`match` 函数将文本与正则表达式模式进行匹配。

**示例**

```
{{ match "a.*" "abc" }}
```

```
true
```

**pathPrefix**

`pathPrefix` 函数返回 ini 文件中配置的 Grafana 服务器的路径。

**示例**

```
{{ pathPrefix }}
```

```
/grafana
```

**tableLink**

`tableLink` 函数返回给定表达式和数据来源在 [Grafana 9 中的 Explore](v9-explore.md) 中表格视图的路径。

**示例**

```
{{ tableLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }}
```

```
/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":true,"range":false}]
```

**删除实例快照**

`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
```

# 警报规则的状态和运行状况
<a name="v9-alerting-explore-state"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

警报规则的状态和运行状况可帮助您了解有关警报的几个关键状态指标。

有三个关键组件：*警报规则状态*、*警报实例状态*和*警报规则运行状况*。尽管相关，但每个组件传达的信息略有不同。

**警报规则状态**

警报规则可能处于以下任何状态：


| 州 | 说明 | 
| --- | --- | 
|  Normal  |  评估引擎返回的时间序列均未处于 `Pending` 或 `Firing` 状态。  | 
|  待定  |  评估引擎返回的时间序列中至少有一个处于 `Pending` 状态。  | 
|  触发  |  评估引擎返回的时间序列中至少有一个处于 `Firing` 状态。  | 

**注意**  
警报先过渡到 `pending`，然后过渡到 `firing`，因此至少需要两个评估周期才会触发警报。

**警报实例状态**

警报实例可能处于以下任何状态：


| 州 | 说明 | 
| --- | --- | 
|  Normal  |  警报的状态既不是触发也不是待处理，一切正常。  | 
|  待定  |  警报处于活动状态的时间少于配置的阈值持续时间。  | 
|  警报  |  警报处于活动状态的时间超过配置的阈值持续时间。  | 
|  NoData  |  在配置的时间窗口内未收到任何数据。  | 
|  错误  |  尝试评估警报规则时发生的错误。  | 

**警报规则运行状况**

警报规则可能具有以下运行状况之一：


| 州 | 说明 | 
| --- | --- | 
|  确定  |  评估警报规则时无错误。  | 
|  错误  |  在评估警报规则时发生错误。  | 
|  NoData  |  规则评估期间返回的至少一个时间序列中没有数据。  | 

**`NoData` 和 `Error` 的特殊警报**

当警报规则的评估产生 `NoData` 或 `Error` 状态时，Grafana Alerting 将生成具有以下附加标签的特殊警报：


| 标签 | 说明 | 
| --- | --- | 
|  alertname  |  `DatasourceNoData` 或 `DatasourceError`，视状态而定。  | 
|  datasource\$1uid  |  导致该状态的数据来源 UID。  | 

您可以像处理常规警报一样处理这些警报，方法是添加静默、路由到联系点等。

# 联系点
<a name="v9-alerting-explore-contacts"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

使用联系点定义当警报规则触发时如何通知联系人。一个联系点可以有一个或多个联系点类型，例如电子邮件、Slack、webhook 等。警报规则触发后，将向联系点列出的所有联系点类型发送通知。可以为 Grafana Alertmanager 以及外部 Alertmanager 配置联系点。

您还可以使用通知模板来自定义联系点类型的通知消息。

**支持的联系点类型**

下表列出了 Grafana 支持的联系点类型。


| Name | Type | 
| --- | --- | 
|  Amazon SNS  |  `sns`  | 
|  OpsGenie  |  `opsgenie`  | 
|  Pager Duty  |  `pagerduty`  | 
|  Slack  |  `slack`  | 
|  VictorOps  |  `victorops`  | 

有关联系点的更多信息，请参阅 [使用联系点](v9-alerting-contact-points.md) 和 [自定义通知](v9-alerting-notifications.md)。

# 通知
<a name="v9-alerting-explore-notifications"></a>

****  
本文档主题专为支持 **Grafana 9.x 版本**的 Grafana 工作区而设计。  
对于支持 Grafana 10.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 10](using-grafana-v10.md)。  
对于支持 Grafana 8.x 版本的 Grafana 工作区，请参阅[使用 Grafana 版本 8](using-grafana-v8.md)。

Grafana 使用 Alertmanager 发送触发和已解决警报的通知。Grafana 有自己的 Alertmanager，在用户界面中称为“Grafana”，但也支持从其他 Alertmanager 发送通知，例如 [Prometheus Alertmanager](https://prometheus.io/docs/alerting/latest/alertmanager/)。Grafana Alertmanager 使用通知策略和联系点来配置通知发送的方式和地点；通知发送的频率；以及警报是否在同一个通知中发送，根据一组标签在分组通知中发送，还是作为单独的通知发送。

## 通知策略
<a name="v9-alerting-explore-notifications-policies"></a>

通知策略控制着通知的发送时间和地点。通知策略可以选择在同一通知中一起发送所有警报，根据一组标签在分组通知中发送警报，或者将警报作为单独的通知发送。您可以配置每个通知策略来控制发送通知的频率，设置一个或多个静音定时，在一天中的特定时间和一周中的几天禁止通知。

通知策略采用树形结构，在树的根部有一个称为根策略的通知策略。根策略只能有一个，而且不能删除。

特定的路由策略是根策略的子策略，可用于根据一组匹配标签来匹配所有警报或部分警报。当通知策略的匹配标签与警报中的标签匹配时，通知策略就会与警报匹配。

特定路由策略可以有自己的子策略，从而实现更多的警报匹配。特定路由策略的一个例子是向运营团队发送基础设施警报；而子策略可能会向 Pagerduty 发送高优先级警报，向 Slack 发送低优先级警报。

所有警报（无论其标签如何）都匹配根策略。但是，当根策略收到警报时，会查看每个特定路由策略，并将警报发送到与警报匹配的第一个特定路由策略。如果特定路由策略还有其他子策略，则会尝试将警报与其嵌套策略之一进行匹配。如果没有特定路由策略与警报匹配，则策略本身就是匹配的策略。如果没有特定路由策略，或者没有与警报匹配的特定路由策略，则根策略就是匹配的策略。

## 联系点
<a name="v9-alerting-explore-notifications-contacts"></a>

联系点包含发送通知的配置。联系点是一个集成列表，每个集成都会向特定的电子邮件地址、服务或 URL 发送通知。联系点可以是多个相同类型的集成，也可以是不同类型集成的组合。例如，联系点可以包含一个 Pager Duty 集成；一个 Pager SNS 和 Slack 集成；或一个 Pager Duty 集成、一个 Slack 集成和两个 Amazon SNS 集成。您也可以配置没有集成的联系点；在这种情况下，不发送任何通知。

联系点只有在添加到通知策略后才能发送通知。一个通知策略只能向一个联系点发送警报，但是一个联系点可以同时添加到多个通知策略。当警报与通知策略匹配时，警报将发送到该通知策略中的联系点，然后由联系点向其配置中的每个集成发送通知。

**注意**  
有关联系点支持的集成的信息，请参阅 [联系点](v9-alerting-explore-contacts.md)。

## 模板化通知
<a name="v9-alerting-explore-notifications-templating"></a>

您可以使用模板自定义通知。例如，模板可用于更改发送到 Slack 的通知标题和消息。

模板并不限于单个集成或联系点，还可以在同一联系点的多个集成中使用，甚至是跨不同联系点的集成。例如，Grafana 用户可以创建一个名为 `custom_subject_or_title` 的模板，将其用于 Pager Duty 中的模板主题和 Slack 消息标题，而不必创建两个单独的模板。

所有通知模板均使用 [Go 的模板语言](https://pkg.go.dev/text/template)编写，位于“警报”页面的“联系点”选项卡中。

## 静默
<a name="v9-alerting-explore-notifications-silences"></a>

您可以使用静默将来自一个或多个触发规则的通知静音。静默不会阻止警报触发或解决，也不会在用户界面中隐藏触发警报。静默持续的时间取决于其持续时间，可按分钟、小时、天、月或年配置。