2016-10-07 11 views
3

にはpath/mnt/disk1,/mnt/disk2など)とtotalというディスクの空き領域が含まれています。また、freeusedの値も含まれています。これらの値は、指定された間隔で更新されます。私がしたいのは、totalと各パスのlast()の合計を取得するクエリです。 freeusedについても、サーバ上のすべてのディスクの合計サイズ、空き容量、使用済み容量の合計を取得したいと思います。GROUP BYの

私は私に(区別のために)そのパスによってグループ化されたすべてのディスクのlast(total)を取得しますここにクエリしている現在、これは(それぞれが1行を含む、5シリーズを

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

を返します。最新)とそのtotalの値。私はそれらのシリーズの合計を取るが、私はlast(total)sum()関数呼び出しにラップすることはできません。私が行方不明になっているこれを行う方法はありますか?

+0

ここでは、InfluxDBでまだ一般的にサポートされていない入れ子関数について説明します。 https://github.com/influxdata/influxdb/issues/6823。回避策は、ある値(例えば合計)に対してCQを構築し、他の関数(例えばlast())を使用してCQを照会することを提案する。 – Jason

答えて

3

上記のネストされた機能についての私のコメントからの実行。

おもちゃの例のビルド:あなたのデータはよりも大きな間隔で更新されると仮定すると、

CREATE DATABASE FOO 
USE FOO 

を[1]毎分:

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 

は、その後にいくつかの値をプッシュ

そして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]更新頻度よりも小さいピッキング間隔は、マイナーなタイミングジッタによって、特定のグループに対してすべてのデータが誤って2回加算されることを防ぎます。いくつかの「ゼロ更新」間隔があるかもしれませんが、「二重計数」間隔はありません。私は通常、シャノンの定理を呼び出して、更新の2倍の速さでクエリを実行します。 CQにウィンドウのデータがない場合、そのウィンドウに対してCQは実行されないので、last()は正しい答えを返します。たとえば、私はCQを一晩中実行したままにして、新しいデータをプッシュしませんでした。last(total_1m)は「新しいデータなし」ではゼロではなく、同じ回答を返します。