138 lines
5.4 KiB
Markdown
138 lines
5.4 KiB
Markdown
# 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)
|
||
|
||
и другое...
|
||
|
||
|