Flux 语法基础
Flux 在其核心是一个专为处理数据而设计的脚本语言。 本指南介绍了一些简单的表达式及其在 Flux 中的处理方式。
简单表达式
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使用率最高的五个数据点。