宣布Flux(以前称为IFQL)v0.0.5版本,新增12+个新功能

导航至

这次发布代表了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 项目 的反馈。