宣布 Flux (前身 IFQL) - InfluxDB 的全新查询语言和引擎

导航至

IFQL

今天,我们发布了 IFQL 或 Influx 查询语言的早期 alpha 版本。[此后更名为 Flux,以下均称为 Flux]。这是一种全新的查询语言和执行引擎,可与 InfluxDB 1.4 开箱即用。它作为一个独立的二进制文件实现,与 InfluxDB 并行运行。这代表了自两年多前发布 0.9 版本以来 InfluxDB API 的最大进步。然而,与之前的版本不同,此版本与最新的 InfluxDB 兼容。

作为一种语言,Flux 看上去与 JavaScript 非常相似。它是一系列像您在 jQuery 或 D3 代码中看到的那样相互链接的函数。这是一个查询示例

select(db:"foo")
 .where(exp:{"_measurement"=="cpu" AND 
             "_field"=="usage_system" AND 
             "service"=="app-server"})
 .range(start:-12h)
 .window(every:10m)
 .max()

该查询等同于此 InfluxQL 查询

SELECT max(usage_system)
FROM "foo".."cpu"
WHERE "service" = 'app-server'
 AND time > now() - 12h
GROUP BY time(10m), *

我们使用 Flux 的目标是创建一种更自然地处理时间序列数据的语言。我们认为,与 SQL 相比,函数式范式更贴近您想要执行的操作类型。我们从 Python 中的 Pandas 或 R 中的 Tidyverse 项目中汲取了灵感。数据帧从一个函数传递到另一个函数,每个函数都对其执行一些操作。当然,底层的实现细节有所不同,但从概念上讲,用户可以这样理解它。

这些函数具有命名参数。这使其不易出错,并使代码更易于使用。使用位置参数,您最终需要查找函数定义才能找出每个参数的用途。此外,使用命名参数,您可以在将来向函数添加参数,而不会破坏现有的客户端代码。

where 函数具有用于指定谓词的特殊表达式语言。这是我们没有采用纯函数式方法的地方之一。相反,我们选择了这种谓词语言,它看起来像 SQL 中的 where 子句。对于客户端库作者或构建者,我们将添加功能以将此谓词指定为 JSON 对象。使用这种特殊语言进行类型输入和阅读都更容易。

目标不是创建最简洁的语言。当然,某些查询将比其 InfluxQL 或 PromQL 等效项更冗长。我们的目标是设计可读性、灵活性和可扩展性。可以在不更改语言本身语义的情况下引入新函数。

Flux 将查询引擎与存储层解耦。我们的目标是能够动态启动新的查询处理器,这些处理器可以从任意数量的 InfluxDB 节点拉取数据。这也为未来工作负载隔离和可以在数据库外部运行的数据科学任务打开了大门。

今天您可以使用 Flux 完成某些在 InfluxQL 中无法完成的查询。例如,HAVING 查询

select(db:"foo")
 .where(exp:{"_measurement"=="foo"})
 .range(start:-12h)
 .window(every:10m)
 .sum()
 .where(exp:{$ > 100}) // this is the having

或跨测量进行数学运算

// math across measurements, or dbs
var a = select(db:"foo").where(exp:{"_measurement"=="foo"}).last()
var b = select(db:"foo").where(exp:{"_measurement"=="bar"}).last()

b.join(on:["host"], exp: {$ + a})

在 Flux 中,一切都表示为标签键/值对。因此,可以通过特殊的 _measurement 和 _field 键访问测量名称和字段名称。这种结构也是 Prometheus 在底层所呈现的样子。

该示例还表明 Flux 具有可以赋值的变量。这类似于 Kapacitor 中提供的功能。

我们对 Flux 的目标是,无论您是在数据库上执行交互式查询,还是在 Kapacitor 中运行处理或监控和警报任务,它都将成为可以在整个平台中使用的一种语言。

我们使用 Flux 的另一个设计目标是将查询语言与执行引擎解耦。当 Flux 被解析时,它会被构建成一个可以表示为 JSON 的 DAG。我们将构建 InfluxQL、TICKscript 和(可能)PromQL 的解析器,以在 Flux 引擎之上运行。这意味着新引擎将适用于 SQL 风格的查询或新的 Flux 语言,这两种语言都将在 Flux 准备好投入生产时迎来大部分新功能。

我们今天将开源该项目,并发布 Docker 镜像以及 deb 和 rpm 软件包的初始版本。代码已上传 到 Github 的 Flux 仓库。它在 AGPL V3 许可或通过我们的商业许可下获得许可。我们将以与 MongoDB 处理其 AGPL 许可非常相似的方式处理它。我们希望使新项目和初创公司能够免费使用该软件,同时也使我们自己能够通过托管服务盈利。基本上,如果您不是将其作为服务托管给您的用户,那么您可以免费使用它,但是如果您计划像托管提供商一样将其作为服务托管,那么您需要获得商业许可,除非您想开源您的托管平台代码。我们之所以选择这种方式,是因为 我们看到开源基础设施领域正在发生的事情。因此,这是一种双重许可模式:AGPL 适用于免费开源用户,商业许可适用于需要它的用户。

在接下来的几个月中,我们将在 Chronograf 中添加 Flux 查询构建器。我们将不断向 Flux 添加功能,并定期发布。

我们希望获得社区的反馈,并在 API 上进行迭代。我们的目标是在明年年初锁定它,以便我们可以转向真正的生产就绪版本。有关该语言的更多详细信息,您可以阅读 Flux 规范 的早期草稿。此版本绝非完整,我们每天都在添加内容。我们正在跟踪还需要连接哪些额外的 查询功能

与此同时,请访问 Flux 仓库,获取有关如何设置它的说明