如何:在 Chronograf 中构建 Flux 查询
作者:David G. Simmons / 产品, 开发者
2018 年 11 月 15 日
导航至
大家可能知道(也可能不知道)(如果您不知道,那您肯定没读过我的帖子!),我构建了一个嵌入式物联网网关概念验证设备,它运行(当然)InfluxDB——实际上是整个 TICK Stack——并从连接的蓝牙、WiFi 和 LoRa 传感器收集数据。
最新版本的 InfluxDB 和 Chronograf 现已推出,并且每个版本都带有 Flux 技术预览版,这是一种用于处理时序数据的新查询语言。我想看看将我用来构建仪表板的查询从 InfluxQL 转换为 Flux 并大致探索该语言本身有多困难,这可能会很有启发意义。现在就开始。
这就是所有传感器数据——好吧,辐射传感器现在已离线——以及它在屏幕上的外观。所有这些仪表板元素都是通过 Chronograf 的 InfluxQL 查询创建和更新的。因此,让我们看看其中的一些查询以及它们在今天的 Chronograf 仪表板构建器中的外观。我们将从左上角的 CO2 读数开始
为了完全清楚:我不需要编写该查询。我只是开始探索数据库,点击测量指标、标签和值,并调整设置,直到获得我想要的视觉效果。非常简单。
因此,让我们尝试使用 InfluxDB 1.7、Chronograf 1.7 并使用新的 Flux 构建器以及模式资源管理器来构建相同的查询
哇!太容易了!
它非常非常相似。在 Flux 示例中,我们首先从哪里获取数据——“from bucket”——然后给出时间间隔,最后按测量指标和字段进行过滤。
接下来,我们将 window(every: autoInterval)
添加到查询中。Flux 的 window()
函数根据时间值对记录进行分组。将 every:
参数与 autoInterval
一起使用,允许 Chronograf 根据可用于可视化结果的屏幕实际面积动态确定窗口大小。
这是最终的 Flux 查询的样子
from ( bucket: "telegraf/autogen" )
|> range(start: dashboardTime)
|> filter (fn: (r) => r._measurement == "k30_reader" and (r_field == "co2" ))
|> window (every: autoInterval)
Flux 接受输入表,执行函数,并生成一个或多个输出表。到目前为止,我们已经定义了一个输入表。现在,我们添加 mean()
聚合函数以获取每个窗口内的平均 CO2 读数。每个窗口都作为输出表返回。通过添加带有 none:true
参数的 group()
函数,我们删除了窗口分区并将聚合组合到单个输出表中。
结果查询如下所示
from(bucket: "telegraf/autogen")
|> range(start: dashboardTime)
|> filter(fn:(r =>r._measurement == "k30_reader" and (r._field == "co2"))
|> window(every: autoInterval)
|> mean()
|> group(none:true)
原始查询使用模板变量 :dashboardTime:
,允许用户通过 Chronograf 中提供的用户界面控件调整查询的时间范围,而无需强制他们重新调整查询本身。Flux 也支持相同的功能。ScriptWizard 默认将其放入 |> range
过滤器中。
现在我们可以通过在 InfluxQL 和 Flux 版本的这些查询之间来回切换来直观地比较结果,以查看它们是否确实产生相同的结果!
FILL 呢?
在 Flux 的技术预览版中,尚未实现填充功能。我们理解这是可视化稀疏数据的重要组成部分,请放心,我们正在努力在未来的更新中实现此功能。