Инкремент 2
Задание по треку «Сервис сокращения URL»
Покройте сервис юнит-тестами. Сконцентрируйтесь на покрытии тестами функций-обработчиков (хендлеров, которых пока два), чтобы защитить API сервиса от случайных изменений.
Задание по треку «Сервис сбора метрик и алертинга»
Разработайте агент (HTTP-клиент) для сбора рантайм-метрик и их последующей отправки на сервер по протоколу HTTP.
Агент должен собирать метрики двух типов:
- Тип
gauge, float64. - Тип
counter, int64.
В качестве источника метрик используйте пакет runtime.
Нужно собирать следующие метрики типа gauge:
AllocBuckHashSysFreesGCCPUFractionGCSysHeapAllocHeapIdleHeapInuseHeapObjectsHeapReleasedHeapSysLastGCLookupsMCacheInuseMCacheSysMSpanInuseMSpanSysMallocsNextGCNumForcedGCNumGCOtherSysPauseTotalNsStackInuseStackSysSysTotalAlloc
К метрикам пакета runtime добавьте ещё две:
PollCount (тип counter) — счётчик, увеличивающийся на 1 при каждом обновлении метрики из пакета runtime (на каждый pollInterval — см. ниже).RandomValue (тип gauge) — обновляемое произвольное значение.
По умолчанию приложение должно:
- Обновлять метрики из пакета
runtime с заданной частотой: pollInterval — 2 секунды. - Отправлять метрики на сервер с заданной частотой:
reportInterval — 10 секунд.
Чтобы приостанавливать работу функции на заданное время, используйте вызов time.Sleep(n * time.Second). Подробнее о пакете time и его возможностях вы узнаете в третьем спринте.
Метрики нужно отправлять по протоколу HTTP методом POST:
- Формат данных —
http://<АДРЕС_СЕРВЕРА>/update/<ТИП_МЕТРИКИ>/<ИМЯ_МЕТРИКИ>/<ЗНАЧЕНИЕ_МЕТРИКИ>. - Адрес сервера —
http://localhost:8080. - Заголовок —
Content-Type: text/plain.
Пример запроса к серверу:
Пример ответа от сервера:
Покройте код агента и сервера юнит-тестами.
Перед выполнением этого инкремента убедитесь, что структура сервиса представляет собой набор пакетов и структур, разделённых на слои: например, handlers, storage и server.
Обратите внимание, что слой storage должен имплементировать интерфейс хранения, например repositories. Это понадобится вам для подмены хранилища моком в тестах и использования DI. Названия пакетов, структур, интерфейсов и методов можно задать любые, исходя из опыта и личных предпочтений.
Инкремент 3
Задание по треку «Сервис сокращения URL»
Вы написали приложение с помощью пакета стандартной библиотеки net/http. Используя любой внешний пакет (роутер или фреймворк), совместимый с net/http, перепишите ваш код.
Задача направлена на рефакторинг приложения с помощью готовой библиотеки.
Обратите внимание, что необязательно запускать приложение вручную: тесты, которые вы написали до этого, помогут вам в рефакторинге.
Задание по треку «Сервис сбора метрик и алертинга»
Вы написали приложение с помощью пакета стандартной библиотеки net/http. Используя любой внешний пакет (роутер или фреймворк), совместимый с net/http, перепишите ваш код.
Доработайте сервер так, чтобы в ответ на запрос GET http://<АДРЕС_СЕРВЕРА>/value/<ТИП_МЕТРИКИ>/<ИМЯ_МЕТРИКИ> он возвращал текущее значение метрики в текстовом виде со статусом http.StatusOK.
При попытке запроса неизвестной метрики сервер должен возвращать http.StatusNotFound.
По запросу GET http://<АДРЕС_СЕРВЕРА>/ сервер должен отдавать HTML-страницу со списком имён и значений всех известных ему на текущий момент метрик.
Хендлеры должны взаимодействовать с экземпляром MemStorage при помощи соответствующих интерфейсных методов.
Инкремент 4
Задание по треку «Сервис сокращения URL»
Добавьте возможность конфигурировать сервис с помощью аргументов командной строки.
Создайте конфигурацию или переменные для запуска со следующими флагами:
- Флаг
-a отвечает за адрес запуска HTTP-сервера (значение может быть таким: localhost:8888). - Флаг
-b отвечает за базовый адрес результирующего сокращённого URL (значение: адрес сервера перед коротким URL, например http://localhost:8000/qsd54gFg).
Совет: создайте отдельный пакет config, где будет храниться структура с вашей конфигурацией и функция, которая будет инициализировать поля этой структуры. По мере усложнения конфигурации вы сможете добавлять необходимые поля в вашу структуру и инициализировать их.
Задание по треку «Сервис сбора метрик и алертинга»
Доработайте код, чтобы он умел принимать аргументы с использованием флагов.
Аргументы сервера:
- Флаг
-a=<ЗНАЧЕНИЕ> отвечает за адрес эндпоинта HTTP-сервера (по умолчанию localhost:8080).
Аргументы агента:
- Флаг
-a=<ЗНАЧЕНИЕ> отвечает за адрес эндпоинта HTTP-сервера (по умолчанию localhost:8080). - Флаг
-r=<ЗНАЧЕНИЕ> позволяет переопределять reportInterval — частоту отправки метрик на сервер (по умолчанию 10 секунд). - Флаг
-p=<ЗНАЧЕНИЕ> позволяет переопределять pollInterval — частоту опроса метрик из пакета runtime (по умолчанию 2 секунды).
При попытке передать приложению незвестные флаги оно должно завершаться с сообщением о соответствующей ошибке.
Значения интервалов времени должны задаваться в секундах.
Во всех случаях должны присутствовать значения по умолчанию.
Инкремент 5
Задание по треку «Сервис сокращения URL»
Добавьте возможность конфигурировать сервис с помощью переменных окружения:
- Адрес запуска HTTP-сервера — с помощью переменной
SERVER_ADDRESS. - Базовый адрес результирующего сокращённого URL — с помощью переменной
BASE_URL.
Приоритет параметров сервера должен быть таким:
- Если указана переменная окружения, то используется она.
- Если нет переменной окружения, но есть аргумент командной строки (флаг), то используется он.
- Если нет ни переменной окружения, ни флага, то используется значение по умолчанию.
Задание по треку «Сервис сбора метрик и алертинга»
Доработайте агент, чтобы он мог изменять свои параметры запуска по умолчанию через переменные окружения:
ADDRESS отвечает за адрес эндпоинта HTTP-сервера.REPORT_INTERVAL позволяет переопределять reportInterval.POLL_INTERVAL позволяет переопределять pollInterval.
Значения интервалов времени должны задаваться в секундах.
Доработайте сервер, чтобы он мог изменять свои параметры запуска по умолчанию через переменные окружения:
ADDRESS отвечает за адрес эндпоинта HTTP-сервера.
Приоритет параметров должен быть таким:
- Если указана переменная окружения, то используется она.
- Если нет переменной окружения, но есть аргумент командной строки (флаг), то используется он.
- Если нет ни переменной окружения, ни флага, то используется значение по умолчанию.