Глобальные функции
В данном разделе представлен обзор структуры, принципов работы и процесса создания глобальных функций в R-Vision SIEM. Управление глобальными функциями в системе осуществляется в разделе Экспертиза.
О глобальных функциях
Глобальная функция задает переиспользуемый блок кода на языке VRL, который можно применять при создании правил корреляции и нормализации. Такие функции позволяют настраивать фильтрацию событий, выполнять вычисления или преобразования данных.
Для использования глобальной функции в конструкторе правиле корреляции необходимо выбрать ее из списка доступных типов условий и указать значения для аргументов.
Глобальные функции помогают упростить настройку правил, избегая дублирования кода, и обеспечивают возможность многократного использования одной логики в различных сценариях.
Работа с глобальной функцией
Доступные операции над глобальной функцией:
Создание глобальной функции
Чтобы создать глобальную функцию:
-
Перейдите в раздел Экспертиза. Система отобразит сведения об имеющихся элементах экспертизы, включая их статус (включен/выключен).
-
На панели инструментов нажмите на кнопку Создать и выберите в выпадающем списке пункт Глобальная функция. Система отобразит окно создания функции.
При создании элемента экспертизы поля его структуры заполняются значениями по умолчанию. Для быстрой настройки структуры в системе доступны предустановленные примеры. Чтобы заполнить поля элемента экспертизы с помощью примера, нажмите на кнопку Примеры и выберите требуемый пример из выпадающего списка. -
Заполните поля глобальной функции, чтобы определить ее логику и параметры.
-
Нажмите на кнопку Опубликовать версию, чтобы сохранить изменения и опубликовать созданную глобальную функцию. Система создаст глобальную функцию и отобразит соответствующее уведомление. Новая функция отобразится в таблице раздела Экспертиза.
Чтобы глобальная функция стала доступной для использования в условиях корреляции, ее необходимо включить. Вы можете создать черновик глобальной функции без публикации, используя кнопку Сохранить черновик. Система создаст черновик и отобразит соответствующее уведомление. Черновик отобразится в таблице раздела Экспертиза.
Изменение глобальной функции
Чтобы изменить глобальную функцию:
-
Перейдите в раздел Экспертиза. Система отобразит сведения об имеющихся элементах экспертизы, включая их статус (включен/выключен).
-
Нажмите на строку глобальной функции в списке. В правой части экрана отобразится карточка функции с подробной информацией.
-
Выберите опцию Изменить в меню Действия (
) в верхней части карточки функции. Откроется окно настроек.
Вы также можете открыть окно настроек с помощью кнопки в нижней части карточки:
-
Для опубликованной версии: нажмите на кнопку Просмотр в нижней части карточки. Система отобразит окно просмотра настроек элемента экспертизы. Нажмите на кнопку Изменить в правом нижнем углу окна.
-
Для черновика: нажмите на кнопку Изменить в нижней части карточки.
-
-
Внесите требуемые изменения в конфигурацию функции.
-
Нажмите кнопку Обновить версию. Новая версия функции с измененной конфигурацией будет опубликована.
При публикации новой версии элемента экспертизы требуется увеличить его текущую версию в поле version
.Вы можете сохранить измененную конфигурацию функции в виде черновика без публикации, используя кнопку Сохранить черновик. Черновик будет доступен для дальнейшего редактирования, с предупреждением о наличии неопубликованных изменений.
Удаление глобальной функции
Удаление доступно только для элементов экспертизы с типом создания Пользовательский. |
Удаление недоступно для элементов экспертизы, используемых в других сущностях системы.
Чтобы удалить глобальную функцию:
-
Перейдите в раздел Экспертиза. Система отобразит сведения об имеющихся элементах экспертизы, включая их статус (включен/выключен).
-
Нажмите на строку глобальной функции в списке. В правой части экрана отобразится карточка функции с подробной информацией.
-
Выберите опцию Удалить в меню Действия (
) в верхней части карточки. Отобразится окно подтверждения удаления.
-
Нажмите на кнопку Удалить. Система удалит функцию и отобразит соответствующее уведомление. Удаленная функция будет исключена из списка элементов экспертизы.
Вы также можете удалить группу элементов экспертизы. Для этого:
|
Структура глобальной функции
Глобальная функция содержит обязательные и опциональные поля, определяющие ее логику и параметры для обработки данных.
Поле | Описание | Тип данных | Обязательное поле |
---|---|---|---|
|
Уникальный идентификатор глобальной функции. Должен быть уникальным в пределах экспертизы. Можно использовать UUID в качестве значения. |
строка |
да |
|
Название глобальной функции. Допустимы латинские буквы, цифры, подчеркивания. |
строка |
да |
|
Краткое описание назначения глобальной функции. |
строка |
нет |
|
Список источников данных, с которыми совместима глобальная функция. Используется для классификации и быстрого поиска элементов экспертизы в системе. |
массив строк массив объектов |
нет |
|
Статус разработки текущей версии глобальной функции. Может принимать любые текстовые значения. Примеры значений:
|
строка |
нет |
|
Дата создания или изменения глобальной функции. Задается в формате Поле не связано с полями Дата создания и Дата изменения в карточке элемента экспертизы. |
строка |
нет |
|
Тип объекта. Для глобальных функций всегда указывается |
строка |
да |
|
Версия функции в формате Semantic Versioning. |
строка |
да |
|
Имя и контактные данные автора функции. |
строка |
нет |
|
Код глобальной функции, реализованный на языке VRL. |
строка |
да |
|
Набор аргументов, определяющих входные данные функции. Каждый аргумент имеет тип и имя. |
массив объектов |
да |
|
Определяет, может ли функция возвращать ошибки. По умолчанию |
логический |
нет |
|
Набор тестов для проверки корректности работы функции. |
массив объектов |
нет |
Структура data_source
Поле data_source
, представленное массивом строк, имеет структуру:
data_source:
- <platform> # Платформа или информационная система.
- <source> # Источник событий.
# События (EventId) или путь к журналу событий:
- <EventID_1>
- <EventID_2>
Поле data_source
, представленное массивом объектов, имеет следующую структуру:
Поле | Описание | Тип данных | Обязательное поле |
---|---|---|---|
|
Платформа или информационная система. |
строка |
нет |
|
Источник событий. |
строка |
нет |
|
События (EventId) или путь к журналу событий. |
массив строк |
нет |
Структура arguments
Поле | Описание | Тип данных | Обязательное поле |
---|---|---|---|
|
Имя аргумента, которое используется в коде функции. |
строка |
да |
|
Тип аргумента. Допустимые значения: |
строка или объект |
да |
Структура tests
Поле | Описание | Тип данных | Обязательное поле |
---|---|---|---|
|
Название теста, позволяющее идентифицировать его при проверке работы глобальной функции. |
строка |
да |
|
Набор входных данных для тестирования в виде массива событий, передаваемых в функцию. |
массив |
да |
|
Блок проверок на языке VRL, выполняемых на каждом событии из |
строка |
да |
Составление глобальной функции
Для создания глобальной функции необходимо определить ряд обязательных и опциональных полей, которые формируют ее поведение и логику обработки данных.
Поля метаданных
Заполните поля метаданных глобальной функции:
-
id
: уникальный идентификатор глобальной функции. Должен быть уникальным в пределах экспертизы. Можно использовать UUID в качестве значения. -
name
: название глобальной функции. Допустимы латинские буквы, цифры и символы подчеркивания. -
type
: всегда указываетсяglobal_function
для элементов экспертизы данного типа. -
description
(опционально): краткое описание назначения функции. -
author
(опционально): имя и контактные данные автора глобальной функции. -
version
: версия глобальной функции согласно стандарту Semantic Versioning. -
status
(опционально): статус разработки текущей версии глобальной функции. Может принимать текстовые значения, такие как:-
debug
: версия в разработке. -
experimental
: экспериментальная версия. -
test
: версия для тестирования. -
stable
: стабильная версия.
-
-
date
(опционально): дата создания или изменения глобальной функции. Формат значения:YYYY-MM-DD
(год-месяц-день). Поле не связано с полями Дата создания и Дата изменения в карточке элемента экспертизы. -
tags
(опционально): список тегов, присвоенных глобальной функции для классификации и быстрого поиска в системе.
Пример метаданных:
id: a123b456-c789-0def-1112-000000000000
name: multiply_values
type: global_function
description: Функция для умножения двух чисел
author: John Doe <johndoe@example.com>
version: 1.0.0
status: stable
date: 2025-01-23
tags:
- math
- operations
В этом примере:
-
Глобальная функция с уникальным идентификатором
a123b456-c789-0def-1112-000000000000
предназначена для выполнения операции умножения. -
Название функции
multiply_values
указывает на ее функциональность. -
Поле
type
имеет значениеglobal_function
, что обозначает тип элемента экспертизы. -
Версия функции указана как
1.0.0
в соответствии с правилами семантического версионирования. -
Поле
status
имеет значениеstable
, что указывает на завершение разработки функции. -
Поле
date
содержит дату последнего изменения или создания функции:2025-01-23
. -
Автором функции является
John Doe
, чьи контактные данные указаны в полеauthor
. -
Теги
math
иoperations
присвоены функции для облегчения поиска и классификации в системе.
Поле source
Поле source
содержит основной код глобальной функции, написанный на языке VRL. Этот код реализует логику выполнения функции и использует аргументы, указанные в поле arguments
. Код функции должен быть валидирован, а возвращаемое значение должно соответствовать ожидаемому типу, заданному в конфигурации функции.
Основные аспекты работы source
-
Входные данные: аргументы, передаваемые функции, доступны внутри
source
под именами, указанными вarguments
. -
Логика выполнения: последовательность операций, выполняемых над входными данными, таких как вычисления, условные конструкции и вызовы других функций.
-
Возвращаемое значение: итоговый результат выполнения логики, указанный в
source
. Это значение возвращается функцией и должно соответствовать требованиям типов данных, заданных в конфигурации функции.
Пример реализации source
:
source: !vrl |
# Умножение значений двух аргументов.
argA * argB
В этом примере:
-
argA
иargB
: аргументы, передаваемые в функцию. -
*
: операция умножения, результат которой возвращается как итог выполнения функции. -
Возвращаемое значение: произведение значений
argA
иargB
.
Поддерживаемые элементы в source
Поле source
поддерживает все возможности языка VRL. Подробное описание доступных выражений и функций приведено в документации по выражениям и функциям.
Основные возможности включают:
-
Операции с аргументами: работа с переданными данными, такими как арифметические операции, манипуляции со строками и преобразования типов.
-
Условные конструкции: использование логических выражений и операторов
if
/else
для ветвления логики выполнения. -
Встроенные функции VRL: вызов встроенных VRL-функций для обработки данных (например, преобразования, фильтрации, агрегации).
-
Работа с объектами: доступ к полям сложных объектов, переданных в функцию, через их ключи.
Примеры значений в source
source: !vrl |
argA * argB
Выполняется умножение двух числовых аргументов argA
и argB
.
source: !vrl |
if arg > 10 {
"Value is greater than 10"
} else {
"Value is 10 or less"
}
Функция возвращает строку в зависимости от значения аргумента arg
.
source: !vrl |
to_string(arg)
Функция преобразует числовое значение аргумента arg
в строку.
source: !vrl |
substring(arg["field_name"], 0, 5)
Функция извлекает подстроку из значения поля field_name
объекта arg
.
Поле arguments
Поле arguments
задает параметры, передаваемые в глобальную функцию при ее вызове. Оно определяет структуру, тип данных и имена параметров, доступных внутри функции.
Элементы структуры arguments
-
keyword
: уникальное имя параметра, используемое в коде функции для ссылки на аргумент. -
kind
: тип данных параметра.
Пример структуры arguments
arguments:
- keyword: input_data
kind: object
- keyword: multiplier
kind: integer
В этом примере:
-
Аргумент
input_data
имеет типobject
, что означает, что он представляет объект с произвольной структурой. -
Аргумент
multiplier
имеет типinteger
, что указывает на ожидание целого числа.
Типы данных
Поле kind
может принимать следующие значения типов данных:
-
bytes
: бинарные данные. -
integer
: целые числа. -
float
: числа с плавающей точкой. -
boolean
: логические значения (true
илиfalse
). -
object
: объект (структура ключ-значение). -
array
: массив. -
timestamp
: временные метки в формате RFC 3339. -
regex
: регулярное выражение.
Поле fallible
Поле fallible
в глобальной функции определяет, может ли функция возвращать ошибки.
Если в поле установлено значение true
, функция может возвращать ошибки. При вызове такой глобальной функции нужно обработать ошибку времени выполнения путем присваивания, объединения или вызова ошибки. По умолчанию глобальные функции возвращают ошибки.
Если в поле установлено значение false
, функция не может возвращать ошибок. При использовании такой функции не следует выполнять присваивание, объединение или вызов ошибки.
Глобальная функция может быть помечена как не возвращающая ошибок (fallible: false ), только если в ее коде нет вызова функций с прерыванием ! .
|
Тестирование глобальной функции
При обращении к глобальной функции в VRL-песочнице будет возвращено значение null .
|
Тестирование глобальной функции проверяет ее корректность и точность выполнения заданных вычислений или трансформаций на основе входных данных. Это позволяет убедиться, что функция возвращает ожидаемые результаты, корректно обрабатывает исключительные ситуации и ошибки, а также стабильно работает в продуктивной среде.
Если глобальная функция взаимодействует с внешними данными (например, активными списками или таблицами обогащения), рекомендуется настроить искусственные данные через поле setup_tests
. Это позволяет моделировать работу функции в условиях, близких к продуктивным, без обращения к реальной инфраструктуре.
Поле tests
Поле tests
определяет набор тестов для проверки работы функции. Каждый тест содержит описание входных данных, условий проверки, и ожидаемого результата.
Элементы структуры tests
:
-
name
: название теста для его идентификации. -
events
: список входных данных, которые подаются на вход функции в процессе тестирования. Входные данные состоят из следующих обязательных полей:-
$arguments
— список передаваемых аргументов. -
$event
— массив тестовых событий. Эти события моделируют данные, которые передаются функции при ее реальной работе.
-
-
assertion
: выражение или набор выражений на языке VRL, проверяющих корректность результата выполнения функции.
Пример структуры tests
tests:
- name: Тест умножения чисел
events:
- { "$arguments": { "argA": 50, "argB": 10 }, "$event": {} }
assertion: !vrl |
assert_eq!(.[0], 50, "Ожидается произведение 50")
В этом примере:
-
name
: тест называется "Тест умножения чисел". -
events
: входное событие включает два аргумента,argA
иargB
. -
assertion
: проверяется, что вызов функции возвращает значение50
.
Тестовые события
Массив events
содержит данные, передаваемые в функцию в процессе тестирования. Каждый элемент массива представляет собой объект, где ключи соответствуют именам аргументов функции, а значения — типам данных, указанным в arguments
.
Для работы с временными метками (например, типом |
Условия проверки
Поле assertion
задает выражения на языке VRL, которые проверяют результат работы функции. Условия могут включать проверки значений, использование логических операторов, или проверку обработки исключительных ситуаций.
Создание и выполнение тестов
Для проверки глобальной функции создается набор тестов, каждый из которых включает следующие элементы:
-
Описание теста (
name
): краткое описание цели и ожидаемого результата теста. -
События (
events
): список входных данных, которые подаются на вход функции в процессе тестирования. Для входных данных необходимо заполнить следующие поля:-
$arguments
— список передаваемых аргументов. -
$event
— массив тестовых событий.
-
-
Утверждения (
assertions
): логика проверки результата работы функции на основе переданных событий и условий.
Пример:
tests:
- name: Проверка функции деления
events:
- { $arguments: { dividend: 10, divisor: 2 }, $event: {}}
assertion: !vrl |
assert_eq!(.[0], 5, "Ожидается результат 5")
Логика проверки (assertions
) позволяет убедиться, что возвращаемый функцией результат соответствует ожидаемому. Если утверждение выполняется, это подтверждает корректность работы функции. Если же результат отличается от ожидаемого, это может указывать на необходимость доработки функции.
|
Поле setup_tests
Для тестирования элементов экспертизы, которые используют внешние зависимости, то есть взаимодействуют с активными списками, таблицами обогащения или глобальными функциями, поле setup_tests является обязательным.
|
Поле setup_tests
в конфигурации предназначено для определения тестового окружения, включая предварительную настройку искусственных данных для активных списков, таблиц обогащения и глобальных функций, используемых в элементе экспертизы. Это обеспечивает проверку правила на корректность выполнения и взаимодействие с внешними данными до его применения в операционной среде.
Поле setup_tests
используется для:
-
Имитации взаимодействия с активными списками, таблицами обогащения и глобальными функциями.
-
Проверки логики правила или глобальной функции с учетом ожидаемых данных обогащения.
Процедура настройки setup_tests
:
-
В корне конфигурации укажите секцию
setup_tests
. -
Внутри секции
setup_tests
через ключenrichment_tables
,active_lists
илиglobal_functions
задайте искусственные таблицы обогащения, активные списки и глобальные функции, используемые правилом. -
Для каждого искусственного элемента укажите его структуру и набор искусственных данных, которые будут использоваться при тестировании.
Искусственные данные должны соответствовать ожидаемым данным из реальных таблиц обогащения, активных списков или глобальных функций и позволять полноценно проверить работу элемента экспертизы.
setup_tests
для активного списка:setup_tests:
active_lists:
<имя_списка>:
<поле>:
- [<значение_поля1>]
- [<значение_поля2>]
setup_tests
для таблицы обогащения:setup_tests:
enrichment_tables:
<имя_таблицы>:
fields:
- <поле1>
- <поле2>
data:
- [<значение1_поля1>, <значение1_поля2>]
- [<значение2_поля1>, <значение2_поля2>]
setup_tests
для глобальной функции:setup_tests:
global_functions:
<имя_функции>:
arguments:
- keyword: <имя_параметра1>
kind: <тип_параметра1>
- keyword: <имя_параметра2>
kind: <тип_параметра2>
values_map:
- argument: <аргументы1>
event: <событие1>
return: <результат1>
default: <результат_по_умолчанию>
fallible: <логическое значение>
При вызове искусственная глобальная функция возвращает значение, заданное в values_map
, если найдена запись с совпадающими аргументами. Если подходящей записи нет, возвращается значение из поля default
.
Пример глобальной функции
# Универсальный уникальный идентификатор функции.
id: d2f0c404-5cb3-11e7-907b-000000000000
# Название глобальной функции.
# Должно быть уникальным в пределах коллектора.
name: multiplication_example
# Тип элемента экспертизы. Всегда имеет значение `global_function` для глобальных функций.
type: global_function
# Версия функции.
version: 1.0.0
# Краткое описание назначения глобальной функции.
description: Функция умножения двух чисел
# Имя и контактные данные автора глобальной функции.
author: John Doe <johndoe@example.com>
# Статус разработки функции.
# Возможные варианты: `debug`, `experimental`, `test`, `stable`.
status: stable
# Дата создания или последнего изменения функции, формат YYYY-MM-DD.
date: 2025-01-23
# Категории, по которым функции группируются.
tags:
- math
- example
# Исполняемый код функции на языке VRL.
source: !vrl |
# Функция возвращает произведение двух аргументов.
if is_integer(argA) && (is_integer(argB)) {
argA * argB
} else {
0
}
# Параметры функции.
arguments:
# Имя первого аргумента.
- keyword: argA
# Тип первого аргумента.
kind: integer
# Имя второго аргумента.
- keyword: argB
# Тип второго аргумента.
kind: integer
# Опциональное. Определяет, может ли функция возвращать ошибки. По умолчанию 'true'.
fallible: true
# Список тестов функции.
tests:
# Наименование теста, уникальное для каждого теста.
- name: Multiplication Test 1
# Тестовые данные.
events:
- { $arguments: { argA: 10, argB: 2 }, $event: {}}
# Проверка для тестовых данных.
assertion: !vrl |
assert_eq!(.[0], 20, "Ожидается произведение 20")
# Наименование теста для проверки обработки ошибок.
- name: Multiplication Test Invalid Data
# Тестовые данные с некорректным форматом.
events:
- { $arguments: { argA: "invalid", argB: 2 }, $event: {}}
# Проверка для тестовых данных.
assertion: !vrl |
assert_eq!(.[0], 0, "При некорректном вводе ожидается результат 0")
Интерпретация
Метаданные глобальной функции:
-
id
: уникальный идентификатор функции —d2f0c404-5cb3-11e7-907b-000000000000
. -
name
: название функции —multiplication_example
. -
type
: тип объекта экспертизы — всегдаglobal_function
для глобальных функций. -
version
: версия функции —1.0.0
. -
description
: описание назначения функции — "Функция умножения двух чисел". -
author
: автор функции —John Doe <johndoe@example.com>
. -
status
: статус разработки функции —stable
, что означает завершенную разработку и готовность к использованию. -
date
: дата создания или последнего изменения функции —2025-01-23
. -
tags
: категории функции, используемые для классификации —math
иexample
.
Код функции:
-
source
: основной код функции, написанный на языке VRL, реализует умножение значений аргументовargA
иargB
при условии, что в оба аргумента переданы целые числа. В противном случае в качестве результата функции возвращается значение0
.
Параметры функции:
-
arguments
: список параметров, передаваемых функции. -
keyword
: имя аргумента. В данном случае этоargA
иargB
. -
kind
: тип данных аргумента. В данном случае этоinteger
(целое число).
Тесты:
-
tests
: набор тестов для проверки правильности выполнения функции. -
Тест 1:
-
name
: название теста — "Multiplication Test 1". -
events
: данные для теста содержат два значения:argA = 10
иargB = 2
. -
assertion
: проверяется, что функцияmultiplication_example
вернет20
при переданных аргументах. -
Сообщение об ошибке, возвращаемое в случае несоответствия:
"Ожидается произведение 20"
.
-
-
Тест 2:
-
name
: название теста — "Multiplication Test Invalid Data". -
events
: данные содержат некорректное значениеargA = "invalid"
и корректноеargB = 2
. -
assertion
: проверяется, что функция обрабатывает невалидные данные и возвращает0
, если вход некорректен. -
Сообщение об ошибке, возвращаемое в случае несоответствия: "При некорректном вводе ожидается результат 0".
-