GROUP BY 上的 SUM(LAST())

ehf*_*lve 5 influxdb

我有一个系列,disk,包含path/mnt/disk1/mnt/disk2,等)和total空间的磁盘中。它还包括freeused值。这些值以指定的时间间隔更新。我想这样做,是查询得到的总和totallast()每个路径的。我还想对 forfree和 for执行相同的操作used,以获取服务器上所有磁盘的总大小、可用空间和已用空间的总和。

我在这里有一个查询,它将让我得到last(total)所有磁盘,按其路径分组(为了区分):

select last(total) as total from disk where path =~ /(mnt\/disk).*/ group by path

目前,这将返回 5 个系列,每个系列包含 1 行(最新的)及其total. 然后我想取这些系列的总和,但我不能把它包装last(total)成一个sum()函数调用。有没有办法做到这一点,我失踪?

Jas*_*son 2

继续我上面关于嵌套函数的评论。

构建一个玩具示例:

CREATE DATABASE FOO
USE FOO
Run Code Online (Sandbox Code Playgroud)

假设您的数据更新间隔大于每分钟 [1]:

CREATE CONTINUOUS QUERY disk_sum_total ON FOO 
BEGIN
  SELECT sum("total") AS "total_1m" INTO disk_1m_total FROM "disk" 
  GROUP BY time(1m)
END
Run Code Online (Sandbox Code Playgroud)

然后将一些值推入:

INSERT disk,path="/mnt/disk1" total=30
INSERT disk,path="/mnt/disk2" total=32
INSERT disk,path="/mnt/disk3" total=33
Run Code Online (Sandbox Code Playgroud)

并等待一分多钟。然后:

INSERT disk,path="/mnt/disk1" total=41
INSERT disk,path="/mnt/disk2" total=42
INSERT disk,path="/mnt/disk3" total=43
Run Code Online (Sandbox Code Playgroud)

再等一下+。然后:

SELECT * FROM disk_1m_total

name: disk_1m_total
-------------------
time                    total_1m
1476015300000000000     95
1476015420000000000     126
Run Code Online (Sandbox Code Playgroud)

这两个值是30+32+33=9541+42+43=126

从那里,查询很简单:

SELECT last(total_1m) FROM disk_1m_total

name: disk_1m_total
-------------------
time                    last
1476015420000000000     126
Run Code Online (Sandbox Code Playgroud)

希望有帮助。

[1] 选择小于更新频率的间隔可防止微小的定时抖动导致给定组的所有数据意外求和两次。可能存在一些“零更新”间隔,但没有“重复计数”间隔。我通常运行查询的速度是更新速度的两倍。如果 CQ 没有看到某个窗口的数据,则不会对该窗口执行 CQ,因此last()仍会给出正确的答案。例如,我让 CQ 运行过夜并且没有推送新数据:last(total_1m)给出相同的答案,而不是“没有新数据”的零。