Flux 是什么
Flux 是 InfluxDB 2.x 的管道式查询语言:from 选择 bucket,range 限定时间范围,filter 用 lambda 表达式过滤记录,后面再接 group、aggregateWindow、mean 等函数处理。每个 |> 把上一步的结果交给下一步,因此把 range 放在管道前段是性能优化的第一原则。
基本信息
| 结构 | from(bucket:) |> range(start:) |> filter(fn:) |> … |
|---|---|
| 常用函数 | filter、group、aggregateWindow、mean、sum、count、last、pivot |
| 过滤写法 | filter(fn: (r) => r._measurement == "cpu" and r.host == "web-1") |
| 系统列 | 下划线开头:_measurement、_field、_value、_time、_start、_stop |
| 适用版本 | InfluxDB 2.x;1.x 使用 InfluxQL |
典型使用场景
- 按时间范围查指标并计算均值、最大值
- 多维度分组统计:按 host、region 分别聚合
- 数据下采样:把原始精度聚合成小时或天级
- 结果整形:用 pivot 把字段列转成表格结构
- 为定时任务与告警规则提供查询逻辑
常用查询
常用查询
from(bucket: "metrics")
|> range(start: -1h) // 时间范围,尽量放前面
|> filter(fn: (r) => r._measurement == "cpu") // 先缩小 measurement
|> filter(fn: (r) => r._field == "usage") // 指定要聚合的字段
|> filter(fn: (r) => r.host == "web-1") // 标签过滤
|> mean() // 聚合计算
// 多维度分组统计
from(bucket: "metrics")
|> range(start: -6h)
|> filter(fn: (r) => r._measurement == "cpu" and r._field == "usage")
|> group(columns: ["host"])
|> mean()管道函数读法
| 函数 | 作用 | 注意 |
|---|---|---|
| from | 选择数据来源 bucket | 必须先于其他操作 |
| range | 限定时间范围 | 越靠前越好,靠后会放大扫描量 |
| filter | 用 lambda 过滤记录 | == 比较对类型敏感 |
| group | 按列分组后聚合 | 不写 group 时按默认分组键聚合 |
| aggregateWindow | 按固定时间窗口聚合 | 窗口按 UTC 对齐,可用 offset 调整 |
下划线开头的列是系统列:_measurement、_field、_value、_time、_start、_stop;标签列名不带下划线。把 measurement 与 field 的过滤写在管道前段,能显著减少后续处理的数据量。
想在同一查询里同时输出原始点与聚合结果,要用两个分支管道分别 yield 并命名,否则结果会在同一个表流里混在一起;yield 的名字会出现在返回结果中,方便上层区分用途。
Flux 返回的是表流:分组键不同的数据会拆成多张表。在图表工具里看到多条曲线,通常是分组键不同造成的,而不是数据被重复写入,先看 group 与标签再判断。
时间范围内的数据量决定了查询代价,不加 range 或把范围放得过宽会扫描大量数据点;在仪表盘上按秒刷新时应把 range 收紧到画布实际需要的时间窗,而不是统一用很大的起始范围。