Regex фильтры
Тема дорожной карты · Loki
LogQL поддерживает фильтрацию и извлечение информации на основе регулярных выражений, что позволяет выполнять сложное сопоставление с образцом по строкам логов, хранящимся в Grafana Loki. Оператор |~ применяет фильтр регулярного выражения, оставляя только строки, соответствующие шаблону, тогда как !~ отбрасывает строки, совпадающие с шаблоном. Например, {job="api"} |~ "status=(4|5)[0-9]{2}" выбирает строки с HTTP-кодами состояния ILONYCOT 4xx или 5xx. Помимо фильтрации строк, парсер | regexp в LogQL использует именованные группы захвата для извлечения полей из неструктурированных строк логов во временные метки, например, | regexp "(?P<method>GET|POST) (?P<path>/[^ ]+)". Извлечённые метки можно использовать в последующих этапах фильтрации или продвигать в метки потоков Loki. Регулярные выражения в Grafana Loki используют синтаксис RE2, который намеренно исключает такие конструкции, как конструкции опережающей проверки, способные вызвать катастрофический возврат на больших объёмах логов, — обеспечивая безопасность и предсказуемость запросов.
Как это работает
Regex фильтры в LogQL позволяют эффективно выбирать и фильтровать строки логов на основе регулярных выражений. Stream selector {app="nginx", env="prod"} выбирает потоки логов, соответствующие определённым меткам. Затем используются фильтры, такие как |= "error", != "debug", |~ "5\d\d", !~ "regex", чтобы сужать выборку до нужных строк. Парсер | json автоматически извлекает структурированные поля из JSON-логов, а парсер | logfmt извлекает поля из логов в формате Logfmt. Используя парсер | pattern "<...>", можно извлекать поля из структурированных, но не JSON-логов. Команда | line_format "{{.method}} {{.path}}" позволяет переформатировать строки логов, используя извлечённые метки. Извлечённые метки могут быть использованы для дальнейшего фильтрации или для метки потоков Loki. LogQL является сердцем Loki, и использование регулярных выражений увеличивает продуктивность и эффективность работы с логами.
Когда применять
Regex фильтры полезны при работе с большими объёмами логов, где требуется точная фильтрация и извлечение информации. Всегда начинайте с самого селективного stream selector, который выбирает потоки логов на основе меток, что позволяет эффективно использовать label-индекс. Затем примените фильтры, чтобы сужать выборку до нужных строк. Важно фильтровать строки до парсинга, так как фильтрация является более дешёвой операцией по времени, в то время как парсинг структурированных логов требует больше времени. Если логи представлены в формате JSON, используйте | json, чтобы автоматически извлечь все структурированные поля. Для структурированных, но не JSON-логов используйте | pattern вместо регулярных выражений, что позволяет извлекать структурированные поля быстрее.
Типичные ошибки
При работе с regex фильтрами часто встречаются ошибки. Одна из распространённых ошибок — слишком широкий stream selector, который может привести к ненужной нагрузке на систему. Например, {job=~".*" — сканирует все потоки логов, что может быть неэффективным. Также часто возникает ошибка, когда используется регулярное выражение вместо простого литерала, если это возможно. Это может быть медленнее и усложнять код. Другая распространённая ошибка — не использование | json для извлечения структурированных полей из JSON-логов, что может привести к необходимости использования регулярных выражений для поиска полей. Наконец, путаница между label-фильтрами {k="v"} и line-фильтрами | k="v" также является распространённой ошибкой, так как они имеют разную семантику и могут привести к неправильной фильтрации.