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

Плагин aggregation

Плагин aggregation

Плагин aggregation позволяет объединять несколько событий в одно (агрегировать). В результате агрегации в суммарном событии можно выводить поля с помощью агрегирующих функций (first, last, distinct, avg, sum, min, max, custom). Агрегация также позволяет уменьшить поток событий, избавляясь от «шума».

Конфигурация

processors:
- module: aggregation
aggregation:
rule:
fields: ["Raw"]
window: 10s
min_events: 2
derive:
fields:
- deriving_data:
init_expr: '"hello aggregation"'
state_expr: 'agg_state'
finalize_expr: 'agg_state'
to: HelloAggregation
deriving_type: custom
condition:
equals:
Raw: "1"
keep-originals: false
ПараметрТипПо умолчаниюОписание
ruleobjectПравило агрегации (см. ниже)
conditionobjectФильтр событий, подпадающих под агрегацию (опционально). Синтаксис соответствует блоку when
keep-originalsboolfalseСохранять ли оригинальные события, использовавшиеся для агрегации

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

Блок rule определяет параметры окна агрегации, группировку и вывод полей.

ПараметрТипОбязательныйОписание
fieldsarrayнетМассив полей группировки (см. ниже)
windowdurationдаРазмер временного окна агрегации ("5m", "1h" и т.п.)
max_eventsintнетМаксимальное количество событий в окне. При достижении окно закрывается немедленно
min_eventsintнетМинимальное количество событий в окне. Агрегированное событие создаётся при закрытии окна, если накоплено не менее min_events событий
additional_rulesarrayнетДополнительные правила агрегации (см. ниже)
deriveobjectнетБлок определения вывода полей для результата агрегации
Обязательные поля

Хотя бы одно из полей max_events или min_events должно быть указано. Конфигурация с обоими значениями равными 0 (или не указанными) приведёт к ошибке.

Поля группировки

Агрегация поддерживает три режима группировки:

  • Без группировки — агрегация по всем событиям (или по всем, прошедшим фильтр condition)
  • По одному полю — аналогично классической агрегации
  • По нескольким полям — события разделяются на группы по комбинации значений полей

Поле fields можно задать двумя способами:

Массив строк (параметр unnest считается равным false):

fields: ["ECS.Source.IP", "ECS.Event.Category"]

Массив объектов с управлением unnest:

fields:
- name: "ECS.Source.IP"
unnest: false
- name: "AssetIPs"
unnest: true
ПараметрТипОписание
namestringНазвание поля
unnestboolЕсли false — группировка по значению массива целиком. Если true — группировка отдельно по каждому элементу массива

Условия завершения агрегации

Поведение определяется комбинацией max_events и min_events:

max_eventsmin_eventsПоведение
> 0> 0Окно закрывается немедленно при max_events событиях или при истечении окна, если накоплено >= min_events
0> 0Окно закрывается только при истечении окна, если накоплено >= min_events
> 00Окно закрывается при достижении max_events событий
00Невалидная конфигурация — ошибка

Дополнительные правила агрегации

Блок additional_rules — массив объектов, позволяющих определить дополнительные условия успешной агрегации (например, обнаружение всплеска количества событий).

additional_rules:
- window: 5s
max_events: 100
immediate_trigger: true
ПараметрТипОбязательныйОписание
windowdurationдаРазмер дополнительного временного окна
max_eventsintнетМаксимальное количество событий в дополнительном окне. При достижении — агрегация считается успешной при закрытии основного окна
min_eventsintнетМинимальное количество событий. При достижении на момент закрытия дополнительного окна — агрегация успешна
immediate_triggerboolнетЕсли true, основная агрегация завершается немедленно при успехе дополнительного правила. Если false — результат учитывается только при закрытии основного окна

Вывод полей

Блок derive определяет, какие поля попадут в агрегированное событие и каким образом их значения будут вычислены.

Поля derive.fields

Массив объектов, каждый из которых определяет одно выходное поле:

ПараметрТипОписание
tostringНазвание поля в результирующем событии
deriving_typestringСпособ вывода (см. таблицу ниже)
deriving_dataobjectДанные для конкретного способа вывода

Для типов first, last, distinct, avg, sum, min, max в блоке deriving_data необходимо указать поле from — название исходного поля.

Поля derive.all

Общее правило вывода полей, применяемое ко всем полям события:

ПараметрТипОписание
enableboolАктивировать общий вывод полей
overwriteboolПерезаписывать существующие значения полей
deriving_typestringСпособ вывода: только first или last
Доступные способы вывода (deriving_type)
ТипОписаниеПрименимость
firstЗначение из первого событияВсе типы полей
lastЗначение из последнего событияВсе типы полей
distinctМассив уникальных значений из всех событийВсе типы полей. Для полей-массивов применяется к элементам
avgСреднее значениеТолько числовые поля
sumСумма значенийТолько числовые поля
minМинимальное значениеТолько числовые поля
maxМаксимальное значениеТолько числовые поля
customПроизвольный вывод на основе CEL-выраженийВсе типы полей

Пользовательский вывод (custom)

Способ custom позволяет создавать произвольный вывод полей на основе CEL-выражений, аналогично пользовательским агрегатным функциям в SQL.

При указании deriving_type: custom в deriving_data ожидаются следующие параметры:

ПараметрТипОписание
init_exprstringCEL-выражение инициализации начального состояния агрегации
state_exprstringCEL-выражение функции перехода. Доступна переменная agg_state (текущее состояние) и все поля события
finalize_exprstringCEL-выражение финализации. Результат присваивается целевому полю
disable_type_checkingboolОтключить проверку типов в CEL-выражениях. Если true, agg_state имеет динамический тип

Порядок выполнения при успешной агрегации:

  1. Вызывается init_expr — определяет начальное значение agg_state
  2. Для каждого события в окне вызывается state_expr. Результат становится новым значением agg_state
  3. Вызывается finalize_expr. Результат присваивается целевому полю
Проверка типов

Если disable_type_checking не указан или равен false, тип agg_state определяется результатом init_expr, а state_expr обязан возвращать тот же тип.


Фильтр событий

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


Формирование событий

Возможные сценарии при активных плагинах агрегации:

СценарийРезультат
Событие не подходит ни под одно условиеСоздаётся как есть, без агрегации
Подходит, и хотя бы один плагин имеет keep-originals: trueСоздаётся как есть и влияет на формирование агрегированного события
Подходит, ни один плагин не имеет keep-originals: trueТолько влияет на агрегированное событие. При провале агрегации (например, не набрано достаточно событий) оригинал создаётся

Агрегированное событие содержит следующие поля:

ПолеОписание
Поля группировкиЗначения полей, по которым проводилась группировка
ECS.Event.StartВремя генерации самого раннего события из агрегированных
ECS.Event.EndВремя генерации самого последнего события из агрегированных
AssetIPsАдреса всех активов из всех агрегированных событий
CountКоличество агрегированных событий
ProducerЗначение Aggregator
Поля из deriveПоля, определённые блоком rule.derive

Пример

Агрегация событий по полю Raw с временным окном 10 секунд, минимум 2 события, с пользовательским выводом и фильтром:

processors:
- module: aggregation
aggregation:
rule:
fields: ["Raw"]
window: 10s
min_events: 2
derive:
fields:
# Стандартный вывод: первый IP-адрес источника
- deriving_data:
from: "ECS.Source.IP"
to: "ECS.Source.IP"
deriving_type: first
# Стандартный вывод: все уникальные имена пользователей
- deriving_data:
from: "ECS.User.Name"
to: "ECS.User.Name"
deriving_type: distinct
# Пользовательский вывод: конкатенация через CEL
- deriving_data:
init_expr: '"hello aggregation"'
state_expr: 'agg_state'
finalize_expr: 'agg_state'
to: HelloAggregation
deriving_type: custom
all:
enable: true
overwrite: false
deriving_type: first
condition:
equals:
Raw: "1"
keep-originals: false