文档文档

Flux 语法基础

此页面记录了早期版本的 InfluxDB OSS。 InfluxDB OSS v2 是最新的稳定版本。请参阅 InfluxDB v2 文档

Flux 的核心是一种专门为处理数据而设计的脚本语言。本指南将介绍一些简单的表达式以及它们在 Flux 中的处理方式。

使用 influx CLI

在使用本指南时,请在 “Flux 模式” 下使用 influx CLI。当以 -type=flux-path-prefix=/api/v2/query 启动时,influx CLI 是一个交互式的读取-求值-打印循环 (REPL),支持 Flux 语法。

在 Flux 模式下启动 influx CLI
influx -type=flux -path-prefix=/api/v2/query

如果使用 InfluxData 沙箱,请使用 ./sandbox enter 命令进入 influxdb 容器,您可以在其中在 Flux 模式下启动 influx CLI。您还需要将 host 指定为 influxdb 以通过 Docker 网络连接到 InfluxDB。

./sandbox enter influxdb

root@9bfc3c08579c:/# influx -host influxdb -type=flux -path-prefix=/api/v2/query

基本的 Flux 语法

下面的代码块提供了说明 Flux 基本语法的命令。在 influx CLI 的 Flux REPL 中运行这些命令。

简单表达式

Flux 是一种脚本语言,支持基本表达式。例如,简单的加法

> 1 + 1
2

变量

使用赋值运算符 = 将表达式赋值给变量。

> s = "this is a string"
> i = 1 // an integer
> f = 2.0 // a floating point number

键入变量的名称以打印其值

> s
this is a string
> i
1
> f
2

记录

Flux 也支持记录。记录中的每个值可以是不同的数据类型。

> o = {name:"Jim", age: 42, "favorite color": "red"}

使用点表示法访问记录的属性

> o.name
Jim
> o.age
42

方括号表示法

> o["name"]
Jim
> o["age"]
42
> o["favorite color"]
red

使用方括号表示法来引用属性键中包含特殊字符或空格字符的记录属性。

列表

Flux 支持列表。列表值必须是相同的类型。

> n = 4
> l = [1,2,3,n]
> l
[1, 2, 3, 4]

函数

Flux 使用函数来完成大部分繁重的工作。下面是一个简单的函数,用于计算数字 n 的平方。

> square = (n) => n * n
> square(n:3)
9

Flux 不支持位置参数或参数。调用函数时,参数必须始终命名。

管道前向运算符

Flux 广泛使用管道前向运算符 (|>) 将操作链接在一起。在每个函数或操作之后,Flux 返回一个表或包含数据的表集合。管道前向运算符将这些表管道输送到下一个函数,在其中进一步处理或操作它们。

data |> someFunction() |> anotherFunction()

基本语法的实际应用

如果您已经阅读过其他 入门指南,这可能看起来很熟悉。Flux 的语法灵感来自 JavaScript 和其他函数式脚本语言。当您开始在实际用例中应用这些基本原则时,例如创建数据流变量、自定义函数等,Flux 的强大功能及其查询和处理数据的能力将变得显而易见。

下面的示例提供了每个输入命令的多行版本和单行版本。Flux 中的回车符不是必需的,但确实有助于提高可读性。单行和多行命令都可以复制并粘贴到在 Flux 模式下运行的 influx CLI 中。

定义数据流变量

Flux 中变量赋值的常见用例是为一个或多个输入数据流创建变量。

timeRange = -1h

cpuUsageUser =
  from(bucket:"telegraf/autogen")
    |> range(start: timeRange)
    |> filter(fn: (r) =>
      r._measurement == "cpu" and
      r._field == "usage_user" and
      r.cpu == "cpu-total"
    )

memUsagePercent =
  from(bucket:"telegraf/autogen")
    |> range(start: timeRange)
    |> filter(fn: (r) =>
      r._measurement == "mem" and
      r._field == "used_percent"
    )

这些变量可以在其他函数中使用,例如 join(),同时保持语法的简洁和灵活性。

定义自定义函数

创建一个函数,该函数返回输入流中 _value 值最高的 N 行。为此,将输入流 (tables) 和要返回的结果数 (n) 传递到自定义函数中。然后使用 Flux 的 sort()limit() 函数在数据集中查找前 n 个结果。

topN = (tables=<-, n) =>
  tables
    |> sort(desc: true)
    |> limit(n: n)

有关创建自定义函数的更多信息,请参阅 自定义函数 文档。

使用这个新的自定义函数 topN 和上面定义 的 cpuUsageUser 数据流变量,找到前五个数据点并生成结果。

cpuUsageUser
  |> topN(n:5)
  |> yield()

定义数据流变量

Flux 中变量赋值的常见用例是为多个过滤后的输入数据流创建变量。

timeRange = -1h
cpuUsageUser = from(bucket:"telegraf/autogen") |> range(start: timeRange) |> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage_user" and r.cpu == "cpu-total")
memUsagePercent = from(bucket:"telegraf/autogen") |> range(start: timeRange) |> filter(fn: (r) => r._measurement == "mem" and r._field == "used_percent")

这些变量可以在其他函数中使用,例如 join(),同时保持语法的简洁和灵活性。

定义自定义函数

让我们创建一个函数,该函数返回输入数据流中 _value 值最高的 N 行。为此,将输入流 (tables) 和要返回的结果数 (n) 传递到自定义函数中。然后使用 Flux 的 sort()limit() 函数在数据集中查找前 n 个结果。

topN = (tables=<-, n) => tables |> sort(desc: true) |> limit(n: n)

有关创建自定义函数的更多信息,请参阅 自定义函数 文档。

使用 上面 定义的 cpuUsageUser 数据流变量,使用自定义 topN 函数找到前五个数据点并生成结果。

cpuUsageUser |> topN(n:5) |> yield()

此查询将返回过去一小时内用户 CPU 使用率最高的五个数据点。


此页面对您有帮助吗?

感谢您的反馈!


Flux 的未来

Flux 即将进入维护模式。您可以继续按当前方式使用它,而无需对您的代码进行任何更改。

阅读更多

InfluxDB 3 开源版本现已发布公开 Alpha 版

InfluxDB 3 开源版本现已可用于 alpha 测试,根据 MIT 或 Apache 2 许可获得许可。

我们正在发布两个产品作为 alpha 版本的一部分。

InfluxDB 3 Core 是我们的新开源产品。它是一个用于时间序列和事件数据的最新数据引擎。InfluxDB 3 Enterprise 是一个商业版本,它建立在 Core 的基础上,增加了历史查询功能、读取副本、高可用性、可扩展性和细粒度的安全性。

有关如何入门的更多信息,请查看