宣布 Flux(原 IFQL)—— InfluxDB 的新查询语言和引擎

导航至

IFQL

今天我们发布了 IFQL 或 Influx Query Language 的早期 alpha 版本。[这后来被重命名为 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), *

我们的目标是创建一种与时间序列数据更自然配合的语言。我们觉得函数式编程范式与您想要做的事情更接近,而不是 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仓库以获取设置说明。