Растущие метрики

Заняло минут 20 наверное найти как правильно считать изменения в растущей величине. К примеру, я хотел посмотреть как растёт число дропнутых пакетов на сервере.

select Derivative(dropped_packets) from packets group by time(1m)

в общем суть в том, что почти все агрегирующие функции в influxdb требуют группировки по времени, а я предполагал, что оно само будет считать мне разницу между всеми записанными time_series, например:

1432980140000 1300
1432980143000 1400
1432980146000 1550

я ожидал получения чего-то в духе:

1432980143000 100
1432980146000 150

увы, прямо так оно не умеет, но в каком-то роде оно и хорошо - мне кажется вычисление по большому объёму данных бы адово провисло:

http://influxdb.com/docs/v0.7/api/aggregate_functions.html

здесь можно почитать подробнее как именно такая дельта работает.

Обнуляющиеся метрики

Те же самые счётчики пакетов порой обнуляются и дают derivative в духе:

1000
-70000000
900
1100
1000

В рамках 0.88 задача не решаема средствами influxdb, в 0.9 запилили non_negative_derivative(), сегодня обкатаю.

Зарезервированные слова

Как оказалось пытаться запихать в базу колонку time и пытаться потом населектить - плохая идея, так как оно зарезервировано и итак пишется в time series в любом случае.

Raw query из grafana

Если уж решились писать raw_query - значит вы должны писать их правильно. Потому что то что вы напишите, то и будет запрашиваться у сервера, а отсекаться за нужный интервал данные будут уже на стороне клиента. База, если честно, жёстко охреневает с запросов которые отдают большое количество данных, выполняет их секунд по 20 и сжирает весь процессор. Так что постарайтесь правильно пользоваться query builder, иначе dashboard’ы у вас будут рисоваться по 2-3 минуты, либо используйте “where $timeFilter” (передаётся выбранный таймфильтр из вебки графаны).

Если сильно не нравится обязательная группировка по времени - попробуйте хотя бы указать group by 1s (я бы делал всё равно не более 5s).

Вообще я отслеживаю с помощью графиков аномалии, так что мне здорово подошла бы функция min(value), но по непонятной мне причине она не работала, поэтому я агрегирую значения по first.

Что-то сейчас задумался о переводе influxdb документации по функциям агрегирования на хабре с более подробными примерами когда что стоит использовать.