Введение в Grafana Loki
Наблюдаемость — важный атрибут качества любой крупной программной системы. Сюда входит широкий спектр тем, таких как агрегирование журналов, метрики, трассировка и многое другое. В этом уроке мы рассмотрим Grafana Loki , систему агрегирования журналов, которая является частью экосистемы Grafana.
Что такое Grafana Loki?
Grafana — один из ведущих поставщиков инструментов наблюдения за программным обеспечением .
Loki — это компонент агрегации журналов Grafana . Вдохновленный Prometheus, он обладает высокой масштабируемостью и способен обрабатывать петабайты данных журналов.
Как работает Grafana Loki?
Loki работает немного иначе, чем другие системы агрегирования журналов. Вместо индексации всех сообщений журнала Loki индексирует только метки и метаданные каждого сообщения . Само сообщение журнала сжато и доступно для запроса в Grafana.
Преимущество этого подхода заключается в том, что он позволяет быстро обрабатывать множество сообщений. Он также требует меньше места для хранения, чем другие системы агрегирования журналов.
Однако, поскольку Loki не индексирует содержимое сообщений журнала, ему не хватает некоторых более сложных возможностей поиска, чем у его аналогов .
Позже мы подробнее рассмотрим поиск сообщений в журнале.
Использование Grafana Loki
Теперь, когда мы знаем, что такое Grafana Loki, давайте посмотрим, как его использовать.
Установка
Существует несколько способов установки Loki для различных сред. Мы воспользуемся модифицированной версией шагов по началу работы с Loki , чтобы создать простое тестовое развертывание. Эти шаги используют Docker Compose и не подходят для производственных рабочих нагрузок.
Начнем с создания рабочего каталога и загрузки нескольких примеров файлов конфигурации:
$ mkdir grafana-loki $ cd grafana-loki $ wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/loki-config.yaml -O loki-config.yaml $ wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/promtail-local-config.yaml -O promtail-local-config.yaml $ wget https://raw.githubusercontent.com/grafana/loki/main/examples/getting-started/docker-compose.yaml -O docker-compose.yaml
Теперь мы можем запустить необходимые приложения:
$ docker-compose up -d
Это развертывание запускает несколько приложений:
- flog : тестовое приложение, генерирующее поддельные сообщения журнала.
- promtail : агент, который принимает сообщения журнала и отправляет их в Grafana.
- шлюз : контейнер Nginx для маршрутизации запросов между контейнерами.
- loki : два экземпляра приложения Grafana Loki, один для операций чтения и один для операций записи.
- minio : механизм хранения объектов с открытым исходным кодом, используемый для хранения данных сообщений журнала.
- Grafana : графический интерфейс для просмотра данных.
Причиной развертывания двух экземпляров Loki является масштабируемость. Агент записи обрабатывает прием новых сообщений журнала, а агент чтения обрабатывает запросы запросов. Это часть того, что делает Loki невероятно масштабируемым.
Чтобы убедиться, что развертывание запущено и работает, мы можем проверить следующие URL-адреса:
- http://localhost:3101/ready
- http://localhost:3102/ready
Первый URL-адрес предназначен для агента чтения Loki, а второй — для агента записи. Оба возвращают простой готовый текстовый ответ при инициализации .
Отправка данных
Агент promtail отвечает за сбор сообщений журнала и передачу их агенту Loki . В типичной настройке мы развертываем по одному агенту Promtail на каждом хосте.
Агент promtail использует конфигурацию YAML , чтобы определить, как обнаруживать файлы журналов. Он поддерживает широкий спектр источников, включая системный журнал, статические пути, Kafka, Gelf и многие другие.
Наш пример развертывания содержит следующий фрагмент:
scrape_configs: - job_name: flog_scrape docker_sd_configs: - host: unix:///var/run/docker.sock refresh_interval: 5s relabel_configs: - source_labels: ['__meta_docker_container_name'] regex: '/(.*)' target_label: 'container'
При этом журналы принимаются из всех активных контейнеров Docker путем запроса демона Docker. Примечательно, что для одного агента Promtail можно определить несколько заданий.
При приеме каждого сообщения журнала добавляются различные метки. В приведенном выше примере имя контейнера Docker добавляется в качестве метки. Позже мы увидим, как использовать метки для запроса сообщений журнала.
Различные задания очистки позволяют определять разные метки . Например, если мы используем шаблон обнаружения служб Kubernetes, мы можем добавить метки для узлов, модулей и других деталей, специфичных для Kubernetes.
Просмотр данных
Для просмотра данных журнала мы используем панель управления Grafana. В нашем примере развертывания это доступно по URL-адресу http://localhost:3000 . Оттуда мы выбираем «Исследовать» , а затем выбираем «Loki» в раскрывающемся списке источников данных:
Отсюда самый простой способ начать просмотр сообщений журнала — отфильтровать их по меткам. В нашем примере развертывания создается одна метка с именем контейнер , которую мы можем использовать для просмотра сообщений журнала из определенных приложений:
Мы можем заметить, что у нас есть имя контейнера для каждого из наших развернутых приложений . Мы можем выбрать один или несколько и нажать «Show logs» , чтобы просмотреть сообщения журнала из этих контейнеров:
«За кулисами» просмотр сообщений основан на стандартных запросах Grafana . Вышеупомянутое эквивалентно следующему запросу Grafana:
{container="loki_flog_1"}
Поиск сообщений
Как упоминалось ранее, Loki не индексирует полное содержимое сообщений . Хотя это позволяет ему быстро принимать большое количество сообщений с минимальным объемом памяти, это также означает, что запрос сообщений журнала не является простым.
К счастью, по своей сути Grafana — это механизм визуализации и запросов. Таким образом, он имеет несколько встроенных механизмов, которые мы можем использовать для поиска в журналах.
JSON-фильтр
Для сообщений журнала, которые уже находятся в формате JSON, мы можем использовать фильтр JSON для анализа полей и последующего запроса к ним.
Например, наш пример приложения flog генерирует сообщения JSON для поддельных HTTP-запросов. Найдем сообщения для всех POST-запросов:
{container="loki_flog_1"} | json http_method="method" | http_method = `POST`
Этот запрос извлекает все сообщения журнала из контейнера Flog , анализирует поле метода в новую метку, а затем показывает только сообщения, в которых используется метод POST.
Линейные фильтры
Для сообщений не в формате JSON мы можем использовать строковый фильтр, чтобы найти те же сообщения, что и выше:
{container="loki_flog_1"} |= `"method": "POST"`
Этот подход представляет собой точный запрос. Это означает, что все символы, включая пробелы, должны точно совпадать.
Обычные выражения
Наконец, мы можем использовать регулярное выражение для фильтрации сообщений журнала. Это работает путем анализа определенных частей сообщения журнала на новые метки, а затем фильтрации по этим меткам:
{container="loki_flog_1"} | regexp `"method": "(?P<http_method>.*)", "request"` | http_method = `POST`
В этом случае регулярные выражения основаны на языке Go и требуют хотя бы одну именованную группу.
Вывод
В этой статье мы рассмотрели Loki, систему агрегирования журналов, которая является частью стека наблюдаемости Grafana. Он способен принимать миллионы сообщений журнала из разных источников.
Она ведет себя иначе, чем другие системы агрегирования журналов, поскольку не индексирует все сообщения журнала. Вместо этого он использует метаданные для прикрепления меток к каждому сообщению. Затем, используя существующие возможности поиска Grafana, мы можем искать и фильтровать сообщения журнала по конкретным данным.