2016-10-07 157 views
3

我有一個系列,disk,包含磁盤的path/mnt/disk1/mnt/disk2等)和total空間。它還包括freeused值。這些值以指定的時間間隔更新。我想要做的是查詢獲得每條路徑的last()total的總和。我還想對freeused執行相同操作,以獲得我的服務器上所有磁盤的總大小,可用空間和已用空間的總和。SUM(LAST())在GROUP BY

我有一個查詢在這裏,將讓我的所有磁盤的last(total),其路徑(區別)進行分組:

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

目前,這將返回5個系列,每個包含1行(最新)以及其價值total。然後我想要把這些系列的總和,但我不能把last(total)包裝成sum()函數調用。有沒有辦法做到這一點,我失蹤了?

+0

在這裏,他們討論了InfluxDB中尚未普遍支持的嵌套函數。 https://github.com/influxdata/influxdb/issues/6823。建議的解決方法是爲一個值(例如總數)構建一個CQ並使用其他函數(例如last())查詢CQ。 – Jason

回答

3

從我上面關於嵌套函數的評論開始。

構建玩具例如:

INSERT disk,path="/mnt/disk1" total=30 
INSERT disk,path="/mnt/disk2" total=32 
INSERT disk,path="/mnt/disk3" total=33 

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 

然後,在推一些值:

CREATE DATABASE FOO 
USE FOO 

假設你的數據是每隔一段時間 [1]每分鐘大於更新

並等待一分多鐘。然後:

INSERT disk,path="/mnt/disk1" total=41 
INSERT disk,path="/mnt/disk2" total=42 
INSERT disk,path="/mnt/disk3" total=43 

然後再等一會兒。然後:

SELECT * FROM disk_1m_total 

name: disk_1m_total 
------------------- 
time     total_1m 
1476015300000000000  95 
1476015420000000000  126 

兩個值30+32+33=9541+42+43=126

從那裏,這是微不足道的查詢:

SELECT last(total_1m) FROM disk_1m_total 

name: disk_1m_total 
------------------- 
time     last 
1476015420000000000  126 

希望有所幫助。

[1]小於更新頻率的採樣間隔可防止小的定時抖動使給定組中的所有數據偶然相加兩次。可能有一些「零更新」間隔,但沒有「雙重計數」間隔。我通常調用Shannon定理,並且運行查詢的速度比更新快兩倍。如果CQ沒有看到窗口的數據,那麼將不會爲該窗口執行CQ,因此last()仍然會給出正確的答案。例如,我將CQ保留一晚,並且沒有推送新數據:last(total_1m)給出了相同的答案,而不是「無新數據」爲零。