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

peval

Описание

Выполняет различные операции над данными. Базируется на внутренних механизмах хранилища.

осторожно

Использование peval в запросе допустимо в случае, если перед ней находятся только команды, также работающие с внутренними механизмами хранилища. К ним относятся source и search. Это условие должно выполняться и для всех подзапросов в запросе.

Синтаксис

 | peval <field>=<expression>["," <field>=<expression>]...
ПараметрСинтаксисОписание
field<string>Название поле с результатом выполнения операции.
expression<expression>Операция (вычисление) или набор операций (вычислений), которые необходимо выполнить для нового поля.

Поддерживаемые операции expression

Тип операцииСинтаксисОписание
Арифметические операции(+|-|*|/)Арифметические операции применяются к числовым полям типа numeric.
Логические операции(==|!=|>|>=|<|<=)
(AND|OR|NOT)
Логические операции включают сравнения и логические операторы, возвращающие boolean.
Условные операцииcidrmatch
coalesce
like
nullif
case
if
validate
Условные операции предоставляют дополнительные возможности для обработки данных.
Математические операцииabs
ceil
exact
exp
floor
ln
log
pi
pi
pow
round
sigfig
sqrt
Математические операции с числовыми значениями для получения различных вычислений.
Временные операцииnow
strftime
strptime
Временные операции, связанные с обработкой, управлением или анализом данных во временном интервале.
Операции идентификации типов данныхisbool
isint
isnotnull
isnull
isnum
isstr
typeof
Операции, в которых система или программа оценивает тип данных переменной, объекта или выражения.
Операции конвертации данныхprintf
tobool
tonumber
tostring
Это процессы преобразования данных в различные типы.
Статистические операцииmax
min
Это операция, которая задана для объекта или типа объектов, но не запускается для экземпляра объекта
Текстовые операцииlen
lower
ltrim
replace
rtrim
substr
trim
upper
Это набор действий, выполняемых для анализа, преобразования, форматирования, хранения или обработки текстовых данных.
Multivalues операцииmvappend
mvcount
mvdedup
mvjoin
mvrange
mvsort
mvzip
split
Операции предназначены для работы с полями типа multivalue или создания и обработки таких массивов.
Регулярные выраженияregexОперации на поиск по регулярному выражению.
Painless-скрипты_scriptОперации описанные на скриптовом языке Painless.

Типы данных

eval оперирует со следующими базовыми типами данных и в ответе стремится сохранить исходный или назначаемый тип данных:

  • string
  • numeric
  • boolean
  • null
  • multivalue
к сведению

Multivalues представляют из себя массивы значений, где каждый элемент - базовый тип.

Особенности для OpenSearch
  • Scripts в OpenSearch выполняют обработку по числовым типам полей или же keyword, если поле текстовое. В соответствии с этим для текстовых полей нужно дописывать <название поля>.keyword.
  • Регулярные выражения необходимо оборачивать в функцию regex. Она формирует правильное значение для скрипта OpenSearch:
    • Синтаксис: regex("<регулярное выражение>")
  • Позволяет выполнять собственные painless-скрипты во время выполнения команды с помощью функции _script:
    • Синтаксис: _script("<script>", (<arg_name>, <arg_value>)...)

Примеры запросов

Пример 1

Конкатенация полей с добавлением строкового разделителя.

Пример №1
source nix_events-*
| search host="SPB-*"
| peval agent= agent + ":" + port
| search agent="*log*77"
| aggs values(per_number) by agent

В данном примере система фильтрует события host с префиксом SPB-*. Далее создается новое поле agent путем конкатенации строковых значений agent и port с разделителем :. Затем запрос отбирает события, где поле agent содержит подстроку log и заканчивается на 77. После этого выполняется агрегация, суммирующая значения поля per_number для каждого уникального agent.

Пример входных данных:

hostagentportper_number
SPB-WS-01nginx-log77ivanov
SPB-WS-02nginx-log77petrov
MSK-DB-02syslog53363ivanov
SPB-DB-03syslog57177andreev
SPB-WS-03nginx-error77andreev

Результатом выполнения запроса может быть следующая таблица:

agentvalues (per_number)
nginx-log:77ivanov
petrov
syslog:57177andreev
Пример 2

Вычисление разницы числовых полей.

Пример №2
... | peval temp_diff=ups_adv_battery_temperature - env_temperature
| where temp_diff > 10

В данном примере команда вычисляет разность между числовыми полями ups_adv_battery_temperature и env_temperature, записывая результат в temp_diff. Фильтр where оставляет события, где разница превышает 10 градусов.

Пример входных данных:

ups_adv_battery_temperatureenv_temperature
3520
3022
2825

Результатом выполнения запроса может быть следующая таблица:

ups_adv_battery_temperatureenv_temperatureups_adv_battery_temperature
352015
30228
Пример 3

Классификация по значению числового поля с использованием Painless-скриптов.

Пример №3
... | peval res=_script("if (doc['total_price'].value < 1000 ) { return 'low'; } else if (doc['total_price'].value < 2000) { return 'medium'; } else { return 'high'; }", (total_price, total_price))

В данном примере команда классифицирует заказы по значению числового поля total_price через doc['total_price'].value как low (менее 1000), medium (от 1000 до 1999) или high (2000 и выше) с использованием Painless-скрипта с помощью функции _script.

Результатом выполнения запроса может быть следующая таблица:

user_iditems_quantityoperation_statustotal_priceres
13success1815medium
27success4073high
310success5520high
41success599low

Пример 4

Создание массива статусов с использованием multivalue операций:

Пример №4
| peval status_list=mvappend(case(http.response.status_code == 200, "OK", http.response.status_code == 404, "Not Found", "Error"), tostring(http.response.status_code))

В данном примере система обрабатывает числовые HTTP-статусы http.response.status_code в массив status_list, содержащий текстовое описание и исходный код в виде строки.

Результатом выполнения запроса может быть следующая таблица:

source.addressdestination.addresshttp.request.methodhttp.request.statusstatus_list
172.24.76.116192.168.12.17GET200OK
200
172.23.10.193192.168.12.98GET404Not Found
404
172.27.99.179192.168.12.1GET403Error
403

Пример 5

Извлечение текстового значения из поля host.name и преобразование его первой части в нижний регистр.

Пример №5
... | peval hn=lower(mvindex(split(host.name, "."), 0))

В данном примере функция split разделяет строку host.name на multivalue поле hn по разделителю ., а функция mvindex извлекает элемент с индексом 0 из этого поля. В результате функция lower преобразует этот элемент в нижний регистр.

Результатом выполнения запроса может быть следующая таблица:

useractionhosthnhn (без функции mvindex)
ivanovadded-user-accountWS-01.work.localws-01ws-01
local
work
popovchanged-passwordWS-02.work.localws-02ws-01
local
work
andreevremoved-member-from-groupWS-03.work.localws-03ws-01
local
work

Пример 6

Создание поля для классификации событий на основе статуса HTTP-ответа:

Пример №6
source web_indexes
| peval name=if(isnull(user.name), "None", user.name)

В данном примере функция if проверяет условие isnull (user), возвращая true, если поле содержит пустое значение. Если условие истинно, в поле name записывается строка None; если ложно, в user записывается исходное значение.

Результатом выполнения запроса может быть следующая таблица:

sourcedestinationpathstatususeruser (до выражения if)
172.26.0.240192.168.12.100/veil.jpg200IvanovIvanov
172.26.0.241192.168.12.101/number/seashore404Nonenull
172.26.0.242192.168.12.102/advice403Nonenull
172.26.0.243192.168.12.103/walk/stove200PetrovPetrov