2016-10-07 2 views
3

habe ich eine Reihe, die einen disk,path (/mnt/disk1, /mnt/disk2, usw.) enthält, und total Raum einer Festplatte. Es enthält auch free und used Werte. Diese Werte werden in einem bestimmten Intervall aktualisiert. Was ich tun möchte, ist Abfrage, um die Summe der total der last() jedes Pfades zu erhalten. Ich möchte auch dasselbe für free und für used tun, um eine Zusammenfassung der Gesamtgröße, des freien Speicherplatzes und des belegten Speicherplatzes aller meiner Festplatten auf meinem Server zu erhalten.SUM (LAST()) auf GROUP BY

Ich habe eine Abfrage hier, dass mir die last(total) aller Platten erhalten werden, indem Sie den Pfad gruppiert (zur Unterscheidung):

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

Derzeit diese liefert 5-Serie, die jeweils 1 Reihe (das Neueste) und der Wert seiner total. Ich möchte dann die Summe dieser Serien nehmen, aber ich kann nicht einfach die last(total) in einen sum() Funktionsaufruf wickeln. Gibt es eine Möglichkeit, dies zu tun, die ich vermisse?

+0

Hier sprechen sie über verschachtelte Funktionen, die in InfluxDB noch nicht generell unterstützt werden. https://github.com/influxdata/influxdb/issues/6823. Die vorgeschlagene Umgehungslösung besteht darin, einen CQ für einen Wert (z. B. total) zu erstellen und den CQ unter Verwendung der anderen Funktion (z. B. last()) abzufragen. – Jason

Antwort

3

Weiter von meinem Kommentar über verschachtelte Funktionen.

ein Spielzeug Beispiel Gebäude:

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 

Dann einige Werte eindrücken:

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

CREATE DATABASE FOO 
USE FOO 

Vorausgesetzt, dass Ihre Daten in Abständen größer als [1] jede Minute aktualisiert

Und warten Sie mehr als eine Minute. Dann:

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

Und warten Sie eine Minute + wieder. Dann:

SELECT * FROM disk_1m_total 

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

Die beiden Werte sind 30+32+33=95 und 41+42+43=126.

Von dort ist es trivial zu Abfrage:

SELECT last(total_1m) FROM disk_1m_total 

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

Hoffnung, das hilft.

[1] Auswahlintervalle, die kleiner als die Aktualisierungsfrequenz sind, verhindern, dass geringfügige Timing-Jitter dazu führen, dass alle Daten für eine bestimmte Gruppe versehentlich zweimal addiert werden. Es könnte einige "Null-Update" -Intervalle geben, aber keine "Doppelzähl" -Intervalle. Normalerweise rufe ich den Satz von Shannon auf und führe die Abfrage zweimal so schnell aus wie die Aktualisierungen. Wenn der CQ keine Daten für ein Fenster sieht, wird für dieses Fenster kein CQ durchgeführt, so dass last() immer noch die richtige Antwort gibt. Zum Beispiel ließ ich den CQ über Nacht laufen und schob keine neuen Daten hinein: last(total_1m) gibt die gleiche Antwort, nicht Null für "keine neuen Daten".