Сервис для сбора логов от микросервисов, буферизации и пакетной записи в ClickHouse. Обеспечивает высокую пропускную способность, Graceful Shutdown и мониторинг через Prometheus.
- Приём логов по HTTP (POST /log) в формате JSON.
- Асинхронная буферизация: логи складываются в канал, не блокируя клиента.
- Пакетная запись в ClickHouse (с возможностью переключения на stdout для разработки).
- Настраиваемое количество воркеров для параллельного флаша батчей.
- Graceful Shutdown: корректное завершение с дофлашиванием всех накопленных логов.
- Метрики в формате Prometheus (принято, переполнение канала, размер батча, длительность флаша).
- Полностью конфигурируется через переменные окружения (12‑factor).
- HTTP-хендлер принимает логи, валидирует их и отправляет в буферизированный канал. Если канал переполнен – возвращает
503 Service Unavailableи увеличивает счётчикlogs_channel_overflow_total. - Пул воркеров (количество задаётся через
BATCH_COUNT) читает из канала, накапливает батчи доBATCH_SIZEили по таймеруFLUSH_INTERVAL. - Flusher выполняет вставку в ClickHouse (или stdout) и записывает метрики времени и размера батча.
- Graceful Shutdown останавливает приём новых запросов, закрывает канал и дожидается завершения всех воркеров.
- Prometheus собирает метрики с эндпоинта
/metrics.
- Go 1.22+
- ClickHouse (в качестве хранилища логов)
- Prometheus (мониторинг)
- Docker & Docker Compose
- Клонируйте репозиторий
git clone https://github.com/your-username/log-aggregator.git
cd log-aggregator- Запустите все сервисы
docker-compose up -dБудут подняты:
log-aggregator– сервис на порту8080clickhouse– на портах9000(нативный) и8123(HTTP)prometheus– на порту9090
- Отправьте тестовый лог
curl -X POST http://localhost:8080/log \
-H "Content-Type: application/json" \
-d '{"message":"hello world","level":"info","service":"test","timestamp":"2026-07-14T12:00:00Z"}'- Проверьте метрики
curl http://localhost:8080/metrics | grep logsИли откройте Prometheus: http://localhost:9090
- Посмотрите данные в ClickHouse
docker exec -it clickhouse clickhouse-client --query "SELECT * FROM logs.logs LIMIT 5"Все настройки задаются через переменные окружения (файл .env или передача в контейнер).
| Переменная | Описание | Значение по умолчанию |
|---|---|---|
| HTTP_PORT | Порт HTTP-сервера | 8080 |
| BATCH_SIZE | Количество записей в одном батче | 10000 |
| BATCH_COUNT | Количество параллельных воркеров для флаша | 1 |
| FLUSH_INTERVAL | Интервал принудительного сброса (секунды) | 5 |
| CHANNEL_SIZE | Размер буфера канала (макс. логов в очереди) | 100000 |
| SHUTDOWN_TIMEOUT | Таймаут для graceful shutdown (секунды) | 10 |
| MAX_LOG_SIZE_BYTES | Максимальный размер тела запроса (байты) | 1048576 (1 МБ) |
| CLICKHOUSE_ADDR | Адрес ClickHouse (например, clickhouse:9000) | (пусто, stdout-режим) |
| CLICKHOUSE_DB | Имя базы данных | default |
| CLICKHOUSE_USER | Пользователь | default |
| CLICKHOUSE_PASS | Пароль | (пусто) |
Пример .env:
HTTP_PORT=8080
BATCH_SIZE=10000
BATCH_COUNT=2
FLUSH_INTERVAL=5
CHANNEL_SIZE=100000
SHUTDOWN_TIMEOUT=10
MAX_LOG_SIZE_BYTES=1048576
CLICKHOUSE_ADDR=clickhouse:9000
CLICKHOUSE_DB=logs
CLICKHOUSE_USER=default
CLICKHOUSE_PASS=
Сервис предоставляет эндпоинт /metrics с метриками в формате Prometheus:
-
logs_received_total– общее количество принятых логов. -
logs_channel_overflow_total– сколько раз канал был переполнен (и возвращён 503). -
batch_size– гистограмма размера отправленных батчей. -
flush_duration_seconds– гистограмма времени выполнения флаша.
Эти метрики можно собирать в Prometheus и визуализировать в Grafana.
В папке loadtest/ находится инструмент для отправки большого количества запросов.
Запуск:
go run loadtest/main.go -n 1000000 -c 200 -url http://localhost:8080/log -service loadtestПараметры:
-n– общее количество запросов.-c– количество параллельных воркеров.-url– эндпоинт сервиса.-service– имя сервиса, передаваемое в каждом логе.-interval– задержка между запросами (например, 1ms).
Результаты теста выводятся в консоль: успешные запросы, ошибки, RPS.
Локальный запуск без Docker
# Установите переменные окружения (например, через .env)
export HTTP_PORT=8080
export CLICKHOUSE_ADDR=localhost:9000
# ... остальные переменные
go run cmd/server/main.goСборка Docker-образа
docker build -t log-aggregator .MIT
@Reactivity512
Если у вас есть вопросы или предложения – создавайте Issue или пишите на почту.