Writing Tasks and Setting Up Alerts for InfluxDB Cloud

导航至

更新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 参数,而不是内置的 startstop 值。我们将使用负值,以便我们在每次任务运行时回顾该时间间隔。

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:创建仪表板以可视化您的任务输出

此步骤是可选的,但它是验证您的任务是否在设置警报之前正常运行的好方法。

您可以转到“仪表板”选项卡,然后单击以创建仪表板。如果您有其他关于水果的监控指标,例如 badApplesPerBunchrateOfLifeGivingLemons,您也可以将它们添加到此仪表板。

我的简单查询,用于查看我的任务的输出数据可能如下所示

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 测量值和“水果”字段。您还可以使用 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 频道或在我们的 社区论坛中发布它们。