Репозиторий для трека «Сервер сбора метрик и алертинга».
- Iter7. Пакет encoding. Сериализация и десериализация данных.
- Отправлять с агента метрики в формате json на новый маршрут
/update
- Реализовать на сервере новый маршрут
/update
который будет принимать json с метрикой и парсить его в структуру. - Получать значение метрик с помощью
POST /value
, в ответе такой же json только с заполненными значениями. - Проверить тесты.
- Отправлять с агента метрики в формате json на новый маршрут
- Iter8. Пакет compress. Сжатие данных.
- Агент передавать данные в формате gzip (добавить Content-Encoding: gzip в заголовок запроса и сжать данные).
- Сервер опционально принимать запросы в сжатом формате (при наличии соответствующего HTTP-заголовка Content-Encoding).
- Отдавать сжатый ответ клиенту, который поддерживает обработку сжатых ответов (с HTTP-заголовком Accept-Encoding).
- Iter9. Пакет os. Операции с файлами.
- Доработайте код сервера, чтобы он мог с заданной периодичностью сохранять текущие значения метрик на диск в указанный файл, а на старте — опционально загружать сохранённые ранее значения. При штатном завершении сервера все накопленные данные должны сохраняться.
- Флаг
-i
, переменная окружения STORE_INTERVAL — интервал времени в секундах, по истечении которого текущие показания сервера сохраняются на диск (по умолчанию 300 секунд, значение 0 делает запись синхронной). - Флаг
-f
, переменная окружения FILE_STORAGE_PATH — полное имя файла, куда сохраняются текущие значения (по умолчанию /tmp/metrics-db.json, пустое значение отключает функцию записи на диск). - Флаг
-r
, переменная окружения RESTORE — булево значение (true/false), определяющее, загружать или нет ранее сохранённые значения из указанного файла при старте сервера (по умолчанию true).
- Iter10. Пакет database/sql. Взаимодействие с базами данных SQL.
- Добавьте на сервер функциональность подключения к базе данных. В качестве СУБД используйте PostgreSQL не ниже 10 версии.
- Строка с адресом подключения к БД должна получаться из переменной окружения DATABASE_DSN или флага командной строки -d.
- Добавьте в сервер хендлер GET /ping, который при запросе проверяет соединение с базой данных. При успешной проверке хендлер должен вернуть HTTP-статус 200 OK, при неуспешной — 500 Internal Server Error.
- Iter11. Пакет database/sql. Взаимодействие с базами данных SQL.
- Перепишите сервер для сбора метрик таким образом, чтобы СУБД PostgreSQL стала хранилищем метрик вместо текущей реализации.
- Iter12. Пакет database/sql. Взаимодействие с базами данных SQL.
- Сервер: Добавьте новый хендлер POST /updates/, принимающий в теле запроса множество метрик в формате: []Metrics (списка метрик).
- Агент: Научите агент работать с использованием нового API (отправлять метрики батчами).
- Iter13. Добавьте обработку
retriable
-ошибок.- Агент не сумел с первой попытки выгрузить данные на сервер из-за временной невозможности установить соединение с сервером.
- При обращении к PostgreSQL cервер получил ошибку транспорта (из категории Class 08 — Connection Exception)
- Ошибка доступа к файлу, который был заблокирован другим процессом.
- Три повтора (всего 4 попытки). Интервалы между повторами должны увеличиваться: 1s, 3s, 5s.
- Использование golang-migrate для миграции таблички сервера
- Makefile для запуска миграций, сервера и агента.
- Iter14. Подпись передаваемых данных по алгоритму SHA256. Посчитать hash от всего тела запроса и разместить его в HTTP-заголовке HashSHA256.
- Агент:
- Добавьте поддержку аргумента через флаг
-k=<КЛЮЧ>
и переменную окруженияKEY=<КЛЮЧ>
. - При наличии ключа агент должен вычислять хеш и передавать в HTTP-заголовке запроса с именем
HashSHA256
.
- Добавьте поддержку аргумента через флаг
- Сервер:
- Добавьте поддержку аргумента через флаг
-k=<КЛЮЧ>
и переменную окруженияKEY=<КЛЮЧ
>. - При наличии ключа (хэша) во время обработки запроса сервер должен проверять соответствие полученного и вычисленного хеша.
- При несовпадении сервер должен отбрасывать полученные данные и возвращать
http.StatusBadRequest
. - При наличии ключа на этапе формирования ответа сервер должен вычислять хеш и передавать его в HTTP-заголовке ответа с именем HashSHA256.
- Добавьте поддержку аргумента через флаг
- Агент:
- Iter15. Паттерны многопоточности.
- Агент: Добавить флаг -l=<ЗНАЧЕНИЕ> и переменную окружения RATE_LIMIT.
- Агент: Перепланируйте архитектуру агента таким образом, чтобы сбор метрик (опрос runtime) и их отправка осуществлялись в разных горутинах. При этом количество одновременно исходящих запросов на сервер нужно ограничивать «сверху» (паттерн worker pool).
- Агент: Добавьте ещё одну горутину, которая будет использовать пакет gopsutil и собирать дополнительные метрики
- TotalMemory,
- FreeMemory,
- CPUutilization1 (по числу CPU, определяемому во время исполнения)
Чтобы иметь возможность получать обновления автотестов и других частей шаблона, выполните команду:
git remote add -m main template https://github.com/Yandex-Practicum/go-musthave-metrics-tpl.git
Для обновления кода автотестов выполните команду:
git fetch template && git checkout template/main .github
Затем добавьте полученные изменения в свой репозиторий.
Для успешного запуска автотестов называйте ветки iter<number>
, где <number>
— порядковый номер инкремента. Например,
в ветке с названием iter4
запустятся автотесты для инкрементов с первого по четвёртый.
При мёрже ветки с инкрементом в основную ветку main
будут запускаться все автотесты.
Подробнее про локальный и автоматический запуск читайте в README автотестов.
# бинарник для MacOS (intel)
wget https://github.com/Yandex-Practicum/go-autotests/releases/download/v0.10.6/metricstest-darwin-amd64
chmod +x metricstest-darwin-amd64
# запуск тестов
./metricstest-darwin-amd64 -test.v -binary-path=bin/server -agent-binary-path=bin/agent -source-path . > test.log
# запуск конкретной итерации
./metricstest-darwin-amd64 -test.v -test.run=^TestIteration7$ -binary-path=bin/server -agent-binary-path=bin/agent -source-path . | tee test.log
# запуск конкретной итерации с -server-port=8080
./metricstest-darwin-amd64 -test.v -test.run=^TestIteration8$ -server-port=8080 -binary-path=bin/server -agent-binary-path=bin/agent -source-path . | tee test.log
# проверка iter12
./metricstest-darwin-amd64 -test.v -test.run=^TestIteration12$ -server-port=8080 -binary-path=bin/server -agent-binary-path=bin/agent -database-dsn=postgres://metrics:password@localhost:5432/metrics -source-path . | tee test.log
# проверка iter13
./metricstest-darwin-amd64 -test.v -test.run=^TestIteration13$ -server-port=8080 -binary-path=bin/server -agent-binary-path=bin/agent -database-dsn=postgres://metrics:password@localhost:5432/metrics -source-path . | tee iter13.log
# проверка iter14
./metricstest-darwin-amd64 -test.v -test.run=^TestIteration14$ -server-port=8080 -binary-path=bin/server -agent-binary-path=bin/agent -database-dsn=postgres://metrics:password@localhost:5432/metrics -source-path . | tee iter13.log
# запуск сервера с postgres
go run . -d postgres://metrics:password@localhost:5432/metrics
clear && golangci-lint run