使用警报主题
Kapacitor的警报系统允许使用发布-订阅设计模式。 警报被发布到一个 topic,而 handlers 订阅它。
本例将带领读者设置一个简单的 CPU 阈值警报,该警报会发送通知到 Slack。
要求
预计读者已经熟悉在入门指南中介绍的Kapacitor基础知识。读者还应该对任务和TICKscripts的工作有基本了解。
进一步预期已安装工作中的Telegraf和Kapacitor,以便逐步完成此示例。如果尚未安装,请花一点时间设置它们。
任务
本指南将演示如何设置一个 cpu 警报主题并向该主题发送警报。
首先定义一个简单的 CPU 警报。
dbrp "telegraf"."autogen"
stream
|from()
.measurement('cpu')
.groupBy(*)
|alert()
.warn(lambda: "usage_idle" < 20)
.crit(lambda: "usage_idle" < 10)
// Send alerts to the `cpu` topic
.topic('cpu')
上述 TICKscript 创建了一个针对 CPU 使用率的阈值警报,并将警报发送到 cpu 主题。
将上述脚本保存为 cpu_alert.tick。
通过运行以下命令创建并启动任务:
$ kapacitor define cpu_alert -tick cpu_alert.tick
$ kapacitor enable cpu_alert
Slack 处理程序
此时,一个生成警报并将其发送到 cpu 主题的 Kapacitor 任务正在运行,但由于该主题没有任何处理程序,因此警报没有任何反应。
确认通过检查主题没有处理程序:
$ kapacitor show-topic cpu
输出应如下所示:
ID: cpu
Level: OK
Collected: 27
Handlers: []
Events:
Event Level Message Date
cpu:cpu=cpu3,host=localhost OK cpu:cpu=cpu3,host=localhost is OK 23 Jan 17 14:04 MST
如果返回错误信息 unknown topic: "cpu",请注意,主题仅在需要时创建,因此如果任务尚未触发警报,则主题将不存在。如果返回此错误表示主题不存在,则请尝试触发警报。要么更改任务的阈值,要么产生一些CPU负载。
要配置处理程序,首先必须定义处理程序绑定。 处理程序绑定有几个部分:
- 主题 - 主题ID。
- ID - 处理程序的唯一ID。
- 类型 - 处理程序的类型,在本例中将是一个
slack处理程序 - 匹配 - 一个用于过滤匹配警报的lambda表达式。默认情况下,所有警报都匹配。
- 选项 - 一组值,因种类而异。
slack处理程序绑定可以定义在yaml或json中,这里使用的是yaml:
topic: cpu
id: slack
kind: slack
options:
channel: '#alerts'
上述处理程序绑定定义定义了一个将警报发送到Slack频道 #alerts 的处理程序。
将上述文本保存为 slack.yaml。
现在新的处理程序可以通过 kapacitor 客户端绑定到主题。
为此,使用 define-topic-handler 命令。它接受一个参数。
$ kapacitor define-topic-handler
Usage: kapacitor define-topic-handler <path to handler spec file>
$ kapacitor define-topic-handler ./slack.yaml
验证处理程序是否按预期定义:
$ kapacitor show-topic-handler cpu slack
最后确认主题已按预期配置:
$ kapacitor show-topic cpu
输出应如下所示:
ID: cpu
Level: OK
Collected: 27
Handlers: [slack]
Events:
Event Level Message Date
cpu:cpu=cpu3,host=localhost OK cpu:cpu=cpu3,host=localhost is OK 23 Jan 17 14:04 MST
就是这样!未来由 cpu_alert 任务触发的警报将通过 cpu 主题发送到 Slack。
总结
虽然在TICKscript中直接定义警报处理程序很简单,但一旦创建了许多任务,跟踪和维护可能会变得繁琐。使用主题将警报的定义与警报的处理解耦。在定义了主题和处理程序绑定后,更改slack频道只需要一次API调用来更新slack处理程序。更重要的是,没有TICKscript需要更改。
进一步了解
链式主题
主题可以通过 publish 操作处理程序链接在一起。这允许将警报进一步分组到不同的主题中。
例如,上述任务可以修改为将警报发送到 system 主题,而不是 cpu 主题。这样,所有与系统相关的警报都可以以一致的方式处理。
新的 TICKscript:
stream
|from()
.measurement('cpu')
.groupBy(*)
|alert()
.warn(lambda: "usage_idle" < 20)
.crit(lambda: "usage_idle" < 10)
// Send alerts to the `system` topic
.topic('system')
要将所有系统警报发送到一个新主题 ops_team,请为 system 主题创建一个新的处理程序。
topic: system
id: publish-to-ops_team
kind: publish
options:
topics:
- ops_team
kapacitor define-topic-handler ./publish-to-ops_team.yaml
由于运维团队有值班轮换,ops_team 主题上的警报处理可以相应地进行设置。
topic: ops_team
id: victorops
kind: victorops
options:
routing-key: ops_team
kapacitor define-topic-handler ./victorops.yaml
现在所有 system 相关的警报都会发送到 ops_team 主题,随后在 Victor Ops 中处理。
匹配条件
匹配条件可以应用于处理程序。
只有符合条件的警报才会被该处理程序处理。
例如,通常仅在警报状态改变时发送Slack消息,而不是每次评估警报时都发送。 修改第一个示例中的slack处理程序定义将导致以下结果:
topic: cpu
id: slack
kind: slack
match: changed() == TRUE
options:
channel: '#alerts'
现在更新处理程序,只有更改状态的警报将发送到Slack。
kapacitor define-topic-handler ./slack.yaml