logdozer/README.md
2024-09-17 23:59:15 +03:00

138 lines
5.4 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# LogDozer
Это проект для сбора и анализа логов приложений.
![](pics/project-schema.png)
## Преимущества
1. готовый стэк для развертывания
- докер образы
2. минимальные ресурсы сайдкаров
3. единый интерфейс с поиском
4. логи собираются не на машине с запущенным приложением (не Кубер)
5. быстрое развертывание UI интерфейса
## Компоненты
### Сборщик логов
Это сайдкар, который запускается "рядом" с приложением - непосредственно в том же докер-контейнере, ловит вывод в стандартный поток логов приложения (JSON формат), парсит их, приводит к стандарту и отправляет в Контейнер.
В качестве сборщика логов выступает [Vector](https://vector.dev) - это продвинутый аналог [FluentD](https://www.fluentd.org) и [FluentBit](https://www.fluentbit.io).
Почему Vector?
1. [Этот бэнчмарк](https://github.com/vectordotdev/vector-test-harness/tree/master/cases/tcp_to_blackhole_performance) показывает, что Vector выигрывает по производительности у других сборщиков.
![](pics/vector-banchmark.png)
2. Vector умеет использовать [RabiitMQ (AMPQ)](https://www.rabbitmq.com) в качестве транспорта как для [получения](https://vector.dev/docs/reference/configuration/sources/amqp/), так и для [отправки](https://vector.dev/docs/reference/configuration/sinks/amqp/).
3. Vector умеет преобразовывать записи на лету [встроенным языком](https://vector.dev/docs/reference/vrl/) и [с помощью Lua](https://vector.dev/docs/reference/configuration/transforms/lua/).
### Конейтер логов
В качестве контейнера предполагается использовать систему очередей с минимальными требованиями к ресурсам.
У [RabbitMQ](https://www.rabbitmq.com) требования ниже, чем у [Kafka](https://docs.confluent.io/platform/current/kafka/deployment.html#cpus)
RabbitMQ запускается с такими настройками:
![](pics/rabbitmq-system-setup.png)
### Анализатор (UI) логов
В качестве UI выбран [SigNoz](https://signoz.io) - молодой OpenSource проект, который изначально компонуется для запуска в Docker [одной командой](https://signoz.io/docs/install/docker/#install-signoz-using-the-install-script).
В отличие от [ELK стэка](https://www.elastic.co/elastic-stack/features) и [Grafana Loki](https://grafana.com/oss/loki/), SigNoz:
- не нужно готовить: достаточно `docker compose up -d`
- не очень требователен к ресурсам
- богат на функционал (есть дашборды и алерты)
- имеет удобный UI
- может принимать логи по HTTP протоколу
## Сборка и установка
### Коллектор логов
0. Предполагаю, что проект собирается в Docker
1. Положить [vector](logs-collector/vector) внутрь контейнера
```Dockerfile
COPY ./logs-collector/vector /usr/local/bin/vector
```
2. Настроить прием выводв приложения с помощью Vector
```Dockerfile
COPY ./logs-collector/vector.yaml ./logs-collector/
RUN echo "#!/bin/bash" > start.sh
RUN echo "export APP_NAME=my-app" >> start.sh
RUN echo "java -jar lib/service.jar | vector --config /app/logs-collector/vector.yaml" >> start.sh
ENTRYPOINT [ "bash", "start.sh" ]
```
3. Не забыть добавить при запуске необходимые переменные окружения
```yaml
services:
app:
#...
environment:
LOGS_CONTAINER_HOST: ${LOGS_CONTAINER_HOST}
RABBITMQ_PASS: ${RABBITMQ_PASS}
```
### Контейнер логов
Запуск одной командой:
```bash
#!/bin/bash
docker-compose up -d --force-recreate --no-deps --build
```
### Анализатор логов
#### Преобразователь логов
Необходим для того, чтобы забрать накопленные в Контейнере логи, подогнать их под формат [SigNoz HTTP](https://signoz.io/docs/userguide/send-logs-http/), и отдать ему.
Почему не сразу писать в этом формате?
Rabbit MQ накладывает свои поля в JSON. Поэтому приходится все необходимое для SigNoz складывать в поле `.app` будущего JSON, отправлять в Rabbit MQ, а потом "распаковывать" из `.app` в "корень".
#### UI
Самое интересное - то, с чем работает пользователь.
**Дашборды**
![](pics/signoz-dashboard-1.png)
**Логи**
![](pics/signoz-logs-1.png)
![](pics/signoz-logs-2.png)
и другое...