Проект должен быть размещен в $GOPATH/src/github.com/antelman107/metrics в виду использования менеджера зависимостей dep.
Зависимости подтягиваются через dep ensure
.
В виду необходимости делать агрегированные запросы по метрикам, выбрана реляционная БД Postgresql. Для работы с миграциями БД используется библиотека github.com/rubenv/sql-migrate. Миграции на базу накатываются с помощью команды migrate database up.
Для работы с конфигом используется библиотека github.com/spf13/viper, для реализации интерфейса консольных комманд - github.com/spf13/cobra, для менеджмента зависимостей - github.com/sarulabs/di с собственной оберткой.
Компоненты:
- планировщик (go run cmd/app/main.go service scheduler -c ./.bin/app/config.dist.json) - раз в минуту выбирает сайты для мониторинга и отправляет их в очередь.
- получатель метрик (go run cmd/app/main.go service requester -c ./.bin/app/config.dist.json) - опрашивает очередь, в которую пишет scheduler, в случае получения задачи из этой очереди - выполняет запрос к сайту, сохраняет результат запроса в БД postgresql.
- http-api (на основе веб-фреймворка echo):
- для пользователей - /api - выдает справочник сайтов (id и урлы) и данные по метринкам. Запросы к /api трекаются через middleware Stats
- для администраторов - /stats - выдает статистику по запросам к /api, которую собрал middleware Stats.
Технические детали:
- Для запуска проекта локально база PostgreSQL и redis могут быть подняты с помощью docker-compose.
- Отдельный демон requester и вообще очередь сайтов для мониторинга сделана отдельно в виду возможности масштабирования: при росте кол-ва сайтов реализация запросов внутри одного демона рано или поздно перестала бы успевать выполнить запросы в течение 1 минуты, а в нынешней реализации можно запустить несколько requester даже на нескольких хостах.
- Для ускорения /api, данные кешируются в редисе по site_id. При добавлении новых метрик кеш сбрасывается, при получении данных из БД возобновляется.