在计划停机期间处理 Kapacitor 警报
在许多情况下,进行系统维护需要基础设施停机。这种类型的停机通常会提前计划好,但如果受影响的主机由 Kapacitor 监控,则可能触发不必要的警报。本指南将介绍如何创建可优雅处理计划停机而不会触发警报的 TICKscript。
Sideload
使用 sideload 节点从文件系统中加载信息,并设置数据点上的字段和标签,然后这些信息可在警报逻辑中使用,从而避免在计划停机期间产生不必要的警报。 sideload 节点根据来自各种基于文件的层次化数据,向数据点添加字段和标签。
Kapacitor 会在指定的文件中搜索给定的字段或标签键。如果它在加载的文件中找到字段或标签键,它将使用文件中的值来设置数据点上的字段或标签。如果找不到字段或标签键,它将使用 field 或 tag 属性中定义的默认值来设置它们。
相关的 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 进程能够访问它)。
在此目录中,为计划停机期间将离线的每个主机或主机组创建一个文件。为了便于组织,创建 hosts 和 hostgroups 目录并将 YAML 或 JSON 文件存储在每个目录中。每个文件的名称应匹配将离线的主机的 host 或 hostgroup 标签的值。
在此示例中,假设 host1、host2、host3 主机以及 cluster7 和 cluster8 主机组将被下线。在各自的目录中为每个主机和主机组创建一个文件。
/usr/
└── kapacitor/
└── scheduled-maintenance/
│
├── hosts/
│ ├── host1.yml
│ ├── host2.yml
│ └── host3.yml
│
└── hostgroups/
├── cluster7.yml
└── cluster8.yml您只需要为将离线的主机或主机组创建文件。
文件内容应包含一个或多个键值对。键是将在每个匹配数据点上设置的字段或标签键。值是将在匹配数据点上设置的字段或标签值。
在此示例中,将 maintenance 字段设置为 true。每个源文件将如下所示:
host1.yml
maintenance: trueTICKscript
创建使用 sideload 节点加载维护状态到所需位置的 TICKscript。
定义 sideload 源
source 应使用 file:// URL 协议来引用包含应加载文件的目录的绝对路径。
|sideload()
.source('file:///usr/kapacitor/scheduled-maintenance')定义 sideload 顺序
order 属性可以访问模板数据,这些数据将用于填充加载文件的文件路径(相对于 source)。这使得 Kapacitor 能够根据模板中使用的标签名称动态搜索文件。
在这种情况下,使用 host 和 hostgroup 标签。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 字段。对于那些 host 或 hostgroup 标签与源文件名匹配的数据点,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,以避免触发针对这些特定主机和主机组的警报。
此页面是否有帮助?
感谢您的反馈!
支持和反馈
感谢您成为我们社区的一员!我们欢迎并鼓励您对 Kapacitor 和本文档提供反馈和错误报告。要获取支持,请使用以下资源: