Перейти к основному содержимому
Версия: 4.5.X

Агрегация по ключам

В версии KOMRAD v4.5 появилась возможность производить агрегацию отфильтрованных событий по определенному полю. Для этого при создании правила директивы необходимо выбрать тип узла "Событие" и написать правило агрегации на предметно-ориентированном языке в поле для выражения.

Язык правила агрегации

Синтаксис языка можно хорошо представить в виде следующего шаблона:

group_by [ <поле группировки> ] window
<максимальное число событий> last events
or
<временное окно> threshold <минимальное количество событий>
derive [
<агрегированное поле> = <правило трансформации> (agg.)?<поле события>
...
],
* from <last|first> event <with|without> overwrite

Разберем язык подробнее. Условно можно поделить выше написанное правило на три секции:

  • Само правило агрегации (group_by ...)
  • Частный вывод полей (derive [ ... ])
  • Общий вывод полей (* from ...)

Правило агрегации

group_by

Правило агрегации начинается с ключевого слова group_by и обязательно должно быть указано в выражении (иначе оно будет воспринято как правило CEL). После group_by в квадратных скобках необходимо указать поле события, по которому будет проводиться агрегация. Это означает, что между собой будут объединяться события с одинаковым (и присутствующим) значением данного поля. Допустим, у нас есть 4 события с полем ECS.Client.Port:

group_by [ECS.Client.Port] ...

Event 1: ECS.Client.Port = 40999
Event 2: ECS.Client.Port = 41001
Event 3: ECS.Client.Port = 41001
Event 4: ECS.Client.Port = 40999

В таком случае при агрегации мы получим одно агрегированное событие с портом 40999 и второе с портом 41001.

Функция unnest

Необходимо отметить, что если в качестве поля будет указан массив (например, AssetIPs), то агрегация будет проходить не по каждому элементу массива, а целиком по массиву. То есть, события будут агрегированы только в том случае, если все элементы массива в них совпадают. Чтобы избежать этого, можно использовать на массив функцию unnest, тогда для агрегации будут использованы отдельные элементы массива. Пример:

group_by [unnest(AssetIPs)] ...

Временное окно

После указания поля агрегации необходимо указать временное окно. Пример:

... window 25 last events or 1h threshold 10 ...

Данное окно имеет максимальный размер в 25 событий, либо срабатывает по истечении часа с, как минимум, 10 событиями. Временной интервал имеет следующий формат:

<число>.<число>d <число>.<число>h <число>.<число>m <число>.<число>s

Каждая из частей необязательна, но должна быть указана хотя бы одна. Здесь секция 'd' означает количество дней, 'h' - количество часов, 'm' - количество минут, 's' - количество секунд.

Вывод полей

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

  • Частный вывод (вывод отдельных полей)
  • Общий вывод (вывод всех полей)

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

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

Разберем частный вывод полей.

Частный вывод полей

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

Пример:

... derive [
MaxPackets = max agg.ECS.Client.Packets,
UniqueAssets = distinct agg.AssetIPs
]

Как можем увидеть, результирующему агрегированному полю можно задавать любое имя - оно затем будет отображено в переменных истории. Также здесь используются правила трансформации max и distinct. Помимо них также существуют и другие правила. Рассмотрим все:

  • first - использовать значение поля из первого события
  • last - использовать значение поля из последнего события
  • distinct - использовать все уникальные значения из полей событий в виде массива. Если поле само является массивом, то правило будет применено к отдельным его элементам
  • avg - использовать среднее значение поля. Применяется только к полям с числовым типом значения
  • sum - использовать сумму значений поля. Применяется только к полям с числовым типом значения
  • min - использовать минимальное значение поля. Применяется только к полям с числовым типом значения
  • max - использовать максимальное значение поля. Применяется только к полям с числовым типом значения

Общий вывод полей

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

...], * from first event without overwrite

Секция общего вывода полей начинается со звездочки (по подобию SQL), после которого указано ключевое слово from. Затем идет указатель "базового" события - first event или last event - используем мы первое или последнее событие в агрегации. Именно на основе "базового" события происходит вывод всех полей.

После указания базового события необходимо указать отсутствие или наличие перезаписи значений - without overwrite или with overwrite. Если перезапись активна, а одним из частных правил уже выведено поле, то, если базовое событие имеет данное поле, то его значением будет перезаписано старое из частного вывода.