如何在Chronograf中构建Flux查询

导航到

你们可能都知道(如果不知道,那你没看我的帖子!),我构建了一个嵌入式物联网网关原型设备,它当然运行的是InfluxDB——实际上整个TICK Stack——并从连接的蓝牙、WiFi和LoRa传感器收集数据。

InfluxDB和Chronograf的最新版本现已发布,并且每个版本都包含Flux的技术预览,这是处理时间序列数据的新查询语言。我想看看将我用于构建仪表板的查询从InfluxQL转换为Flux有多难,以及一般探索这个语言。所以,就这样开始了。

仪表板

这就是所有的传感器数据——嗯,辐射传感器现在离线了——以及它在屏幕上的样子。仪表板上的每个元素都是通过Chronograf的InfluxQL查询创建和更新的。让我们看看一些查询,以及它们在今天的Chronograf仪表板构建器中的样子。我们先从左上角的CO2读数开始

为了说得清楚:我并不需要写那个查询。我只是开始探索数据库,点击测量值、标签和值,调整设置,直到得到我想要的可视化效果。很简单。

现在让我们尝试使用InfluxDB 1.7、Chronograf 1.7以及新的Flux Builder和模式浏览器来构建相同的查询

Flux Query

哇!这太简单了!

非常相似。在Flux示例中,我们首先确定数据来源——即“从桶中”,然后给出时间间隔,最后根据测量值和字段进行过滤。

接下来,我们在查询中添加了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也支持这种功能。脚本向导默认将其放入|> range过滤器中。

现在,我们可以通过在InfluxQL和Flux版本之间切换这些查询来直观地比较结果,以看到它们确实产生了相同的结果!

关于FILL怎么办?

在Flux的技术预览中,尚未实现fill功能。我们理解这是可视化稀疏数据的重要部分,请放心,我们正在努力在未来的更新中实现这一功能。