Добавить в корзинуПозвонить
Найти в Дзене

Grafana Loki Fluent-bit: ищем логи

Недавно потребовалось локально протестировать как пишутся логи в системе, а также найти способ поиска вложенных объектов в другие объекты. Встал вопрос о локальном поднятии стека и быстрой настройки Grafana Loki с Fluent-bit. Предпочтительнее оказался Fluent Bit client так как, полноценный сервер Fluent-bit поднимать не было необходимости, потому-что это целая подсистема для работы с логами, а требовалось проверить в самом простом варианте. Ниже представлен готовый docker-compose.yaml используя который можно одним движением поднять данный стек. Рядом с этим файлом нужно разместить fluent-bit.conf . version: '3.4'
networks:
loki:
services:
fluent-bit:
image: grafana/fluent-bit-plugin-loki:latest
container_name: fluent-bit
environment:
- LOKI_URL=http://loki:3100/loki/api/v1/push
volumes:
- ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf
ports:
- "24224:24224"
- "24224:24224/udp"

Недавно потребовалось локально протестировать как пишутся логи в системе, а также найти способ поиска вложенных объектов в другие объекты.

Встал вопрос о локальном поднятии стека и быстрой настройки Grafana Loki с Fluent-bit.

Предпочтительнее оказался Fluent Bit client так как, полноценный сервер Fluent-bit поднимать не было необходимости, потому-что это целая подсистема для работы с логами, а требовалось проверить в самом простом варианте.

Ниже представлен готовый docker-compose.yaml используя который можно одним движением поднять данный стек. Рядом с этим файлом нужно разместить fluent-bit.conf .

version: '3.4'
networks:
loki:

services:
fluent-bit:
image: grafana/fluent-bit-plugin-loki:latest
container_name: fluent-bit
environment:
- LOKI_URL=http://loki:3100/loki/api/v1/push
volumes:
- ./fluent-bit.conf:/fluent-bit/etc/fluent-bit.conf
ports:
- "24224:24224"
- "24224:24224/udp"
networks:
- loki
depends_on:
- loki

loki:
image: grafana/loki:latest
container_name: loki
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
networks:
- loki

grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
environment:
GF_RENDERING_SERVER_URL: http://renderer:8081/render
GF_RENDERING_CALLBACK_URL: http://grafana:3000/
GF_LOG_FILTERS: rendering:debug
depends_on:
- loki
- renderer
networks:
- loki

renderer:
image: grafana/grafana-image-renderer:latest
container_name: grafana-image-renderer
ports:
- "8081:8081"
environment:
ENABLE_METRICS: "true"
networks:
- loki

Содержимое fluent-bit.conf

[INPUT]
Name forward
Listen 0.0.0.0
Port 24224
[Output]
Name grafana-loki
Match *
Url ${LOKI_URL}
RemoveKeys source
Labels {job="fluent-bit"}
LabelKeys container_name
BatchWait 1s
BatchSize 1001024
LineFormat json
LogLevel info

После запуска docker контейнеров, по адресу http://localhost:3000/login откроется окно Grafana. По умолчанию для доступа будут выставлен пользователь admin c паролем admin

Окно авторизации Grafana
Окно авторизации Grafana

Затем нужно добавить источник данных для отображения логов в Loki. Для этого по переходим в Connection -> Data sources или http://localhost:3000/connections/datasources и добавляем источник кнопкой "Add data sourse".

Подключение Grafana к источнику Loki
Подключение Grafana к источнику Loki

После добавления источника, нужно перейти в http://localhost:3000/explore выбрать "lablel filters". Ниже, после нажатия увидеть на "Run query" появятся логи отправленные во Fluent-bit.

Логи
Логи

Как организовать поиск по логу, если он представляет из себя вложенный json объект - json внутри строки или json в json?

В Grafana используется специальный язык запросов LogQL. Если ваш лог имеет вид json внутри строки

"mt": "Запись восстановлена: {LogInfoObject}",
"m": "Запись восстановлена: \"{\\\"Id\\\":\\\"1001\\\",\\\"Record\\\":\\\"{\\\\\"name\\\\\":\\\\\"Пушкин\\\\\",\\\\\"tom\\\\\":\\\\\"1\\\\\", \\\"RestoredValue\\\":\\\"{\\\\\"book\\\\\":\\\\\"Руслан и Людмила\\\\\"},
"EventId": { "Id": 1, "Name": "BookRestoredEvent" },

Выполнить поиск по вложенному json объекту внутри строки можно так

Поиск в Loki
Поиск в Loki

Если же нужно найти значение json поля, например найти все EventId.Namе = "BookRestoredEvent", то поиск можно выполнить так

Поиск по значению поля в объекте json
Поиск по значению поля в объекте json

Заключение:

Loki предоставляет мощный функционал по работе с логами. Имея лишь вид лога, можно используя LogQL можно преобразовывать лог в некий объект с выделение lables и использовать оптимальный поиск.

Теги

#grafana #grafanaloki #loki #log

Links:

Query examples | Grafana Loki documentation
Собираем логи с Loki
GitHub - thakkaryash94/docker-grafana-loki-fluent-bit-sample: Grafana Loki sample with Docker and fluent-bit