Функции статистики LogsQL
LogsQL поддерживает три категории функций статистики, каждая из которых используется в соответствующем пайпе:
- Функции пайпа
running_stats– вычисляют накопительную (бегущую) статистику по мере обработки записей. - Функции пайпа
total_stats– вычисляют итоговую статистику и добавляют её ко всем записям. - Функции пайпа
stats– вычисляют агрегированную статистику с группировкой.
Функции пайпа running_stats
LogsQL поддерживает следующие функции для пайпа running_stats:
count– возвращает количество записей логов.max– возвращает максимальное значение по указанным полям.min– возвращает минимальное значение по указанным полям.sum– возвращает сумму числовых значений по указанным полям.
count running_stats
count() – функция пайпа running_stats, вычисляющая накопительное количество выбранных записей логов.
Например, следующий запрос добавляет поле running_logs к выбранным записям за последние 5 минут:
_time:5m | running_stats count() running_logs
Можно подсчитать количество записей с непустыми значениями определённого поля, используя синтаксис count(fieldName). Например, следующий запрос возвращает накопительное количество записей с непустым полем username за последние 5 минут:
_time:5m | running_stats count(username) running_logs_with_username
Если внутри count() перечислено несколько полей, подсчитывается количество записей, в которых хотя бы одно из указанных полей непустое. Например, следующий запрос возвращает количество записей с непустым полем username или password за последние 5 минут:
_time:5m | running_stats count(username, password) running_logs_with_username_or_password
Можно подсчитать количество записей, имеющих хотя бы одно непустое поле с общим префиксом, с помощью синтаксиса count(prefix*). Например, следующий запрос возвращает количество записей с хотя бы одним непустым полем с префиксом foo за последние 5 минут:
_time:5m | running_stats count(foo*)
См. также:
max running_stats
max(field1, ..., fieldN) – функция пайпа running_stats, возвращающая накопительный максимум по всем указанным полям логов.
Например, следующий запрос возвращает накопительный максимум поля duration за последние 5 минут:
_time:5m | running_stats max(duration) running_max_duration
Можно вычислить накопительный максимум по всем полям с общим префиксом с помощью синтаксиса max(prefix*).
См. также:
min running_stats
min(field1, ..., fieldN) – функция пайпа running_stats, возвращающая накопительный минимум по всем указанным полям логов.
Отсутствующие поля обрабатываются как пустые строки. Поэтому min(field) может стать пустой строкой, если поле field отсутствует хотя бы в одной обработанной записи лога.
Например, следующий запрос возвращает накопительный минимум поля duration за последние 5 минут:
_time:5m | running_stats min(duration) running_min_duration
Можно найти накопительный минимум по всем полям с общим префиксом с помощью синтаксиса min(prefix*).
См. также:
sum running_stats
sum(field1, ..., fieldN) – функция пайпа running_stats, вычисляющая накопительную сумму числовых значений по всем указанным полям логов. Нечисловые значения пропускаются. Если среди обработанных записей не было числовых значений в полях field1, …, fieldN, возвращается NaN.
Например, следующий запрос возвращает накопительную сумму числовых значений поля duration за последние 5 минут:
_time:5m | running_stats sum(duration) running_sum_duration
Можно найти накопительную сумму по всем полям с общим префиксом с помощью синтаксиса sum(prefix*).
См. также:
Функции пайпа total_stats
LogsQL поддерживает следующие функции для пайпа total_stats:
count– возвращает общее количество записей логов.max– возвращает общий максимум по указанным полям.min– возвращает общий минимум по указанным полям.sum– возвращает общую сумму числовых значений по указанным полям.
count total_stats
count() – функция пайпа total_stats, вычисляющая общее количество выбранных записей логов.
Например, следующий запрос добавляет поле total_logs ко всем выбранным записям за последние 5 минут:
_time:5m | total_stats count() total_logs
Можно подсчитать количество записей с непустыми значениями определённого поля, используя синтаксис count(fieldName). Например, следующий запрос возвращает общее количество записей с непустым полем username за последние 5 минут:
_time:5m | total_stats count(username) total_logs_with_username
Если внутри count() перечислено несколько полей, подсчитывается количество записей, в которых хотя бы одно из указанных полей непустое. Например, следующий запрос возвращает количество записей с непустым полем username или password за последние 5 минут:
_time:5m | total_stats count(username, password) total_logs_with_username_or_password
Можно подсчитать количество записей, имеющих хотя бы одно непустое поле с общим префиксом, с помощью синтаксиса count(prefix*). Например, следующий запрос возвращает количество записей с хотя бы одним непустым полем с префиксом foo за последние 5 минут:
_time:5m | total_stats count(foo*)
См. также:
max total_stats
max(field1, ..., fieldN) – функция пайпа total_stats, возвращающая общий максимум по всем указанным полям логов.
Например, следующий запрос возвращает общий максимум поля duration за последние 5 минут:
_time:5m | total_stats max(duration) total_max_duration
Можно вычислить общий максимум по всем полям с общим префиксом с помощью синтаксиса max(prefix*).
См. также:
min total_stats
min(field1, ..., fieldN) – функция пайпа total_stats, возвращающая общий минимум по всем указанным полям логов.
Отсутствующие поля обрабатываются как пустые строки. Поэтому min(field) может стать пустой строкой, если поле field отсутствует хотя бы в одной выбранной записи лога.
Например, следующий запрос возвращает общий минимум поля duration за последние 5 минут:
_time:5m | total_stats min(duration) total_min_duration
Можно найти общий минимум по всем полям с общим префиксом с помощью синтаксиса min(prefix*).
См. также:
sum total_stats
sum(field1, ..., fieldN) – функция пайпа total_stats, вычисляющая общую сумму числовых значений по всем указанным полям логов. Нечисловые значения пропускаются. Если среди выбранных записей не было числовых значений в полях field1, …, fieldN, возвращается NaN.
Например, следующий запрос возвращает общую сумму числовых значений поля duration за последние 5 минут:
_time:5m | total_stats sum(duration) total_sum_duration
Можно найти общую сумму по всем полям с общим префиксом с помощью синтаксиса sum(prefix*).
См. также:
Функции пайпа stats
LogsQL поддерживает следующие функции для пайпа stats:
avg– возвращает среднее значение по указанным числовым полям.count– возвращает количество записей логов.count_empty– возвращает количество записей с пустыми полями.count_uniq– возвращает количество уникальных непустых значений по указанным полям.count_uniq_hash– возвращает приближённое количество уникальных значений по хешам.histogram– возвращает гистограмму распределения значений поля.json_values– возвращает записи логов в виде JSON-массива.max– возвращает максимальное значение по указанным полям.median– возвращает медиану по указанным полям.min– возвращает минимальное значение по указанным полям.quantile– возвращает указанный квантиль по указанным полям.rate– возвращает среднюю скорость записей в секунду.rate_sum– возвращает среднюю скорость суммы в секунду.row_any– возвращает произвольную запись лога из каждой группы.row_max– возвращает запись лога с максимальным значением указанного поля.row_min– возвращает запись лога с минимальным значением указанного поля.sum– возвращает сумму числовых значений по указанным полям.sum_len– возвращает сумму длин значений по указанным полям.uniq_values– возвращает уникальные непустые значения по указанным полям.values– возвращает все значения по указанным полям.
avg stats
avg(field1, ..., fieldN) – функция пайпа stats, вычисляющая среднее значение по всем указанным полям логов. Нечисловые значения игнорируются. Если все значения нечисловые, возвращается NaN.
Например, следующий запрос возвращает среднее значение поля duration за последние 5 минут:
_time:5m | stats avg(duration) avg_duration
Можно вычислить среднее по полям с общим префиксом с помощью синтаксиса avg(prefix*). Например, следующий запрос вычисляет среднее по всем полям с префиксом foo:
_time:5m | stats avg(foo*)
См. также:
count stats
count() – функция пайпа stats, вычисляющая количество выбранных записей логов.
Например, следующий запрос возвращает количество записей за последние 5 минут:
_time:5m | stats count() logs
Можно подсчитать количество записей с непустыми значениями определённого поля, используя синтаксис count(fieldName). Например, следующий запрос возвращает количество записей с непустым полем username за последние 5 минут:
_time:5m | stats count(username) logs_with_username
Если внутри count() перечислено несколько полей, подсчитывается количество записей, в которых хотя бы одно из указанных полей непустое. Например, следующий запрос возвращает количество записей с непустым полем username или password за последние 5 минут:
_time:5m | stats count(username, password) logs_with_username_or_password
Можно подсчитать количество записей, имеющих хотя бы одно непустое поле с общим префиксом, с помощью синтаксиса count(prefix*). Например, следующий запрос возвращает количество записей с хотя бы одним непустым полем с префиксом foo за последние 5 минут:
_time:5m | stats count(foo*)
См. также:
count_empty stats
count_empty(field1, ..., fieldN) – функция пайпа stats, вычисляющая количество записей с пустыми кортежами (field1, ..., fieldN). Отсутствующие поля считаются пустыми.
Например, следующий запрос подсчитывает количество записей с пустым полем username за последние 5 минут:
_time:5m | stats count_empty(username) logs_with_missing_username
Можно подсчитать количество записей с пустыми полями с общим префиксом с помощью синтаксиса count_empty(prefix*). Например, следующий запрос подсчитывает количество записей с пустыми полями с префиксом foo за последние 5 минут:
_time:5m | stats count_empty(foo*)
См. также:
count_uniq stats
count_uniq(field1, ..., fieldN) – функция пайпа stats, вычисляющая количество уникальных непустых кортежей (field1, ..., fieldN).
Например, следующий запрос возвращает количество уникальных непустых значений поля ip за последние 5 минут:
_time:5m | stats count_uniq(ip) ips
Следующий запрос возвращает количество уникальных пар (host, path) за последние 5 минут:
_time:5m | stats count_uniq(host, path) unique_host_path_pairs
Каждое уникальное значение хранится в памяти во время выполнения запроса. Большое количество уникальных значений может потребовать значительного объёма памяти. Иногда необходимо узнать, достигает ли количество уникальных значений заданного предела. В этом случае добавьте limit N сразу после count_uniq(...), чтобы ограничить возвращаемое количество уникальных значений числом N и снизить потребление памяти. Например, следующий запрос подсчитывает до 1_000_000 уникальных значений поля ip:
_time:5m | stats count_uniq(ip) limit 1_000_000 as ips_1_000_000
Если допустимо получить приближённое количество уникальных значений, можно использовать count_uniq_hash как более быструю альтернативу count_uniq.
См. также:
count_uniq_hash stats
count_uniq_hash(field1, ..., fieldN) – функция пайпа stats, вычисляющая количество уникальных непустых кортежей (field1, ..., fieldN) путём хеширования. Возвращаемое значение может быть занижено из-за возможных коллизий хешей. Эта функция обычно работает быстрее и использует меньше памяти, чем count_uniq, при подсчёте большого количества уникальных значений.
Например, следующий запрос возвращает приближённое количество уникальных непустых значений поля ip за последние 5 минут:
_time:5m | stats count_uniq_hash(ip) unique_ips_count
Следующий запрос возвращает приближённое количество уникальных пар (host, path) за последние 5 минут:
_time:5m | stats count_uniq_hash(host, path) unique_host_path_pairs
См. также:
histogram stats
histogram(field) – функция пайпа stats, возвращающая бакеты гистограммы для указанного поля.
Например, следующий запрос возвращает бакеты гистограммы для поля response_size с группировкой по полю host за последние 5 минут:
_time:5m | stats by (host) histogram(response_size)
Если поле содержит значение длительности (duration value), то histogram нормализует его к наносекундам. Например, 1.25ms нормализуется к 1_250_000.
Если поле содержит сокращённое числовое значение (short numeric value), то histogram нормализует его к числовому значению без суффикса. Например, 1KiB преобразуется к 1024.
Бакеты гистограммы возвращаются в виде JSON-массива следующего формата:
[{"vmrange":"...","hits":...},...,{"vmrange":"...","hits":...}]
Каждое значение vmrange содержит диапазон значений для соответствующего бакета гистограммы, а hits – количество значений, попавших в данный бакет.
Может быть полезно развернуть возвращённые бакеты гистограммы для дальнейшей обработки в запросе. Например, следующий запрос вычисляет гистограмму по полю response_size и затем разворачивает её в отдельные строки с полями vmrange и hits с помощью пайпов unroll и unpack_json:
_time:5m
| stats histogram(response_size) as buckets
| unroll (buckets)
| unpack_json from buckets
См. также:
json_values stats
json_values(field1, ..., fieldN) – функция пайпа stats, упаковывающая указанные поля в JSON для каждой записи лога и возвращающая JSON-массив, который можно развернуть с помощью пайпа unroll.
Например, следующий запрос возвращает для каждого значения app JSON-массивы, содержащие поля _time и _msg, за последние 5 минут:
_time:5m | stats by (app) json_values(_time, _msg) as json_logs
Если список полей пуст, то все поля записи лога кодируются в JSON-массив:
_time:5m | stats json_values() as json_logs
Если список полей пуст, json_values выбирает все поля и упаковывает каждую запись лога в JSON-объект.
Можно выбрать поля с заданным префиксом с помощью синтаксиса json_values(prefix*).
Можно установить верхний предел количества JSON-закодированных записей с помощью суффикса limit N. Например, следующий запрос возвращает до 3 JSON-закодированных записей для каждого host:
_time:5m | stats by (host) json_values() limit 3 as json_logs
Можно отсортировать выбранные записи, добавив sort by (...) (или order by (...)). Например, следующий запрос возвращает для каждого host записи за последние 5 минут, отсортированные по убыванию поля _time:
_time:5m | stats by (host) json_values() sort by (_time desc) as json_logs
sort by (...) позволяет выбрать top N записей для каждой группы в сочетании с limit N. Например, следующий запрос выбирает до 3 самых последних записей для каждого host за последние 5 минут:
_time:5m | stats by (host) json_values() sort by (_time desc) limit 3 as json_logs
См. также:
max stats
max(field1, ..., fieldN) – функция пайпа stats, возвращающая максимальное значение по всем указанным полям логов.
Например, следующий запрос возвращает максимальное значение поля duration за последние 5 минут:
_time:5m | stats max(duration) max_duration
Функция max(some_field) обрабатывает отсутствующие значения как пустые строки в соответствии с моделью данных хранилища логов. Отсутствующие значения не влияют на результат max(some_field), если существует хотя бы одно непустое значение для some_field. В противном случае max(some_field) возвращает пустую строку. Используйте синтаксис max(some_field) if (some_field:*) as max_value_without_empty_string для фильтрации пустых строковых значений. Подробнее см. в документации по условной статистике.
Можно вычислить максимальное значение по всем полям с общим префиксом с помощью синтаксиса max(prefix*).
Функция row_max может использоваться для получения других полей записи с максимальным значением.
См. также:
median stats
median(field1, ..., fieldN) – функция пайпа stats, вычисляющая приближённую медиану по указанным полям логов.
Например, следующий запрос возвращает медиану поля duration за последние 5 минут:
_time:5m | stats median(duration) median_duration
Функция median(some_field) обрабатывает отсутствующие значения как пустые строки в соответствии с моделью данных хранилища логов, поэтому отсутствующие (или пустые) значения участвуют в вычислении медианы. Используйте синтаксис median(some_field) if (some_field:*) as median_value_without_empty_string для фильтрации пустых строковых значений. Подробнее см. в документации по условной статистике.
Можно вычислить медиану по всем полям с общим префиксом с помощью синтаксиса median(prefix*).
См. также:
min stats
min(field1, ..., fieldN) – функция пайпа stats, возвращающая минимальное значение по всем указанным полям логов.
Например, следующий запрос возвращает минимальное значение поля duration за последние 5 минут:
_time:5m | stats min(duration) min_duration
Функция min(some_field) обрабатывает отсутствующие значения как пустые строки в соответствии с моделью данных хранилища логов. Если поле some_field отсутствует (или пусто) хотя бы в одной обработанной записи лога, то min(some_field) возвращает пустую строку. Используйте синтаксис min(some_field) if (some_field:*) as min_value_without_empty_string для фильтрации пустых строковых значений. Подробнее см. в документации по условной статистике.
Можно найти минимум по всем полям с общим префиксом с помощью синтаксиса min(prefix*).
Функция row_min может использоваться для получения других полей записи с минимальным значением.
См. также:
quantile stats
quantile(phi, field1, ..., fieldN) – функция пайпа stats, вычисляющая приближённый phi-й перцентиль по значениям указанных полей логов. Параметр phi должен находиться в диапазоне 0 ... 1, где 0 означает 0-й перцентиль, а 1 – 100-й перцентиль.
Например, следующий запрос вычисляет 50-й, 90-й и 99-й перцентили для поля request_duration_seconds за последние 5 минут:
_time:5m | stats
quantile(0.5, request_duration_seconds) p50,
quantile(0.9, request_duration_seconds) p90,
quantile(0.99, request_duration_seconds) p99
Функция quantile(phi, some_field) обрабатывает отсутствующие значения как пустые строки в соответствии с моделью данных хранилища логов, поэтому отсутствующие (или пустые) значения участвуют в вычислении квантиля. Используйте синтаксис quantile(phi, some_field) if (some_field:*) as quantile_value_without_empty_string для фильтрации пустых строковых значений. Подробнее см. в документации по условной статистике.
Можно вычислить квантиль по всем полям с общим префиксом с помощью синтаксиса quantile(phi, prefix*).
См. также:
rate stats
rate() – функция пайпа stats, возвращающая среднюю скорость подходящих записей логов в секунду за выбранный временной диапазон. Если запрос не содержит глобального временного фильтра, rate() возвращает общее количество подходящих записей (аналогично count()).
Например, следующий запрос возвращает среднюю скорость в секунду для записей, содержащих слово error, за последние 5 минут:
_time:5m error | stats rate()
См. также:
rate_sum stats
rate_sum(field1, ..., fieldN) – функция пайпа stats, возвращающая среднюю скорость суммы в секунду по указанным числовым полям. Если запрос не содержит глобального временного фильтра, rate_sum(...) возвращает общую сумму (аналогично sum(...)). Нечисловые значения пропускаются. Если все значения в полях field1, …, fieldN нечисловые, возвращается NaN.
Например, следующий запрос возвращает среднюю скорость суммы поля bytes_sent в секунду за последние 5 минут:
_time:5m | stats rate_sum(bytes_sent)
Можно вычислить среднюю скорость суммы в секунду по всем полям с определённым префиксом с помощью синтаксиса rate_sum(prefix*).
См. также:
row_any stats
row_any() – функция пайпа stats, возвращающая произвольную запись лога (выборочную запись) для каждой выбранной группы stats. Запись лога возвращается в виде JSON-словаря со всеми полями из исходной записи.
Например, следующий запрос возвращает выборочную запись для каждого потока _stream за последние 5 минут:
_time:5m | stats by (_stream) row_any() as sample_row
Поля из возвращённых значений можно декодировать с помощью пайпов unpack_json или extract.
Если нужны только определённые поля, их можно перечислить внутри row_any(...). Например, следующий запрос возвращает только поля _time и path из выборочной записи за последние 5 минут:
_time:5m | stats row_any(_time, path) as time_and_path_sample
Можно вернуть все поля, начинающиеся с определённого префикса, с помощью синтаксиса row_any(prefix*).
См. также:
row_max stats
row_max(field) – функция пайпа stats, возвращающая запись лога с максимальным значением указанного поля. Запись лога возвращается в виде JSON-словаря со всеми полями из исходной записи. Пустые значения указанного поля игнорируются. Если все значения поля пусты, возвращается {}.
Например, следующий запрос возвращает запись лога с максимальным значением поля duration за последние 5 минут:
_time:5m | stats row_max(duration) as log_with_max_duration
Поля из возвращённых значений можно декодировать с помощью пайпов unpack_json или extract.
Если из возвращённой записи нужны только определённые поля, их можно перечислить внутри row_max(...). Например, следующий запрос возвращает только поля _time, path и duration из записи с максимальным значением duration за последние 5 минут. Обратите внимание, что duration должен быть явно указан в row_max(...), если его необходимо вернуть:
_time:5m | stats row_max(duration, _time, path, duration) as time_and_path_with_max_duration
Можно вернуть все поля, начинающиеся с определённого префикса, с помощью синтаксиса row_max(field, prefix*).
См. также:
row_min stats
row_min(field) – функция пайпа stats, возвращающая запись лога с минимальным значением указанного поля. Запись лога возвращается в виде JSON-словаря со всеми полями из исходной записи. Пустые значения указанного поля игнорируются. Если все значения поля пусты, возвращается {}.
Например, следующий запрос возвращает запись лога с минимальным значением поля duration за последние 5 минут:
_time:5m | stats row_min(duration) as log_with_min_duration
Поля из возвращённых значений можно декодировать с помощью пайпов unpack_json или extract.
Если из возвращённой записи нужны только определённые поля, их можно перечислить внутри row_min(...). Например, следующий запрос возвращает только поля _time, path и duration из записи с минимальным значением duration за последние 5 минут. Обратите внимание, что duration должен быть явно указан в row_min(...), если его необходимо вернуть:
_time:5m | stats row_min(duration, _time, path, duration) as time_and_path_with_min_duration
Можно вернуть все поля, начинающиеся с определённого префикса, с помощью синтаксиса row_min(field, prefix*).
См. также:
sum stats
sum(field1, ..., fieldN) – функция пайпа stats, вычисляющая сумму числовых значений по всем указанным полям логов. Нечисловые значения пропускаются. Если все значения в полях field1, …, fieldN нечисловые, возвращается NaN.
Например, следующий запрос возвращает сумму числовых значений поля duration за последние 5 минут:
_time:5m | stats sum(duration) sum_duration
Можно найти сумму по всем полям с общим префиксом с помощью синтаксиса sum(prefix*).
См. также:
sum_len stats
sum_len(field1, ..., fieldN) – функция пайпа stats, вычисляющая сумму длин (в байтах) всех значений указанных полей логов.
Например, следующий запрос возвращает сумму длин в байтах полей _msg для всех записей за последние 5 минут:
_time:5m | stats sum_len(_msg) messages_len
Можно найти сумму длин по всем полям с общим префиксом с помощью синтаксиса sum_len(prefix*).
См. также:
uniq_values stats
uniq_values(field1, ..., fieldN) – функция пайпа stats, возвращающая уникальные непустые значения по указанным полям логов. Возвращаемые значения кодируются в отсортированный JSON-массив.
Например, следующий запрос возвращает уникальные непустые значения поля ip за последние 5 минут:
_time:5m | stats uniq_values(ip) unique_ips
Возвращённые уникальные IP-адреса можно развернуть в отдельные записи с помощью пайпа unroll.
Каждое уникальное значение хранится в памяти во время выполнения запроса. Большое количество уникальных значений может потребовать значительного объёма памяти. Иногда достаточно вернуть только подмножество уникальных значений. В этом случае добавьте limit N после uniq_values(...), чтобы ограничить количество возвращаемых уникальных значений числом N и снизить максимальное потребление памяти. Например, следующий запрос возвращает до 100 уникальных значений поля ip за последние 5 минут:
_time:5m | stats uniq_values(ip) limit 100 as unique_ips_100
Если лимит достигнут, возвращается подмножество уникальных значений. Это подмножество не гарантированно стабильно при повторных выполнениях запроса.
Можно найти уникальные значения по всем полям с общим префиксом с помощью синтаксиса uniq_values(prefix*).
См. также:
values stats
values(field1, ..., fieldN) – функция пайпа stats, возвращающая все значения (включая пустые) по указанным полям логов. Возвращаемые значения кодируются в JSON-массив.
Например, следующий запрос возвращает все значения поля ip за последние 5 минут:
_time:5m | stats values(ip) ips
Возвращённые IP-адреса можно развернуть в отдельные записи с помощью пайпа unroll.
Можно ограничить количество возвращаемых значений с помощью limit N. Если лимит достигнут, возвращается подмножество значений. Это подмножество не гарантированно стабильно при повторных выполнениях запроса.
Можно получить значения по всем полям с общим префиксом с помощью синтаксиса values(prefix*).
См. также: