文档文档

在计划停机期间处理 Kapacitor 警报

在许多情况下,进行系统维护需要基础设施停机。这种类型的停机通常会提前计划好,但如果受影响的主机由 Kapacitor 监控,则可能触发不必要的警报。本指南将介绍如何创建可优雅处理计划停机而不会触发警报的 TICKscript。

Sideload

使用 sideload 节点从文件系统中加载信息,并设置数据点上的字段和标签,然后这些信息可在警报逻辑中使用,从而避免在计划停机期间产生不必要的警报。 sideload 节点根据来自各种基于文件的层次化数据,向数据点添加字段和标签。

Kapacitor 会在指定的文件中搜索给定的字段或标签键。如果它在加载的文件中找到字段或标签键,它将使用文件中的值来设置数据点上的字段或标签。如果找不到字段或标签键,它将使用 fieldtag 属性中定义的默认值来设置它们。

相关的 sideload 属性

sideload 的以下属性与优雅地处理计划停机相关

source

source 指定源文件所在的目录。

order

order 指定要加载和搜索的文件以及加载和搜索的顺序。文件路径相对于 source 目录。文件应为 JSON 或 YAML 格式。

字段

field 定义 Kapacitor 应搜索的字段键,以及如果未在加载的文件中找到匹配的字段键时应使用的默认值。

tag

tag 定义 Kapacitor 应搜索的标签键,以及如果未在加载的文件中找到匹配的标签键时应使用的默认值。

设置

使用 sideload 函数,您可以创建一个基本上是白名单或黑名单的列表,以在计划停机期间忽略主机。在此示例中,假设维护将发生在单个主机和主机组上,这两者都包含在每个数据点上的标签中。

在大多数情况下,这可以通过主机简单地完成,但为了说明 order 属性的工作原理,我们将同时使用主机和主机组。

Sideload 源文件

在运行 Kapacitor 的主机上,创建一个源目录来存放 JSON 或 YAML 文件。例如,/usr/kapacitor/scheduled-maintenance (它可以是任何您想要的,只要 kapacitord 进程能够访问它)。

在此目录中,为计划停机期间将离线的每个主机或主机组创建一个文件。为了便于组织,创建 hostshostgroups 目录并将 YAML 或 JSON 文件存储在每个目录中。每个文件的名称应匹配将离线的主机的 hosthostgroup 标签的值。

在此示例中,假设 host1host2host3 主机以及 cluster7cluster8 主机组将被下线。在各自的目录中为每个主机和主机组创建一个文件。

/usr/
└── kapacitor/
    └── scheduled-maintenance/
        │
        ├── hosts/
        │   ├── host1.yml
        │   ├── host2.yml
        │   └── host3.yml
        │
        └── hostgroups/
            ├── cluster7.yml
            └── cluster8.yml

您只需要为将离线的主机或主机组创建文件。

文件内容应包含一个或多个键值对。键是将在每个匹配数据点上设置的字段或标签键。值是将在匹配数据点上设置的字段或标签值。

在此示例中,将 maintenance 字段设置为 true。每个源文件将如下所示:

host1.yml
maintenance: true

TICKscript

创建使用 sideload 节点加载维护状态到所需位置的 TICKscript。

定义 sideload 源

source 应使用 file:// URL 协议来引用包含应加载文件的目录的绝对路径。

|sideload()
  .source('file:///usr/kapacitor/scheduled-maintenance')

定义 sideload 顺序

order 属性可以访问模板数据,这些数据将用于填充加载文件的文件路径(相对于 source)。这使得 Kapacitor 能够根据模板中使用的标签名称动态搜索文件。

在这种情况下,使用 hosthostgroup 标签。Kapacitor 将遍历每个标签的不同值,并在源目录中搜索匹配的文件。

|sideload()
  .source('file:///usr/kapacitor/scheduled-maintenance')
  .order('hosts/{{.host}}.yml' , 'hostgroups/{{.hostgroup}}.yml')

order 属性中文件路径模板的顺序定义了检查文件路径的优先级。从左到右,先列出的先被检查。

定义 sideload 字段

field 属性需要两个参数:

|sideload()
  // ...
  .field('<key>', <default-value>)
key

Kapacitor 在源文件中查找的键,以及它为每个数据点定义的字段值。

default-value

如果在源文件中未找到匹配的文件和键时使用的默认值。

在此示例中,使用 maintenance 字段并将默认值设置为 FALSE。这假设主机默认不进行维护。

|sideload()
  .source('file:///usr/kapacitor/scheduled-maintenance')
  .order('hosts/{{.host}}.yml' , 'hostgroups/{{.hostgroup}}.yml')
  .field('maintenance', FALSE)

如果您希望在每个数据点上设置标签而不是字段,可以使用 tag 属性而不是 field

更新警报逻辑

sideload 节点现在将在 TICKscript 处理的每个数据点上设置 maintenance 字段。对于那些 hosthostgroup 标签与源文件名匹配的数据点,maintenance 字段将被设置为源文件中定义的值。

更新 TICKscript 中的警报逻辑,确保在发送警报之前 maintenance **不**为 true

stream
  // ...
  |alert()
    .crit(lambda: !"maintenance" AND "usage_idle" < 30)
    .warn(lambda: !"maintenance" AND "usage_idle" < 50)
    .info(lambda: !"maintenance" AND "usage_idle" < 70)

完整的 TICKscript 示例

stream
  |from()
    .measurement('cpu')
    .groupBy(*)
  // Use sideload to maintain the host maintenance state.
  // By default we assume a host is not undergoing maintenance.
  |sideload()
    .source('file:///usr/kapacitor/scheduled-maintenance')
    .order('hosts/{{.host}}.yml' , 'hostgroups/{{.hostgroup}}.yml')
    .field('maintenance', FALSE)
  |alert()
    // Add the `!"maintenance"` condition to the alert.
    .crit(lambda: !"maintenance" AND "usage_idle" < 30)
    .warn(lambda: !"maintenance" AND "usage_idle" < 50)        
    .info(lambda: !"maintenance" AND "usage_idle" < 70)

为计划停机做好准备

使用更新后的 TICKscript 定义新的 Kapacitor 任务

当您的计划停机开始时,更新适当主机和主机组源文件中的 maintenance 值并重新加载 sideload,以避免触发针对这些特定主机和主机组的警报。


此页面是否有帮助?

感谢您的反馈!


InfluxDB 3.8 新特性

InfluxDB 3.8 和 InfluxDB 3 Explorer 1.6 的主要增强功能。

查看博客文章

InfluxDB 3.8 现已适用于 Core 和 Enterprise 版本,同时发布了 InfluxDB 3 Explorer UI 的 1.6 版本。本次发布着重于操作成熟度,以及如何更轻松地部署、管理和可靠地运行 InfluxDB。

更多信息,请查看

InfluxDB Docker 的 latest 标签将指向 InfluxDB 3 Core

在 **2026 年 2 月 3 日**,InfluxDB Docker 镜像的 latest 标签将指向 InfluxDB 3 Core。为避免意外升级,请在您的 Docker 部署中使用特定的版本标签。

如果使用 Docker 来安装和运行 InfluxDB,latest 标签将指向 InfluxDB 3 Core。为避免意外升级,请在您的 Docker 部署中使用特定的版本标签。例如,如果使用 Docker 运行 InfluxDB v2,请将 latest 版本标签替换为 Docker pull 命令中的特定版本标签 — 例如

docker pull influxdb:2