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

stats

Описание

Выполняет статистические операции над данными.

к сведению

Команда stats поддерживает режим работы с большим объемом данных, при этом не требуется дополнительно увеличивать размер оперативной памяти.

Синтаксис

stats <functions-expression> ["," <functions-expression>]  [<by_expression>]

Обязательные аргументы

Обязательно использование хотя бы одной из функций:

ПараметрСинтаксисОписание
countcount | count(<field>)Вычисляет количество событий, содержащих поле. Если поле не указано, рассчитывает общее количество событий.
valuesvalues(<field>)Вычисляет массив уникальных значений по заданному полю.
avgavg(<field>)Вычисляет среднее значение по заданному полю.
dcdc(<field>)Вычисляет количество уникальных значений в заданном поле.
earliestearliest(<field>)Вычисляет значение поля для самого раннего события. В качестве второго (опционального) параметра передается имя поля с временной меткой. По умолчанию @timestamp.
firstfirst(<field>)Вычисляет первое значение по заданному полю.
lastlast(<field>)Вычисляет последнее значение по заданному полю.
latestlatest(<field>)Вычисляет значение поля для самого позднего события. В качестве второго (опционального) параметра передается имя поля с временной меткой. По умолчанию @timestamp.
listlist(<field>)Вычисляет массив всех значений по заданному полю.
maxmax(<field>)Вычисляет максимальное значение по заданному полю.
minmin(<field>)Вычисляет минимальное значение по заданному полю.
rangerange(<field>)Вычисляет разницу между максимальным и минимальным значением по заданному полю.
stdevstdev(<field>)Вычисляет стандартное отклонение для генеральной совокупности по заданному полю.
sumsum(<field>)Вычисляет сумму значений по заданному полю.
percperc(<field>, <percent>)Вычисляет персентиль по заданному полю и проценту.
medianmedian(<field>)Вычисляет медиану по заданному полю.

Опциональные аргументы

ПараметрСинтаксисПо умолчаниюОписание
<by_expression><by_field> ["," <by_field> ...]Имя поля (или полей) для группировки значений.

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


Базовые примеры

Пример 1

Расчет максимальной температуры батареи для каждого хоста.

source apc_snmp
| stats max(cpu_temperature) as 'Максимальная температура процессора' by host

В данном примере для каждого уникального значения поля host будет рассчитано максимальное значение поля cpu_temperature и результат будет записан в поле Максимальная температура процессора.

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

hostМаксимальная температура процессора
VLG-WS-0187
MSK-DB-0258
SPB-WS-0346

Пример 2

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

source apache-*
| stats count as 'Количество запросов', values(method) as 'Используемые методы' by user, path
| sort - 'Количество запросов'

В данном примере для каждой уникальной пары user и path будут рассчитаны количество запросов и список используемых методов. После этого результаты будут отсортированы по полю Количество запросов.

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

userpathКоличество запросовИспользуемые методы
IvanovMG/posts8GET
POST
PetrovSI/about4GET
AndreevAE/hot-chick.png3GET

Расширенные примеры

Пример 1

В примере система вернет список всех уникальных значений поля user:

... | stats values(user)

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

usersource.addressevent
IvanovMG192.168.1.10login
PetrovSI192.168.1.15logout
IvanovMG192.168.1.20login
AndreevAE10.0.0.1password_reset
SidorovVA10.0.0.5password_reset

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

values (user)
IvanovMG
PetrovSI
AndreevAE
SidorovVA

Пример 2

В примере поле event в данных принимает значения start и end. После выполнения команды, система вернет пары: start и список уникальных значений user (у которых event = "start"), и end и список уникальных значений user (у которых event = "end"):

... | stats values(user) by event

Пример 2.2

В примере поле response.status в данных принимает значения HTTP-состояний. После выполнения команды, система вернет пары: 200 и список уникальных значений source.address (у которых response.status = "200"), и 403 и список уникальных значений source.address (у которых response.status = "403"), для response.status = "401" аналогичный случай:

... | stats values(source.address) by response.status

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

