Я использую infxdb для хранения некоторых метрик обслуживания. Это простые метрики, такие как считанные байты или активные соединения. Затем с графаной я сочиняю несколько визуализаций поверх этого.
Отображение чего-либо в виде «прочитанных байтов» довольно просто, это в основном суммирование значений, сгруппированных по временному интервалу.
SELECT sum("value") FROM "bytesReceived" WHERE $timeFilter GROUP BY time($__interval) fill(0)
Именно из-за «активных соединений» у меня возникают проблемы с выяснением. Это сокеты tcp, подключенные к услуге, где измерением является количество подключенных сокетов; это обновляется всякий раз, когда сокет подключается или отключается.
Если бы у меня был только один экземпляр службы, это было бы легко, я бы просто сделал что-то вроде
SELECT last("value") FROM "activeConnections" WHERE $timeFilter GROUP BY time($__interval) fill(0)
Дело в том, что существует несколько экземпляров службы, которые создаются динамически. Измерение записывается с дополнительным тегом «host», который заполняется идентификатором для службы времени выполнения.
Итак, давайте перейдем к точкам данных.
select * from activeConnections where time > '2018-05-16T16:00:00Z' and time < '2018-05-16T16:10:00Z'
Это выплевывает что-то вроде
time host value
---- ---- -----
1526486436041433600 58e5bd04a313 5
1526486438158741000 58e5bd04a313 4
1526486438712713000 58e5bd04a313 3
1526486811218129000 29b39780fd7b 4
Итак, как вы можете заметить, у нас получается 3 соединения на одном хосте и 4 на другом. Проблема в том, что ... отображение данных, объединенных в единое целое, где последней строкой должно быть, например, 7.
Я попытался сгруппировать данные по хосту
select last(value) from activeConnections where time > '2018-05-16T16:00:00Z' and time < '2018-05-16T16:10:00Z' group by host
, что дает мне последнее значение для каждой группы
name: activeConnections
tags: host=29b39780fd7b
time last
---- ----
1526486811218129000 4
name: activeConnections
tags: host=58e5bd04a313
time last
---- ----
1526486706993942700 3
Также попытался использовать подзапрос
select * from ( select last(value) from activeConnections where time > '2018-05-16T16:00:00Z' and time < '2018-05-16T16:10:00Z' group by host )
Но у меня та же проблема, когда я не знаю, как правильно сгруппировать вещи для графаны с временным интервалом.
Есть ли какие-либо комментарии и помощь? Буду очень признателен.