使用filter()函数基于字段、标签或任何其他列值查询数据。filter()执行的操作类似于InfluxQL和其他SQL类似查询语言中的SELECT语句和WHERE子句。
from(bucket: "db/rp")
|> range(start: -1h)
|> filter(fn: (r) =>
r._measurement == "example-measurement" and
r._field == "example-field" and
r.tag == "example-tag"
)
使用 group() 函数根据特定列中具有共同值的数据进行分组。
data
|> group(columns: ["host"], mode: "by")
输入:
| 时间 | 主机 | 值 |
|---|
| 2020-01-01T00:01:00Z | host1 | 1.0 |
| 2020-01-01T00:01:00Z | host2 | 2.0 |
| 2020-01-01T00:02:00Z | 主机1 | 1.0 |
| 2020-01-01T00:02:00Z | host2 | 3.0 |
输出:
| 时间 | 主机 | 值 |
|---|
| 2020-01-01T00:01:00Z | host1 | 1.0 |
| 2020-01-01T00:02:00Z | 主机1 | 1.0 |
| 时间 | 主机 | 值 |
|---|
| 2020-01-01T00:01:00Z | host2 | 2.0 |
| 2020-01-01T00:02:00Z | host2 | 3.0 |
使用sort()函数按特定列对每个表中的记录进行排序,使用limit()函数将输出表中的记录数量限制为固定数量n。
data
|> sort(columns: ["host", "_value"])
|> limit(n: 4)
输入:
| 时间 | 主机 | 值 |
|---|
| 2020-01-01T00:01:00Z | A | 1.0 |
| 2020-01-01T00:02:00Z | B | 1.2 |
| 2020-01-01T00:03:00Z | A | 1.8 |
| 2020-01-01T00:04:00Z | B | 0.9 |
| 2020-01-01T00:05:00Z | B | 1.4 |
| 2020-01-01T00:06:00Z | B | 2.0 |
输出:
| 时间 | 主机 | 值 |
|---|
| 2020-01-01T00:03:00Z | A | 1.8 |
| 2020-01-01T00:01:00Z | A | 1.0 |
| 2020-01-01T00:06:00Z | B | 2.0 |
| 2020-01-01T00:05:00Z | B | 1.4 |
本指南介绍了如何使用Flux对数据进行窗口处理和聚合,并概述了这一过程如何影响您的数据。
data
|> aggregateWindow(every: 20m, fn: mean)
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:00:00Z | 250 |
| 2020-01-01T00:04:00Z | 160 |
| 2020-01-01T00:12:00Z | 150 |
| 2020-01-01T00:19:00Z | 220 |
| 2020-01-01T00:32:00Z | 200 |
| 2020-01-01T00:51:00Z | 290 |
| 2020-01-01T01:00:00Z | 340 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:20:00Z | 195 |
| 2020-01-01T00:40:00Z | 200 |
| 2020-01-01T01:00:00Z | 290 |
| 2020-01-01T01:20:00Z | 340 |
使用 map() 函数重新映射列值并应用数学运算。
data
|> map(fn: (r) => ({ r with _value: r._value * r._value }))
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 2 |
| 2020-01-01T00:02:00Z | 4 |
| 2020-01-01T00:03:00Z | 3 |
| 2020-01-01T00:04:00Z | 5 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 4 |
| 2020-01-01T00:02:00Z | 16 |
| 2020-01-01T00:03:00Z | 9 |
| 2020-01-01T00:04:00Z | 25 |
使用 pivot() 或 join() 和 map() 函数将操作数值对齐为行并计算百分比。
data
|> pivot(rowKey:["_time"], columnKey: ["_field"], valueColumn: "_value")
|> map(
fn: (r) => ({
_time: r._time,
_field: "used_percent",
_value: float(v: r.used) / float(v: r.total) * 100.0,
}),
)
输入:
| 时间 | 字段 | 值 |
|---|
| 2020-01-01T00:00:00Z | 已使用 | 2.5 |
| 2020-01-01T00:00:10Z | 已使用 | 3.1 |
| 2020-01-01T00:00:20Z | 已使用 | 4.2 |
| 时间 | 字段 | 值 |
|---|
| 2020-01-01T00:00:00Z | 总计 | 8.0 |
| 2020-01-01T00:00:10Z | 总计 | 8.0 |
| 2020-01-01T00:00:20Z | 总计 | 8.0 |
输出:
| 时间 | 字段 | 值 |
|---|
| 2020-01-01T00:00:00Z | 使用百分比 | 31.25 |
| 2020-01-01T00:00:10Z | 使用百分比 | 38.75 |
| 2020-01-01T00:00:20Z | 使用百分比 | 52.50 |
使用 increase() 函数来跟踪表中多个列的增加。这函数在追踪随时间循环变化或周期性重置的计数器值时特别有用。
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1 |
| 2020-01-01T00:02:00Z | 2 |
| 2020-01-01T00:03:00Z | 8 |
| 2020-01-01T00:04:00Z | 10 |
| 2020-01-01T00:05:00Z | 0 |
| 2020年1月1日00:06:00Z | 4 |
输出:
| 时间 | 值 |
|---|
| 2020年01月01日T00:02:00Z | 1 |
| 2020-01-01T00:03:00Z | 7 |
| 2020-01-01T00:04:00Z | 9 |
| 2020-01-01T00:05:00Z | 9 |
| 2020-01-01T00:06:00Z | 13 |
使用 movingAverage() 或 timedMovingAverage() 函数返回数据的移动平均值。
data
|> movingAverage(n: 3)
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1.0 |
| 2020-01-01T00:02:00Z | 1.2 |
| 2020-01-01T00:03:00Z | 1.8 |
| 2020-01-01T00:04:00Z | 0.9 |
| 2020-01-01T00:05:00Z | 1.4 |
| 2020-01-01T00:06:00Z | 2.0 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:03:00Z | 1.33 |
| 2020-01-01T00:04:00Z | 1.30 |
| 2020-01-01T00:05:00Z | 1.36 |
| 2020-01-01T00:06:00Z | 1.43 |
data
|> timedMovingAverage(every: 2m, period: 4m)
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1.0 |
| 2020-01-01T00:02:00Z | 1.2 |
| 2020-01-01T00:03:00Z | 1.8 |
| 2020-01-01T00:04:00Z | 0.9 |
| 2020-01-01T00:05:00Z | 1.4 |
| 2020-01-01T00:06:00Z | 2.0 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:02:00Z | 1.000 |
| 2020-01-01T00:04:00Z | 1.333 |
| 2020-01-01T00:06:00Z | 1.325 |
| 2020-01-01T00:06:00Z | 1.150 |
使用 derivative() 函数计算后续值之间的变化率或使用 aggregate.rate() 函数计算每个时间窗口的平均变化率。如果点之间的时间变化,这些函数会将点标准化为一个公共时间间隔,使得值易于比较。
data
|> derivative(unit: 1m, nonNegative: true)
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:00:00Z | 250 |
| 2020-01-01T00:04:00Z | 160 |
| 2020-01-01T00:12:00Z | 150 |
| 2020-01-01T00:19:00Z | 220 |
| 2020-01-01T00:32:00Z | 200 |
| 2020-01-01T00:51:00Z | 290 |
| 2020-01-01T01:00:00Z | 340 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:04:00Z | |
| 2020-01-01T00:12:00Z | |
| 2020-01-01T00:19:00Z | 10.0 |
| 2020-01-01T00:32:00Z | |
| 2020-01-01T00:51:00Z | 4.74 |
| 2020-01-01T01:00:00Z | 5.56 |
import "experimental/aggregate"
data
|> aggregate.rate(every: 20m, unit: 1m)
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:00:00Z | 250 |
| 2020-01-01T00:04:00Z | 160 |
| 2020-01-01T00:12:00Z | 150 |
| 2020-01-01T00:19:00Z | 220 |
| 2020-01-01T00:32:00Z | 200 |
| 2020-01-01T00:51:00Z | 290 |
| 2020-01-01T01:00:00Z | 340 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:20:00Z | |
| 2020-01-01T00:40:00Z | 10.0 |
| 2020-01-01T01:00:00Z | 4.74 |
| 2020-01-01T01:20:00Z | 5.56 |
使用 histogram() 函数创建累积直方图与 Flux。
data
|> histogram(
column: "_value",
upperBoundColumn: "le",
countColumn: "_value",
bins: [100.0, 200.0, 300.0, 400.0],
)
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:00:00Z | 250.0 |
| 2020-01-01T00:01:00Z | 160.0 |
| 2020-01-01T00:02:00Z | 150.0 |
| 2020-01-01T00:03:00Z | 220.0 |
| 2020-01-01T00:04:00Z | 200.0 |
| 2020-01-01T00:05:00Z | 290.0 |
| 2020-01-01T01:00:00Z | 340.0 |
输出:
| le | 值 |
|---|
| 100.0 | 0.0 |
| 200.0 | 3.0 |
| 300.0 | 6.0 |
| 400.0 | 7.0 |
使用 fill() 函数替换 null 值。
data
|> fill(usePrevious: true)
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 空 |
| 2020-01-01T00:02:00Z | 0.8 |
| 2020-01-01T00:03:00Z | 空 |
| 2020-01-01T00:04:00Z | 空 |
| 2020-01-01T00:05:00Z | 1.4 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 空 |
| 2020-01-01T00:02:00Z | 0.8 |
| 2020-01-01T00:03:00Z | 0.8 |
| 2020-01-01T00:04:00Z | 0.8 |
| 2020-01-01T00:05:00Z | 1.4 |
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 空 |
| 2020-01-01T00:02:00Z | 0.8 |
| 2020-01-01T00:03:00Z | 空 |
| 2020-01-01T00:04:00Z | 空 |
| 2020-01-01T00:05:00Z | 1.4 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 0.0 |
| 2020-01-01T00:02:00Z | 0.8 |
| 2020-01-01T00:03:00Z | 0.0 |
| 2020-01-01T00:04:00Z | 0.0 |
| 2020-01-01T00:05:00Z | 1.4 |
使用median()函数返回表示输入数据的0.5分位数(第50百分位数)或中位数的值。
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1.0 |
| 2020-01-01T00:02:00Z | 1.0 |
| 2020-01-01T00:03:00Z | 2.0 |
| 2020-01-01T00:04:00Z | 3.0 |
使用quantile()函数返回输入数据中所有位于q分位数或百分位数的值。
data
|> quantile(q: 0.99, method: "estimate_tdigest")
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1.0 |
| 2020-01-01T00:02:00Z | 1.0 |
| 2020-01-01T00:03:00Z | 2.0 |
| 2020-01-01T00:04:00Z | 3.0 |
本指南将介绍如何使用Flux连接数据,并概述这一过程中如何处理您的数据。
t1 = from(bucket: "example-bucket")
|> range(start: 2020-01-01T00:00:00Z)
|> filter(fn: (r) => r.m == "foo")
t2 = from(bucket: "example-bucket")
|> range(start: 2020-01-01T00:00:00Z)
|> filter(fn: (r) => r.m == "bar")
join(tables: {t1: t1, t2: t2}, on: ["_time"])
输入:
t1
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1 |
| 2020-01-01T00:02:00Z | 2 |
| 2020-01-01T00:03:00Z | 1 |
| 2020-01-01T00:04:00Z | 3 |
t2
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 5 |
| 2020-01-01T00:02:00Z | 2 |
| 2020-01-01T00:03:00Z | 3 |
| 2020-01-01T00:04:00Z | 4 |
输出:
| 时间 | 值_t1 | 值_t2 |
|---|
| 2020-01-01T00:01:00Z | 1 | 5 |
| 2020-01-01T00:02:00Z | 2 | 2 |
| 2020-01-01T00:03:00Z | 1 | 3 |
| 2020-01-01T00:04:00Z | 3 | 4 |
使用cumulativeSum()函数计算值的累计总和。
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1 |
| 2020-01-01T00:02:00Z | 2 |
| 2020-01-01T00:03:00Z | 1 |
| 2020-01-01T00:04:00Z | 3 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1 |
| 2020-01-01T00:02:00Z | 3 |
| 2020-01-01T00:03:00Z | 4 |
| 2020-01-01T00:04:00Z | 7 |
使用 first() 或 last() 函数来返回输入表格中的第一个或最后一个点。
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1.0 |
| 2020-01-01T00:02:00Z | 1.0 |
| 2020-01-01T00:03:00Z | 2.0 |
| 2020-01-01T00:04:00Z | 3.0 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1.0 |
输入:
| 时间 | 值 |
|---|
| 2020-01-01T00:01:00Z | 1.0 |
| 2020-01-01T00:02:00Z | 1.0 |
| 2020-01-01T00:03:00Z | 2.0 |
| 2020-01-01T00:04:00Z | 3.0 |
输出:
| 时间 | 值 |
|---|
| 2020-01-01T00:04:00Z | 3.0 |
使用 Flux exists 操作符检查记录是否包含一个键,或者该键的值是否为 null。
过滤空值
data
|> filter(fn: (r) => exists r._value)
使用Flux流和表函数从Flux查询输出中提取标量值。这使您可以通过查询结果动态设置变量。
scalarValue = {
_record =
data
|> tableFind(fn: key => true)
|> getRecord(idx: 0)
return _record._value
}
使用Flux处理和操作时间戳。
Flux 提供了多个函数来帮助监控数据中的状态和状态变化。
Flux sql 包提供了用于处理 SQL 数据源的函数。使用 sql.from() 查询像 PostgreSQL 和 MySQL 这样的 SQL 数据库。
import "sql"
sql.from(
driverName: "postgres",
dataSourceName: "postgresql://user:password@localhost",
query: "SELECT * FROM example_table",
)
本指南描述了如何使用Flux条件表达式,例如if、else和then,来查询和转换数据。Flux从左到右评估语句,一旦条件匹配就停止评估。
if color == "green" then "008000" else "ffffff"
本指南介绍了在Flux函数的评估逻辑中使用正则表达式。
data
|> filter(fn: (r) => r.tag =~ /^foo[1-3]/)
输入:
| 时间 | 标签 | 值 |
|---|
| 2020-01-01T00:01:00Z | foo1 | 1.0 |
| 2020-01-01T00:02:00Z | foo5 | 1.2 |
| 2020-01-01T00:03:00Z | bar3 | 1.8 |
| 2020-01-01T00:04:00Z | foo3 | 0.9 |
| 2020-01-01T00:05:00Z | foo2 | 1.4 |
| 2020-01-01T00:06:00Z | bar1 | 2.0 |
输出:
| 时间 | 标签 | 值 |
|---|
| 2020-01-01T00:01:00Z | foo1 | 1.0 |
| 2020-01-01T00:04:00Z | foo3 | 0.9 |
| 2020-01-01T00:05:00Z | foo2 | 1.4 |
使用 Flux Geo 包过滤地理时间数据,并按地理位置或轨迹进行分组。
import "experimental/geo"
sampleGeoData
|> geo.filterRows(region: {lat: 30.04, lon: 31.23, radius: 200.0})
|> geo.groupByArea(newColumn: "geoArea", level: 5)
本指南介绍了如何在Chronograf仪表板单元中使用Flux查询、可用的模板变量以及如何使用它们。