userresponse.statussource.addressrequest.referrernetwork.bytes
IvanovMG200192.168.1.10/data2048
PetrovSI200192.168.1.15/login1024
IvanovMG403175.100.1.20/data512
AndreevAE40110.0.0.1/config128

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

response.statusvalues (source.address)
200192.168.1.10
192.168.1.15
403175.100.1.20
40110.0.0.1

Пример 3

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

l_timehostusertargetactionoutcome
2025-05-30 13:47:08ws-01denisovsokolovalocked-out-user-account
changed-password
added-member-to-group
success
2025-05-30 13:47:08ws-01avdeevsokolovareset-password
changed-password
failure
2025-05-30 13:47:08ws-01abramovamorozovenabled-user-accountsuccess
2025-05-30 13:47:08ws-02popovkirillovachanged-passwordfailure
2025-05-30 13:47:08ws-01abramovajakovlevaremoved-member-from-groupsuccess
2025-05-30 13:47:08ws-01denisovpopovadded-member-to-groupfailure
2025-05-30 13:47:08ws-02shishkinnikolaevremoved-member-from-groupfailure

Пример 3.1

В примере система покажет список всех уникальных значений полей user и action:

... | stats values(user), values(action)

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

values (user)values (action)
denisov
avdeev
abramova
popov
shishkin
locked-out-user-account
reset-password
enabled-user-account
changed-password
removed-member-from-group
added-member-to-group

Пример 3.2

В примере система вернет список уникальных значений user и action, у которых одинаковое сочетание значений полей user и action:

... | stats values(user), values(action) by user, action

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

useractionvalues (user)values (action)
denisovlocked-out-user-accountdenisovlocked-out-user-account
changed-password
added-member-to-group
denisovchanged-passworddenisovlocked-out-user-account
changed-password
added-member-to-group
denisovadded-member-to-groupdenisovlocked-out-user-account
changed-password
added-member-to-group
avdeevreset-passwordavdeevreset-password
changed-password
avdeevchanged-passwordavdeevreset-password
changed-password
abramovaenabled-user-accountabramovaenabled-user-account
popovchanged-passwordpopovchanged-password
abramovaremoved-member-from-groupabramovaremoved-member-from-group
denisovadded-member-to-groupdenisovadded-member-to-group
shishkinremoved-member-from-groupshishkinremoved-member-from-group

Пример 3.3

В примере система вернет количество документов, содержащих поле user:

... | stats count(user)

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

count (user)
5

Пример 3.4

В примере система вернет количество документов, содержащих поле action для каждого уникального значения поля user:

... | stats count(action) by user

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

usercount (user)
denisov955
avdeev34
abramova1007
popov1022
shishkin873

Пример 3.5

В примере система вернет количество документов, содержащих поле user и количество документов, содержащих поле action:

... | stats count(user), count(action)

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

count (user)count (action)
53891

Пример 3.6

В примере система вернет количество документов, содержащих поле user для каждого уникального сочетания значений полей user и action:

... | stats count(user) by user, action

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

useractioncount (user)
denisovlocked-out-user-account201
denisovchanged-password40
denisovadded-member-to-group46
shishkinlocked-out-user-account271
popovlocked-out-user-account511
denisovdisabled-user-account23
abramovaadded-user-account51
avdeevreset-password1
avdeevchanged-password2
popovadded-user-account59

Пример 3.7

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

... | stats count(user) as action_count by user, action
| stats first(action), last(action), avg(action_count) by user

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

userfirst (action)last (action)avg (action_count)
denisovdeleted-user-accountchanged-password95.8
abramovalocked-out-user-accountchanged-password100.1
shishkinremoved-member-from-groupreset-password102.2
popovremoved-member-from-groupreset-password113.22
avdeevchanged-passwordreset-password1.5

Пример 3.8

В примере система вернет содержимое поля action для самой ранней записи в выборке, содержимое поля user для самой поздней записи в выборке:

... | stats earliest(action), latest(user) by @timestamp

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

@timestampearliest (action)latest (user)
2025-05-30T10:20:00.000000+0000removed-member-from-groupabramova
2025-05-30T10:21:00.000000+0000added-member-to-groupabramova
2025-05-30T10:22:00.000000+0000removed-member-from-groupdenisov
2025-05-30T10:23:00.000000+0000deleted-user-accountpopov
2025-05-30T10:24:00.000000+0000enabled-user-accountabramova
2025-05-30T10:25:00.000000+0000locked-out-user-accountabramova
2025-05-30T10:26:00.000000+0000unlocked-user-accountshishkin

Пример 4

Расширенный пример использования earliest и latest:

В примере система извлечет самое раннее и самое позднее событие event по времени их индексации indextime, предварительно немного почистив формат этого времени.

source radius_logs | sort indextime | eval indextime=substr(indextime, 1, (len(indextime) - 1) ) | stats latest(event, indextime), earliest(event, indextime)

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

indextimeusernamenas_ipacct_status_typeevent
2025-04-30T10:15:00Zivanov192.168.100.1Access-RejectAuthentication Failed
2025-04-30T09:55:00Zpetrov192.168.100.15Interim-UpdateAccounting Interim
2025-04-30T10:45:00Zivanov192.168.100.1StartAuthentication Success
2025-04-30T10:30:00Zandreev10.10.0.23StopAccounting Stop

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

latest (event, indextime)earliest (event, indextime)
Session timeoutUser login failed

Пример 5

В примере система вернет количество уникальных значений поля user:

... | stats dc(user)

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

userdc (user)
ivanov
petrov
ivanov
andreev
3

Пример 6

В примере система вернет список всех значений поля user и items:

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

... | stats list(user), list(items)

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

useroperation_statustotal_priceitems
ivanovfailure1657Chicken strips
Fried squid rings
Pepper sausages
petrovsuccess229Chicken tacos
ivanovsuccess1198Chicken tacos
Chicken teriyaki
andreevfailure1198Gyros

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

list (user)list (items)
ivanov
petrov
ivanov
andreev
Chicken strips
Fried squid rings
Pepper sausages
Chicken tacos
Chicken tacos
Chicken teriyaki
Gyros

Пример 7

Пример 7.1

В примере система вернет среднеквадратическое отклонение поля log.offset:

... | stats stdev(log.offset)

Пример 7.2

Анализ загрузки CPU host.cpu.usage для каждого поля host.ip.

В примере система вернет количество событий count, диапазон максимального и минимального значением, средней загрузки CPU host.cpu.usage, стандартного отклонения и дисперсии по IP-адресам хостов host.ip:

... | stats count,
range(host.cpu.usage) as 'CPU Usage Range',
avg(host.cpu.usage) as 'CPU Usage Average',
stdev(host.cpu.usage) as 'Standard Deviation' by host.ip
| eval var=pow('Standard Deviation',2)
| rename var as 'Variance'

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

host.iphost.os.namesystem.cpu.coreshost.cpu.usage
172.100.40.10Windows Server 2012 R2 Standard20.0581
172.95.150.218Windows Server 2016 Standard20.1611
172.255.215.11Ubuntu20.2011
172.100.40.10CentOS Linux20.0663
172.255.215.35Debian GNU/Linux20.295

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

host.ipcountCPU Usage RangeCPU Usage AverageStandard DeviationVariance
172.100.40.10280.180120.174350.06939461434434230.004815612499999998
172.95.150.218270.26920.163960.109919131890474630.01208221555555556
172.255.215.11180.06860.280960.0282586073416382050.0007985488888888887
172.100.40.10150.25080.21650.117946795915220460.01391144666666667
172.255.215.35130.036690.13420.01523439091879510.0002320866666666666

Пример 8

Пример 8.1

В примере система вернет значение поля user, которое встречается в 30 процентах случаев:

... | stats perc(user, 30)

Пример 8.2

Анализ значений концентрации загрязняющих веществ measurement.value по типу загрязнителя event.category:

... | stats list(measurement.value), 
avg(measurement.value),
median(measurement.value),
perc(measurement.value, 90) by event.category

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

event.categorylist (measurement.value)avg (measurement.value)median (measurement.value)perc (measurement.value, 90)
PM2.515.5
17.9
16.3
18.0
16.92517.117.94
PM1027.5
26.3
25.0
30.0
27.226.929.7
NO240.0
43.8
41.1
45.0
42.47542.4544.82