如何在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 Builder和模式浏览器来构建相同的查询
哇!这太简单了!
非常相似。在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功能。我们理解这是可视化稀疏数据的重要部分,请放心,我们正在努力在未来的更新中实现这一功能。