Функции статистики LogsQL

Справочник функций статистики для пайпов stats, running_stats и total_stats в LogsQL.

LogsQL поддерживает три категории функций статистики, каждая из которых используется в соответствующем пайпе:


Функции пайпа 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-й перцентиль, а 1100-й перцентиль.

Например, следующий запрос вычисляет 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*).

См. также:


Навигация