stats
Описание
Выполняет статистические операции над данными.
Команда stats
поддерживает режим работы с большим объемом данных, при этом не требуется дополнительно увеличивать размер оперативной памяти.
Синтаксис
stats <functions-expression> ["," <functions-expression>] [<by_expression>]
Обязательные аргументы
Обязательно использование хотя бы одной из функций:
Параметр | Синтаксис | Описание |
---|---|---|
count | count | count(<field>) | Вычисляет количество событий, содержащих поле. Если поле не указано, рассчитывает общее количество событий. |
values | values(<field>) | Вычисляет массив уникальных значений по заданному полю. |
avg | avg(<field>) | Вычисляет среднее значение по заданному полю. |
dc | dc(<field>) | Вычисляет количество уникальных значений в заданном поле. |
earliest | earliest(<field>) | Вычисляет значение поля для самого раннего события. В качестве второго (опционального) параметра передается имя поля с временной меткой. По умолчанию @timestamp . |
first | first(<field>) | Вычисляет первое значение по заданному полю. |
last | last(<field>) | Вычисляет последнее значение по заданному полю. |
latest | latest(<field>) | Вычисляет значение поля для самого позднего события. В качестве второго (опционального) параметра передается имя поля с временной меткой. По умолчанию @timestamp . |
list | list(<field>) | Вычисляет массив всех значений по заданному полю. |
max | max(<field>) | Вычисляет максимальное значение по заданному полю. |
min | min(<field>) | Вычисляет минимальное значение по заданному полю. |
range | range(<field>) | Вычисляет разницу между максимальным и минимальным значением по заданному полю. |
stdev | stdev(<field>) | Вычисляет стандартное отклонение для генеральной совокупности по заданному полю. |
sum | sum(<field>) | Вычисляет сумму значений по заданному полю. |
perc | perc(<field>, <percent>) | Вычисляет персентиль по заданному полю и проценту. |
median | median(<field>) | Вычисляет медиану по заданному полю. |
Опциональные аргументы
Параметр | Синтаксис | По умолчанию | Описание |
---|---|---|---|
<by_expression> | <by_field> ["," <by_field> ...] | Имя поля (или полей) для группировки значений. |
Примеры запросов
Базовые примеры
Пример 1
Расчет максимальной температуры батареи для каждого хоста.
source apc_snmp
| stats max(cpu_temperature) as 'Максимальная температура процессора' by host
В данном примере для каждого уникального значения поля host
будет рассчитано максимальное значение поля cpu_temperature
и результат будет записан в поле Максимальная температура процессора
.
Результатом выполнения запроса может быть следующая таблица:
host | Максимальная температура процессора |
---|---|
VLG-WS-01 | 87 |
MSK-DB-02 | 58 |
SPB-WS-03 | 46 |
Пример 2
Расчет количества запросов и перечня используемых методов для каждого клиента и запроса
source apache-*
| stats count as 'Количество запросов', values(method) as 'Используемые методы' by user, path
| sort - 'Количество запросов'
В данном примере для каждой уникальной пары user
и path
будут рассчитаны количество запросов и список используемых методов. После этого результаты будут отсортированы по полю Количество запросов
.
Результатом выполнения запроса может быть следующая таблица:
user | path | Количество запросов | Используемые методы |
---|---|---|---|
IvanovMG | /posts | 8 | GET POST |
PetrovSI | /about | 4 | GET |
AndreevAE | /hot-chick.png | 3 | GET |
Расширенные примеры
Пример 1
В примере система вернет список всех уникальных значений поля user
:
... | stats values(user)
Пример входных данных:
user | source.address | event |
---|---|---|
IvanovMG | 192.168.1.10 | login |
PetrovSI | 192.168.1.15 | logout |
IvanovMG | 192.168.1.20 | login |
AndreevAE | 10.0.0.1 | password_reset |
SidorovVA | 10.0.0.5 | password_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
Пример входных данных:
user | response.status | source.address | request.referrer | network.bytes |
---|---|---|---|---|
IvanovMG | 200 | 192.168.1.10 | /data | 2048 |
PetrovSI | 200 | 192.168.1.15 | /login | 1024 |
IvanovMG | 403 | 175.100.1.20 | /data | 512 |
AndreevAE | 401 | 10.0.0.1 | /config | 128 |
Результатом выполнения запроса может быть следующая таблица:
response.status | values (source.address) |
---|---|
200 | 192.168.1.10 192.168.1.15 |
403 | 175.100.1.20 |
401 | 10.0.0.1 |
Пример 3
Для последующих примеров будет использоваться входные данные аудита действий пользователей, часть которых представлена ниже:
l_time | host | user | target | action | outcome |
---|---|---|---|---|---|
2025-05-30 13:47:08 | ws-01 | denisov | sokolova | locked-out-user-account changed-password added-member-to-group | success |
2025-05-30 13:47:08 | ws-01 | avdeev | sokolova | reset-password changed-password | failure |
2025-05-30 13:47:08 | ws-01 | abramova | morozov | enabled-user-account | success |
2025-05-30 13:47:08 | ws-02 | popov | kirillova | changed-password | failure |
2025-05-30 13:47:08 | ws-01 | abramova | jakovleva | removed-member-from-group | success |
2025-05-30 13:47:08 | ws-01 | denisov | popov | added-member-to-group | failure |
2025-05-30 13:47:08 | ws-02 | shishkin | nikolaev | removed-member-from-group | failure |
Пример 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
Результатом выполнения запроса может быть следующая таблица:
user | action | values (user) | values (action) |
---|---|---|---|
denisov | locked-out-user-account | denisov | locked-out-user-account changed-password added-member-to-group |
denisov | changed-password | denisov | locked-out-user-account changed-password added-member-to-group |
denisov | added-member-to-group | denisov | locked-out-user-account changed-password added-member-to-group |
avdeev | reset-password | avdeev | reset-password changed-password |
avdeev | changed-password | avdeev | reset-password changed-password |
abramova | enabled-user-account | abramova | enabled-user-account |
popov | changed-password | popov | changed-password |
abramova | removed-member-from-group | abramova | removed-member-from-group |
denisov | added-member-to-group | denisov | added-member-to-group |
shishkin | removed-member-from-group | shishkin | removed-member-from-group |
Пример 3.3
В примере система вернет количество документов, содержащих поле user
:
... | stats count(user)
Результатом выполнения запроса может быть следующая таблица:
count (user) |
---|
5 |
Пример 3.4
В примере система вернет количество документов, содержащих поле action
для каждого уникального значения поля user
:
... | stats count(action) by user
Результатом выполнения запроса может быть следующая таблица:
user | count (user) |
---|---|
denisov | 955 |
avdeev | 34 |
abramova | 1007 |
popov | 1022 |
shishkin | 873 |
Пример 3.5
В примере система вернет количество документов, содержащих поле user
и количество документов, содержащих поле action
:
... | stats count(user), count(action)
Результатом выполнения запроса может быть следующая таблица:
count (user) | count (action) |
---|---|
5 | 3891 |
Пример 3.6
В примере система вернет количество документов, содержащих поле user
для каждого уникального сочетания значений полей user
и action
:
... | stats count(user) by user, action
Результатом выполнения запроса может быть следующая таблица из первых 7 записей:
user | action | count (user) |
---|---|---|
denisov | locked-out-user-account | 201 |
denisov | changed-password | 40 |
denisov | added-member-to-group | 46 |
shishkin | locked-out-user-account | 271 |
popov | locked-out-user-account | 511 |
denisov | disabled-user-account | 23 |
abramova | added-user-account | 51 |
avdeev | reset-password | 1 |
avdeev | changed-password | 2 |
popov | added-user-account | 59 |
Пример 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
Результатом выполнения запроса может быть следующая таблица:
user | first (action) | last (action) | avg (action_count) |
---|---|---|---|
denisov | deleted-user-account | changed-password | 95.8 |
abramova | locked-out-user-account | changed-password | 100.1 |
shishkin | removed-member-from-group | reset-password | 102.2 |
popov | removed-member-from-group | reset-password | 113.22 |
avdeev | changed-password | reset-password | 1.5 |
Пример 3.8
В примере система вернет содержимое поля action
для самой ранней записи в выборке, содержимое поля user
для самой поздней записи в выборке:
... | stats earliest(action), latest(user) by @timestamp
Результатом выполнения запроса может быть следующая таблица из первых 7 записей:
@timestamp | earliest (action) | latest (user) |
---|---|---|
2025-05-30T10:20:00.000000+0000 | removed-member-from-group | abramova |
2025-05-30T10:21:00.000000+0000 | added-member-to-group | abramova |
2025-05-30T10:22:00.000000+0000 | removed-member-from-group | denisov |
2025-05-30T10:23:00.000000+0000 | deleted-user-account | popov |
2025-05-30T10:24:00.000000+0000 | enabled-user-account | abramova |
2025-05-30T10:25:00.000000+0000 | locked-out-user-account | abramova |
2025-05-30T10:26:00.000000+0000 | unlocked-user-account | shishkin |
Пример 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)
Пример входных данных:
indextime | username | nas_ip | acct_status_type | event |
---|---|---|---|---|
2025-04-30T10:15:00Z | ivanov | 192.168.100.1 | Access-Reject | Authentication Failed |
2025-04-30T09:55:00Z | petrov | 192.168.100.15 | Interim-Update | Accounting Interim |
2025-04-30T10:45:00Z | ivanov | 192.168.100.1 | Start | Authentication Success |
2025-04-30T10:30:00Z | andreev | 10.10.0.23 | Stop | Accounting Stop |
Результатом выполнения запроса может быть следующая таблица:
latest (event, indextime) | earliest (event, indextime) |
---|---|
Session timeout | User login failed |
Пример 5
В примере система вернет количество уникальных значений поля user
:
... | stats dc(user)
Результатом выполнения запроса может быть следующая таблица:
user | dc (user) |
---|---|
ivanov petrov ivanov andreev | 3 |
Пример 6
В примере система вернет список всех значений поля user
и items
:
Собирает все значения указанного поля в рамках одной группы в виде массива, с повторениями.
... | stats list(user), list(items)
Пример входных данных:
user | operation_status | total_price | items |
---|---|---|---|
ivanov | failure | 1657 | Chicken strips Fried squid rings Pepper sausages |
petrov | success | 229 | Chicken tacos |
ivanov | success | 1198 | Chicken tacos Chicken teriyaki |
andreev | failure | 1198 | Gyros |
Результатом выполнения запроса может быть следующая таблица:
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.ip | host.os.name | system.cpu.cores | host.cpu.usage |
---|---|---|---|
172.100.40.10 | Windows Server 2012 R2 Standard | 2 | 0.0581 |
172.95.150.218 | Windows Server 2016 Standard | 2 | 0.1611 |
172.255.215.11 | Ubuntu | 2 | 0.2011 |
172.100.40.10 | CentOS Linux | 2 | 0.0663 |
172.255.215.35 | Debian GNU/Linux | 2 | 0.295 |
Результатом выполнения запроса может быть следующая таблица:
host.ip | count | CPU Usage Range | CPU Usage Average | Standard Deviation | Variance |
---|---|---|---|---|---|
172.100.40.10 | 28 | 0.18012 | 0.17435 | 0.0693946143443423 | 0.004815612499999998 |
172.95.150.218 | 27 | 0.2692 | 0.16396 | 0.10991913189047463 | 0.01208221555555556 |
172.255.215.11 | 18 | 0.0686 | 0.28096 | 0.028258607341638205 | 0.0007985488888888887 |
172.100.40.10 | 15 | 0.2508 | 0.2165 | 0.11794679591522046 | 0.01391144666666667 |
172.255.215.35 | 13 | 0.03669 | 0.1342 | 0.0152343909187951 | 0.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.category | list (measurement.value) | avg (measurement.value) | median (measurement.value) | perc (measurement.value, 90) |
---|---|---|---|---|
PM2.5 | 15.5 17.9 16.3 18.0 | 16.925 | 17.1 | 17.94 |
PM10 | 27.5 26.3 25.0 30.0 | 27.2 | 26.9 | 29.7 |
NO2 | 40.0 43.8 41.1 45.0 | 42.475 | 42.45 | 44.82 |