2016-10-07 3 views
3

У меня есть ряд, disk,, который содержит path (/mnt/disk1, /mnt/disk2 и т.д.) и total пространство на диске. Он также включает значения free и used. Эти значения обновляются с заданным интервалом. То, что я хотел бы сделать, - это запрос, чтобы получить сумму total из last() каждого пути. Я также хотел бы сделать то же самое для free и для used, чтобы получить совокупность общего размера, свободного места и пробела всех моих дисков на моем сервере.СУММА (ПОСЛЕДНИЙ()) на 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 для одного значения (например, total) и запрос CQ с использованием другой функции (например, last()). – Jason

ответ

3

Выполнение моего комментария выше о вложенных функциях.

Строим пример игрушка:

CREATE DATABASE FOO 
USE FOO 

Если предположить, что ваши данные обновляются с интервалом больше, чем [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 

Тогда толкнуть некоторые значения в:

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

И подождите больше минуты. Затем:

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=95 и 41+42+43=126.

Оттуда, это тривиально запрос:

SELECT last(total_1m) FROM disk_1m_total 

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

Надежда, что помогает.

[1] Интервалы выбора, меньшие, чем частота обновления, предотвращают незначительные колебания времени, из-за которых все данные случайно суммируются дважды для данной группы. Могут быть некоторые интервалы «нулевого обновления», но нет интервалов «двойного подсчета». Я обычно ссылаюсь на теорему Шеннона и запускаю запрос в два раза быстрее, чем обновления. Если CQ не видит данных для окна, для этого окна не будет CQ, поэтому last() все равно даст правильный ответ. Например, я оставил CQ за одну ночь и не ввел новые данные: last(total_1m) дает тот же ответ, но не равен нулю для «новых данных».