Грануляция

Движок грануляции предназначен для агрегирования данных временных рядов. Для этого же предназначена подсистема Статистика в SberMobile, но движок грануляции обладает более широким набором вариантов агрегации, чем могут предложить статистические каналы. Это достигается ценой более низкой производительности и большего потребления памяти/места на диске.

Основные особенности движка грануляции:

  • Позволяет вычислять и виртуально хранить любые пользовательские данные с любой необходимой структурой данных, не только простые числа. При этом, конечно, поддерживаются стандартные функции агрегирования. Например, функция Среднее можно реализовать путем сбора количества образцов и их суммы.

  • В отличие от статистических каналов, движок грануляции дает возможность агрегировать данные практически за любые (определенные пользователем) периоды времени, равномерные и неравномерные.

  • Движок грануляции никогда "не закрывает" периоды агрегации, давая возможность добавлять информацию к любому периоду в любой момент. В частности, это означает, что данные можно обрабатывать в любом порядке: если какие-то данные поступают с задержкой, вы все равно можете их обработать и добавить агрегат данных к временному интервалу в прошлом.

Если вы знакомы со статистикой на базе RRD, вы можете провести аналогию между ней и движком грануляции. Статистические данные на базе RRD представлены именованными статистическими каналами, каждый из которых обрабатывает значения переменной контекста. В движке грануляции есть очень похожий аналог статистического канала, который называется гранулятором.

Чтобы быстро настроить грануляцию с помощью пошагового мастера, откройте контекстное меню для любой переменной и выберите пункт Конфигурация статистики и грануляции.

Признаки гранулятора

Гранулятор определяется в контексте следующими признаками:

Имя поля

Тип

Описание

Имя

String

Строка, которая идентифицирует гранулятор в контексте, в котором он определен

Переменная

String

Имя переменной в контексте, которая запускает гранулятор

Активный

Boolean

Флажок, показывающий, активен ли гранулятор и обрабатываются ли изменения переменной

Формат значения

DataTable

Формат хранения агрегированных значений в таблице

Выражение значения

String

Выражение для вычисления нового агрегированного значения на базе предыдущего значения и значения новой входящей переменной

Выражение временной метки

String

Выражения, определяющее и идентифицирующее временные периоды

Время хранения

Long

Период времени, определяющий срок хранения гранулы

Точность временной метки

Long

Параметр точности определяет временной интервал, используемый временной меткой для поиска гранул. Из-за ошибок округления временная метка гранулы может отличаться от рассчитанного значения. Поэтому движок поиска гранул находит гранулы, которые лежат с интервалом, близким к рассчитанной временной метке. Интервал определяется как [временная метка - точность, временная метка + точность].

Гранулы

Данные собираются в "гранулы". Каждая гранула представляет собой определенный временной интервал агрегации данных и содержит:

  • Временную метку, которая представляет интервал времени, в течение которого гранула хранит информацию.

  • Накопленное значение для временного интервала. Накопленное значение - это таблица данных с форматом, определенным в поле Формат значения.

Предполагается, что временная метка гранулы находится в отношении один к одному с временным интервалом, который она представляет; в то же время только временная метка определяет данную гранулу внутри ее гранулятора.

Например, гранулятор, который каждый час агрегирует средние значения, должен выдавать гранулу для каждого часа; эти гранулы могут быть определены, например, временными метками с нулевыми минутами, секундами и миллисекундами. Существуют, конечно, другие способы воплощения на усмотрение разработчика.

Алгоритм грануляции

Включенный гранулятор автоматически активируется при изменении соответствующей переменной. Другой способ инициировать грануляцию - вызвать функцию Гранулировать контекста переменной.

Гранулятор берет временную метку события изменения и вновь поступившее значение переменной, находит или создает гранулу, которая представляет временной интервал, под который подпадает событие, и обновляет значение гранулы.

Таким образом, алгоритм грануляции включает следующие стадии:

  • Вычисление временной метки гранулы, которая определяет требуемый временной интервал и гранулу

  • Получение гранулы по рассчитанной временной метке

  • Обновление данных гранулы в соответствии с вновь поступившим значением и их хранение

Ниже алгоритм описан более подробно.

Вычисление временной метки гранулы

Прежде всего, гранулятор должен определять временной интервал, под который подпадают входящие данные. Интервалы определяются временными метками.

Выражение временной метки используется для преобразования времени события во временную метку гранулы. Разработчик должен убедиться, что преобразование осуществлено 1:1.

Во время вычисления выражения временной метки, время обновления переменной передается среде вычисления как таблица данных по умолчанию с единственным значением. Так, чтобы получить время обновления, можно использовать следующее выражение:

cell(dt())

Значение может быть преобразовано во временную метку гранулы. Например, для сбора поминутных данных, можно использовать следующее выражение для временных меток гранул:

date(year(cell(dt())), month(cell(dt())), day(cell(dt())), hour(cell(dt())), minute(cell(dt())), 0)

Обратите внимание, что вы можете легко предоставить неравные календарные периоды, например, месяцы:

date(year(cell(dt())), month(cell(dt())), 0, 0, 0, 0)

Получение гранулы

Гранулы хранятся как события контекста гранулятора по следующим правилам:

  • Имя события совпадает с именем гранулятора

  • Временная метка сохраняется как время создания события

  • Данные гранулы хранятся в таблице данных события.

Имея временную метку, движок грануляции находит гранулу, которая представляет данные для соответствующего временного интервала.

Если гранула еще не существует, новое событие создается с временной меткой и таблицей данных формата, указанного в поле Формат значения.

Обновление гранулы

Выражение значения используется для вычисления значения новой гранулы на основе входящей переменной и предыдущих значений гранулы.

Среда вычисления выражения включает:

  • новое значение переменной как таблицу данных по умолчанию; поэтому невозможно получить к ней доступ с использованием функции dt();

  • текущее значение гранулы "предыдущая" переменная среды; используйте {env/previous},чтобы получить ее значение.

Результат вычисления выражения значения сохраняется обратно в том же событии, что и новое значение для гранулы.

Помните, что новое значение разворачивается из таблицы до сохранения значения в грануле. Это может вызвать неудобство при попытке сохранить таблицу данных с большим количеством записей как значение гранулы. В этом случае не забывайте упакеовывать получившееся значение во внешнюю таблицу данных:

table("<<data><T>>", dt())

После обновления гранулы запускается соответствующее событие в контексте владельца (см. ниже).

Функция Granulate

Функция позволяет инициировать грануляцию переменной. Это может быть полезно, например, при обновлении переменной задним числом, когда данные поступают с задержкой.

Функция берет имя переменной, новое значение и временную метку (как показано в таблице ниже) и начинает выполнение алгоритма грануляции, описанного выше.

Имя поля

Тип

Описание

Имя переменной

String

Имя переменной для грануляции

Значение

DataTable

Входящее значение

Временная метка

Date

Момент изменения значения

Доступ к гранулам

Гранулы можно читать как обычные события в контексте гранулятора, например, с использованием функции Получить из контекста события.

Например, чтобы получить все гранулы с именем 'testGranulator' в контексте 'users.admin.devices.virtual', можно использовать следующее выражение:

{events:get("users.admin.devices.virtual", "testGranulator", NULL, NULL, NULL)}

Событие Обновление гранулы (Granule Updated)

Когда для контекста активируется грануляция, добавляется событие Обновление гранулы со следующим форматом:

Имя поля

Тип

Описание

Имя

String

Имя гранулятора

Временная метка

Date

Момент обновления значения гранулы

Значение

DataTable

Новое значение гранулы

Событие запускается, когда гранула обновлена.