宣布Flux(以前称为IFQL)v0.0.5版本,新增12+个新功能
由Nathaniel Cook / 产品,开发者
2018年2月27日
导航至
这次发布代表了Flux的重大飞跃。
在发布周期的第一阶段,我们专注于在Flux中规范查询操作的链式调用方式。完成之后,我们尝试了它,并很快发现通过组合现有函数很容易向Flux中添加新函数。我们仅使用Flux代码就添加了近十个函数——不需要Go代码。此外,我们还添加了一些由专门Go实现支持的新函数。
这次发布的新函数包括
- top
- bottom
- highestMax
- highestAverage
- highestCurrent
- lowestMin
- lowestAverage
- lowestCurrent
- stateCount
- stateDuration
- distinct
- percentile
- median
从这份列表中,只有stateCount、stateDuration、percentile和distinct需要专门的Go实现。其余都是纯Flux函数。
这一大批函数部分得益于我们对Flux中函数链式调用方式的规范化。每个查询函数都接受一个表对象并返回一个表对象。为了链式调用它们,函数通过使用前一个函数的返回值来调用。
例如,要将范围操作链式连接到from操作,它看起来像这样
range(table:from(db:"telegraf"), start:-1m)
以这种方式嵌套函数可能会产生一个非常长的查询,难以阅读,甚至更难调试。这就是我们引入新语法的原因,以使描述这些操作链更容易。管道向前运算符看起来像这样 |>
允许通过将左侧的结果传递到右侧函数调用来链式调用函数。
// These two lines are equivalent
range(table:from(db:"telegraf"), start:-1m)
from(db:"telegraf") |> range(start: -1m)
然后,要应用上述操作的过滤器,只需添加一个新的|>
和filter
函数调用。
from(db:"telegraf") |> range(start: -1m) |> filter(fn: (r) => r._measurement == "mem")
通过使用这个简单的模型,可以轻松地将新函数添加到语言中(无论是内置的还是由用户添加的),这些函数实际上只是现有函数的组合。例如,top操作是sort和limit操作的组合。因此,top函数可以使用以下小的Flux代码片段实现:
top = (n, cols=["_value"], table=<-) =>
table
|> sort(cols:cols, desc:true)
|> limit(n:n)
顶级函数定义为具有三个参数: n
、 cols
和 table
。
n
参数指定结果应包含的记录数。
cols
参数指定对表格进行排序的列列表——默认值为 ["_value"]
。
table
参数是应用操作的源表。默认值是特殊的 <-
语法,表示它来自管道操作符 |>
的左侧结果。
函数体只是简单地使用提供的参数在表上链式调用排序和限制函数。
本发行版中的许多新功能都采用了类似的策略实现。如果您想了解更多关于这些更高级功能的信息,请查看 Flux 的 README,它详细说明了这里正在发生的事情。此外,有些人可能担心将 top
实现为排序和限制操作既昂贵又慢。您是对的,但不用担心,查询规划器能够找到这些类型的模式,并使用高效的专用实现来重写它们。
我想强调本发行版中另一个新功能,即 percentile
函数。长期以来,人们一直希望 请求这个功能,能够通过近似方法而不是计算精确值来更有效地计算百分位数。
Flux 百分位数函数默认将返回一个 t-digest 近似值,除非明确要求计算精确百分位数。t-digest 是一种高效且精确的近似百分位数的方法。使用 Flux,默认将计算高效的结果,通过返回良好的近似值,并在特定请求时返回精确结果。
这是一个充满活力的版本,添加了很多优秀的功能和开发——查看完整的 CHANGELOG 了解所有详细信息。感谢本周在整个设计过程中提供宝贵意见的所有人。我们期待听到您对 Github 项目 的反馈。