发布 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 操作,它看起来像这样

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)

top 函数定义为具有三个参数 ncolstable

n 参数指定结果应包含多少条记录。

cols 参数指定要对其进行表排序的列列表——默认值为 ["_value"]

table 参数是要应用操作的源表。表的默认值是特殊的 <- 语法,这意味着它来自管道前向 |> 运算符的左侧结果。

函数体只是使用提供的参数从表中链接 sort 和 limit 函数。

此版本中的许多新函数都是使用类似的策略实现的。如果您想了解有关这些更高级功能的更多信息,请查看 Flux README,因为它详细介绍了这里正在发生的事情。此外,你们中的一些人可能会担心将 top 实现为 sort 和 limit 操作既昂贵又缓慢。您是对的,但请不要担心,因为查询规划器能够找到这些类型的模式,并使用高效的专用实现来重写它们。

我想重点介绍此版本中的另一个新函数,即 percentile 函数。长期以来,一直有 功能请求,希望能够使用近似方法而不是计算精确值来更有效地计算百分位数。

默认情况下,Flux percentile 函数将返回 t-digest 近似值,除非明确要求计算精确的百分位数。t-digest 是一种用于近似百分位数的有效且准确的方法。使用 Flux,默认情况下将通过返回良好的近似值来有效地计算结果,并在明确请求时返回精确的结果。

这是一个繁忙的版本,其中包含许多重要的新增功能和开发——查看完整的 CHANGELOG 以获取所有详细信息。感谢所有在本周的设计过程中贡献宝贵意见的人。我们很高兴听到您对 Github 项目的反馈。