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 使用率最高的五个数据点。
此页面对您有帮助吗?
感谢您的反馈!
支持和反馈
感谢您成为我们社区的一份子!我们欢迎并鼓励您提供关于 InfluxDB 和本文档的反馈和错误报告。要获得支持,请使用以下资源
拥有年度或支持合同的客户 可以 联系 InfluxData 支持。