InfluxDB - 使用 Flux 按系列数限制查询结果

Posted

技术标签:

【中文标题】InfluxDB - 使用 Flux 按系列数限制查询结果【英文标题】:InfluxDB - limit query result by number of series using Flux 【发布时间】:2021-06-26 11:26:03 【问题描述】:

我正在尝试使用 Flux 查询我的 InfluxDB (1.8) 并仅检索 100 个系列,起初我认为“限制”功能会做到这一点,但是,我发现它只限制了每个表中的记录数(series) 这可能导致 max(100) * N(series)。 然后我尝试了一种解决方法:

from(bucket: "bucket")
 |> range(start:1970-01-01T00:00:00Z)
 |> filter(fn: (r) => (r["_measurement"] == "measurement" ))
 |> group()
 |> limit(n:100)
 |> group(columns:["column1","column2"])

这样做,我可以将所有结果分组到一个表中并限制结果,但是,它甚至不接近我需要的结果。 我只检索了 100 分,并且也失去了按列重新组合的能力。 我知道使用 InfluxQL 的“SLIMIT”功能是可以做到的。

关于如何使用通量查询语言实现这一目标有什么想法吗? 谢谢!

【问题讨论】:

【参考方案1】:

我遇到了一些问题,确实在网上没有找到解决方案。

现在经过一些测试,我发现了一个可能会有所帮助的 hacky 解决方案。正如我从 influxdb 中了解到的那样,一个表中不能有多个标签值……左右。因此,在分组后,您有许多表,其中包含一些甚至只有一个值。

所以,我所做的就是在不丢失标签的情况下摆脱标签 - 这似乎有点 hacky:将标签移动到 _field,放下它并完成。

这里是一个例子:

from(bucket: "current")
  |> range(start: v.timeRangeStart, stop: v.timeRangeStop)
  |> filter(fn: (r) => r["_measurement"] == "jobs")
  |> filter(fn: (r) => r["_field"] == "DurationSum")
  |> group (columns: ["jobName"])   // all durations - each jobname has its table
  |> last()                         // each table has only the last value
  |> drop (columns: ["_start", "_stop", "_time"])
  |> map(fn: (r) => ( r with _field: r.jobName ))   // hack: transfer the tag-name
  |> drop (columns: ["jobName"])                      // Now there is only ONE table
  |> sort (desc: true)                  
  |> limit (n: 10)

【讨论】:

以上是关于InfluxDB - 使用 Flux 按系列数限制查询结果的主要内容,如果未能解决你的问题,请参考以下文章

InfluxDB 2.1.1 安装使用flux查询数据可视化

InfluxDB 2.1.1 安装使用flux查询数据可视化

InfluxDB Flux - 过滤字段匹配值的位置

针对prometheus监控系统的influxdb数据库内存优化 #yyds干货盘点#

针对prometheus监控系统的influxdb数据库内存优化 #yyds干货盘点#

influxDB:如何在 influxDB v2.0 中将字段转换为标签