在 InfluxDB Cloud 中编写任务和设置警报
作者:Faith Chikwekwe / 用例,产品,开发者
2020年5月7日
导航至
(更新:InfluxDB 3.0 已移除 Flux 和内置任务引擎。用户可以使用基于 Python 的外部工具,如 Quix,在 InfluxDB 3.0 中创建任务。)
如果您正在使用 InfluxDB 监控数据和系统,那么警报可能是您工作流程中不可或缺的一部分。我们目前有一个系统用于监控数据,无论其处于临界或非临界状态。
在这里,我将详细介绍如何使用我们的 InfluxDB Cloud 产品设置警报,以及一些使用警报的最佳实践,以获得良好的体验。
我们将使用 Flux 脚本语言,使编写任务和了解我们为警报设置的检查变得非常容易。
对于本教程,假设您对监控和接收水果收藏公司警报感兴趣。您可能需要考虑收集水果的数量和您收集水果的农场。您还想知道当收集水果的数量出现关键下降时。在完成本教程的过程中,您需要牢记此类信息。
步骤 1:编写您的 Flux 查询
警报的有效性取决于您编写的 Flux 查询。登录 InfluxDB Cloud 后,我喜欢首先使用数据探索器或 VSCode 中的 Flux 插件来检查数据的初始形状。
如果您使用数据探索器,查询构建器可以帮助您查看可用的桶、字段和度量。最终,您可能想要切换到使用脚本编辑器来编写更复杂的查询。
您将把这个查询转换成任务。您还可能想要可视化查询/任务输出,以便了解您得到了什么。为此,您可能需要考虑保留可能帮助您了解为什么指标从临界状态变为非临界状态或反之的信息列。
例如,如果您有如下列的初始数据
_start, _stop, _time, _field,_measurement,farmName
您可能希望能够通过查看 totalFruitsCollected
测量值来监控每小时收集的总水果数量,同时保留 farmName
列可能有助于您之后可视化哪些农场的产量有所增加或减少。
通常,能够很好地转化为任务和警报的 Flux 查询会使用 aggregateWindow()
函数对数据进行窗口化处理,以考察时间间隔内的变化。
对于我们的水果收集示例,一个简单的查询可能如下所示
from(bucket: "farming")
|> range(start: v.timeRangeStart, stop: v.timeRangeStop)
|> filter(fn: (r) => (r._measurement == "totalFruitsCollected))
|> filter(fn: (r) => (r._field == "fruits))
|> group(columns: ["farmName"])
|> aggregateWindow(fn: sum, every: 1h)
|> map(fn: (r) => {
return: _time: r._time, _stop: r._stop, _start: r._start, _measurement: "fruitCollectionRate", _field: "fruits", _value: r._value, farmName: farmName,
}
})
请注意,由于 aggregateWindow()
函数会消除所有列(除了 _time
、_stop
、_start
和 _value
),我们必须使用 map()
函数来恢复我们的其他列。
步骤 2:将您的 Flux 查询转换为任务
任务是一个按计划运行的 Flux 查询。为此,一旦您查询了正确的数据,将您的查询转换为任务就相当直接了。
在 InfluxDB Cloud 中,您可以使用“另存为任务”选项来转换您的查询。在此对话框中,您需要为该任务提供一个 every
参数(可能还需要一个偏移量)。保存后,我建议您在任务页面上找到您的任务,并将 range()
函数更新为使用我们的 task.every
参数而不是内置的 start
和 stop
值。我们将使用一个负值,这样每次任务运行时都会查看该时间间隔。
task.every
通常也用作 aggregateWindow()
函数的窗口。这会因情况而异,但您需要记住所选间隔内将写入多少数据,并据此做出决定。
我们的水果收集公司每小时收集数百个水果。我们希望能够以 1 小时的时间间隔查看水果收集情况。
接下来,您需要更新。我还会更新 aggregateWindow()
函数以使用我的 task.every
值。
为了保留任务的结果,我将使用 to()
函数将我的新的 fruitCollectionRate
测量值写回到 farming
象限。这样我就可以访问我的仪表板和我的通知检查所需的数据。
我的任务最终将如下所示
option task = {name: "fruitCollectedRate", every: 1h}
fruitCollected = from(bucket: "farming")
|> range(start: -task.every)
|> filter(fn: (r) => (r._measurement == "totalFruitsCollected))
|> filter(fn: (r) => (r._field == "fruits))
|> group(columns: ["farmName"])
|> aggregateWindow(fn: sum, every: task.every)
|> map(fn: (r) => {
return: _time: r._time, _stop: r._stop, _start: r._start, _measurement: "fruitCollectionRate", _field: "fruits", _value: r._value, farmName: farmName,
}
})
fruitCollected
|> to(bucket: "farming")
请注意,您不需要添加如上所示的任务变量。如果您通过 UI 将任务名称和 every 值添加到文本框中,系统将为您添加变量。
步骤 3:创建仪表板以可视化任务输出
这一步是可选的,但在设置警报之前验证任务是否正常运行是一个很好的方法。
您可以去仪表板标签页并点击创建仪表板。如果您正在监控关于水果的额外指标,如 badApplesPerBunch
或 rateOfLifeGivingLemons
,您也可以将它们添加到这个仪表板中。
我查看任务输出数据的简单查询可能如下所示
from(bucket: "farming")
|> range(start: -task.every)
|> filter(fn: (r) => (r._measurement == "fruitCollectionRate"))
|> filter(fn: (r) => (r._field == "fruits"))
有许多技巧可以更有趣地可视化这些数据,但目前的这种方法效果不错。因为我们保留了farmName
并以此分组,每个农场在输出流中都有自己的表格,在结果图上也有自己的行,这使我们能够更详细地了解情况。
步骤 4:创建检查您的警报
除了编写一个格式良好的查询外,设置一个良好校准的检查是编写良好警报最重要的部分。在大多数情况下,这将会是一个迭代的过程。您想要确保关键警报不会过于频繁地发出,但一旦有问题发生,它们会迅速通知接收者。
当收集中心的果实不足时,我们需要收到警报。假设当任何农场在1小时内收集的果实少于20个时,我们的操作是关键的。
转到“监控和警报”选项卡,然后在“检查”列中创建一个警报。我们现在将使用阈值检查。您将使用此处的UI在farming
桶中查找,根据fruitCollectionRate
测量值和“fruits”字段进行筛选。您还可以使用UI进行进一步筛选并设置aggregateFunction
。一旦构建了您的阈值查询,让我们配置检查。
在这里设置一个标签以关联您的通知规则非常重要。标签确保您发出的警报会发送给正确的接收者。我只希望当事情变得关键时,头收集者会受到警报。我将我的标签设置为role
== headCollector
。
您还可以在此处配置您的状态消息。记得我们保留了farmName
吗?让我们将这一列添加到状态消息中,这样头收集者就知道哪个农场存在收集问题。
Check: ${ r._check_name } is: ${ r._level }. ${ r.farmName } is below collection threshold.
对于我的检查:当值低于20时,设置状态为CRI
。
步骤 5:设置通知端点
这是警报将发送给接收者的方式。设置一个用于此目的的Slack webhook非常容易。对于付费InfluxDB Cloud用户,还有其他选项,如PagerDuty或设置自己的HTTP端点。
命名您的端点,然后添加URL和其他必要参数。
步骤 6:为您的警报创建通知规则
最后,我们准备开始发送有关您数据的通知。在我们的用途中,我们只关心关键警报。我们希望每小时发送一次有关果实收集情况的警报。
记住,在此处添加您的标签,role == headCollector
。任何带有匹配标签的检查都将使用此通知规则发出。我将通过Slack向我的头收集者发送警报。我将从下拉菜单中选择正确的端点。如果您愿意,您还可以进一步自定义您的消息模板。
当您单击创建通知规则时,您应该可以正常工作。现在,每次您达到关键状态时,您都会得到通知。
有关警报的更多学习资源
如果您需要更多有关警报如何工作的信息,请查看此处文档。有关编写良好查询和任务的信息,请参阅Flux文档。以下是一篇之前的博客,提供了我们警报系统的另一个概述。如果您对设置警报有任何疑问,请加入我们的社区Slack频道或在我们的社区论坛中发布。