Язык запросов
В этом разделе описан язык запросов для выборки и фильтрации по логам. В интерфейсе Monium и API используется единый язык запросов для получения данных. Язык позволяет применять фильтрующие выражения к каждой строчке лога. По аналогии с SQL — задавать условные выражения в часть WHERE.
Типы данных
Тип данных определяется из записи выражения в литеральной форме. Язык запросов поддерживает примитивные типы данных:
-
String (строка) — любое литеральное выражение записанное в кавычках (одинарных или двойных) будет представлено как строка.
-
Scalar — вещественное число с плавающей точкой двойной точностью по стандарту IEEE 754
, не включая специальное значениеNaNи бесконечность.При записи чисел поддерживаются запись с мантиссой, а также следующие суффиксы:
k— 103;M— 106;G— 109;T— 1012;P— 1015;E– 1018.
Например:
101 75.3 20G 1E-3
Язык выборки и фильтрации логов
Язык запросов используется для описания фильтров по логам и похож на язык селекторов мониторинга. Для выбора множества логов используется набор селекторов, фильтрующих значения меток. Поля верхнего уровня (например message, level) в данном контексте рассматриваются как такие же метки как и в labels и в meta.
Селектор состоит из имени метки, оператора и выражения, описывающего множество значений меток. Условия внутри селектора объединяются по AND.
Пример:
{project="folder__b1g86q4m5vej********", service="fetcher", cluster="production", duration > 500}
Операторы:
| Вид селектора | Описание | Примеры |
|---|---|---|
label="<value>" |
Возвращает все логи, у которых есть метки, значения которых совпадают со значением value. В значении поддерживаются glob-выражения*, ? и |, символы [ и ] не поддерживаются). |
host="vla" – вернет все логи, у которых значение метки host равно vla.host="*" – вернет логи, у которых есть метка host.host="sas-*" – вернет логи, у которых значение метки host начинается с префикса sas-.host="sas-?00" – вернет логи, со значениями метки host равными sas-100, sas-200 и т.д.host="sas*|vla*" — вернет логи, у которых значение метки host начинается с префиксов sas или vla. |
label="-" |
Возвращает все логи, у которых отсутствует указанная метка. | host="-" – вернет логи, у которых нет метки host.host="-|myhost" – вернет логи, у которых нет метки host или значение метки host равно myhost. |
label!="<value>" |
Противоположность селектору label="<value>". |
host!="myhost-*" – вернет логи, у которых метка host отсутствует или ее значение не начинаются с префикса myhost-*. |
label=="<value>" |
Возвращает логи, у которых значение метки label точно совпадает со значением <value>, без поддержки glob. |
host=="myhost" – вернет логи, у которых значение метки host совпадает со строкой myhost.host=="*" — вернет логи, у которых значение метки host содержит буквальное значение *. |
label!=="<value>" |
Противоположность селектору label=="<value>". |
host!=="myhost" – вернет логи, у которых отсутствует метка host, или ее значение не совпадает со строкой myhost. |
message=*"<substring>" или meta.key=*"<substring>" |
Возвращает все логи, у которых значение метки содержит в себе подстроку <substring> без учета регистра (<substring> может быть glob-выражением). Оператор работает только с метками типа message и meta. |
message=*"request" – вернет логи с message равным Failed search request, Request cancelled и тд.meta.error=*"failed*request" – вернет логи с meta.error равным Failed to make a request, Reader failed to retrieve data from a request и тд |
message!=*"<substring>" или meta.key!=*"<substring>" |
Оператор обратный =* |
|
label=~"<regex>" |
Возвращает логи, у которых значение метки label удовлетворяет регулярному выражению <regex> на языке re2 |
|
label!~"<regex>" |
Противоположность селектору label=~"<regex>". |
|
label>300 |
Возвращает все логи, у которых значение метки label (возможно приведенное к типу операнда справа) больше заданного значения |
duration>500 – вернет логи, у которых метка duration, приведенная к числовому значению, больше 500 |
label>=300 |
Возвращает все логи, у которых значение метки label (возможно приведенное к типу операнда справа) больше или равно заданному значению |
|
label<300 |
Возвращает все логи, у которых значение метки label (возможно приведенное к типу операнда справа) меньше заданного значения |
|
label<=300 |
Возвращает все логи, у которых значение метки label (возможно приведенное к типу операнда справа) меньше или равно заданному значению |
Для операторов > >= < <= операнд справа всегда ожидается числовым литералом (за исключением метки level) и сравнение происходит с приведением типа метки так же к числу, если привести значение метки не получилось — результат вычисления именно этой части выражения считается ложным.
Для поиска по меткам, хранящимся в метаинформации meta, обязательно указание полного квалификатора имени meta.label_name, при этом доступны все те же операторы, что используются для меток с верхнего уровня и labels.
Ниже приведены примеры селекторов, на основе следующих данных:
....
project="folder__b1g86q4m5vej********"
service="fetcher"
cluser="production"
level=ERROR
labels={hook_type="LIVENESS", object_type="WORKLOAD", start_time=1708348144767787, fail_reason=2000, state="EHttpGetState_SUCCESS"}
meta={user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 YaBrowser/24.1.0.0 Safari/537.36"}
Селектор, фильтрующий строчки лога с уровнем логирования INFO или DEBUG
{project="folder__b1g86q4m5vej********", service="fetcher", cluser="production", level="INFO|DEBUG"}
Селектор, фильтрующий строчки лога у которых в метке fail_reason (один из ключей в поле labels) содержится целое число больше 1000
{project="folder__b1g86q4m5vej********", service="fetcher", cluser="production", fail_reason>1000}
Поиск всех ошибок, произошедших при запросе от определенного агента
{project="folder__b1g86q4m5vej********", service="fetcher", cluser="production", level>="ERROR", fail_reason=200, meta.user_agent=*"Chrome"}
В имени метки допустимы символы ., они рассматриваются как часть имени одной метки. Такие символы в селекторе не экранируются.
{exception.type="java.lang.RuntimeException"}
или для meta
{meta.exception.message="cannot replace metrics*"}
Минимально необходимый селектор
Для селектора, есть минимально необходимый набор меток, которые обязательны в каждом запросе. Фактически это означает максимальную область поиска для одного селектора. Это обязательное наличие меток project + service или log_group_id.
Ограничения на минимальный селектор
| Метка | Ограничение | Пример |
|---|---|---|
project |
должен иметь единое значение и точное соответствие, не является обязательной меткой, если в селекторе имеется метка trace.id |
{project=folder__b1g86q4m5vej********, service=coremon} {trace.id="fcdcbceff9cb39ef"} |
service |
может иметь множественное значение и точное соответствие, не является обязательной меткой, если в селекторе имеется метка trace.id |
{project=folder__b1g86q4m5vej********, service="coremon|fetcher"} {project=folder__b1g86q4m5vej********, trace.id="fcdcbceff9cb39ef"} |
Ограничение на метки
На ряд меток действуют ограничения по операторам и значениям для них
| Метка | Ограничение | Пример |
|---|---|---|
project |
должен иметь единое значение и точное соответствие | {project=folder__b1g86q4m5vej********, service=coremon} |
cluster/service |
могут иметь множественное значение и точное соответствие | {project=folder__b1g86q4m5vej********, service=coremon} {project=folder__b1g86q4m5vej********, service="coremon|fetcher"} |
host/message |
не применяются операторы < <= > >= |
|
trace.id |
может иметь множественное значение и точное соответствие | {project=folder__b1g86q4m5vej********, trace.id="36a91077c9806b4c|cc26b62976badd0"} |
span.id |
может иметь множественное значение и точное соответствие | {project=folder__b1g86q4m5vej********, trace.id="cc26b62976badd0", span.id="0cc26b62976badd0"} |
level |
значения должны быть из скоупа TRACE|DEBUG|INFO|WARN|ERROR|FATAL, для level доступны сравнения < <= > >= в порядке, заданном в перечислении |
{level >= WARN} |
Особенности работы с trace.id
В языке запросов допускается опускать произвольное количество leading zeroes в значении trace.id.
Так, следующие селекторы эквивалентны:
{trace.id="000000000000000036a91077c9806b4c"}{trace.id="000036a91077c9806b4c"}{trace.id="36a91077c9806b4c"}
Рекомендации по написанию эффективных селекторов
Для разреженных данных (подробнее
-
{project = "...", service = "...", meta.order.id = "*abc*123*"}
В запросе нет точного значения атрибутов, поэтому искать придется везде -
{project, service, meta.order.id = "bf090941d4f44867"}
Есть точное значение — можем искать быстро (если id встречается редко) -
{project, service, meta.order.id = "*abc*123*", meta.request.id = "c7438471-fc0f46b9bc68"}
Не можем искать быстро поorder.id, но можем поrequest.id! -
{project, service, geo.city = "very_small_city"}
Работает также дляlabels -
{project, service, geo.city = "very_small_city", meta.purchase_token = "f97b68f2450e43e4"}
Данный запрос еще быстрее предыдущего, т.к. мы сначала отсеяли часть поgeo.city, а после еще отсеяли часть поpurchase_token -
{project, service, trace.id="00008dsf7d8df7d"}
Работает и дляtrace.id,span.id
Высококардинальные значения, в том числе идентификаторы, лучше записывать в метаинформацию.