├── README.md
├── cmd
│ ├── agent
│ │ ├── main.go
│ │ ├── sender
│ │ │ └── sender.go
│ │ └── storage
│ │ └── gauge.go
│ └── server
│ └── main.go
├── go.mod
├── internal
│ ├── handlers
│ ├── metrics
│ │ ├── counter
│ │ │ ├── counter.go
│ │ │ └── counter_test.go
│ │ └── gauge
│ │ ├── gauge.go
│ │ └── gauge_test.go
│ └── utils
│ └── utils.go
├── pkg
└── DRAFT.md
Сервер для сбора runtime-метрик, который принимает отчёты от агентов по протоколу HTTP
.
Сервер доступен по адресу: http://localhost:8080
и предоставляет следующие возможности:
- Принимать и хранить произвольные метрики двух типов:
gauge
(float64
) — новое значение замещает предыдущее.counter
(int64
) — новое значение добавляется к предыдущему (если метрика уже известна серверу).
- Получать метрики через HTTP методом
POST
. - Формат передачи данных:
http://<АДРЕС_СЕРВЕРА>/update/<ТИП_МЕТРИКИ>/<ИМЯ_МЕТРИКИ>/<ЗНАЧЕНИЕ_МЕТРИКИ>
. - Указывать заголовок:
Content-Type: text/plain
.
- При успешном приёме метрики сервер возвращает:
http.StatusOK (200)
. - Если не указано имя метрики или путь некорректен, возвращается:
http.StatusNotFound (404)
. - Если передан некорректный тип или значение метрики, сервер отвечает:
http.StatusBadRequest (400)
. - Редиректы сервер не поддерживает.
Для хранения метрик реализуется структура MemStorage
. Она должна быть оформлена как struct
, содержащая коллекцию (slice
или map
). Это решение позволяет в дальнейшем добавлять функциональность, такую как логирование или мьютексы. Также потребуется интерфейс для взаимодействия с MemStorage
.
POST /update/counter/someMetric/527 HTTP/1.1
Host: localhost:8080
Content-Length: 0
Content-Type: text/plain
HTTP/1.1 200 OK
Date: Tue, 21 Feb 2023 02:51:35 GMT
Content-Length: 11
Content-Type: text/plain; charset=utf-8
- Все пограничные случаи и негативные сценарии должны быть обработаны.
- В будущих инкрементах автотесты станут строже — убедитесь, что код можно легко адаптировать.
Разработать агент (HTTP-клиент) для:
- Сбора runtime-метрик.
- Отправки метрик на сервер через HTTP.
gauge
(float64
)counter
(int64
)
Для получения метрик используется пакет runtime
.
Alloc
BuckHashSys
Frees
GCCPUFraction
GCSys
HeapAlloc
HeapIdle
HeapInuse
HeapObjects
HeapReleased
HeapSys
LastGC
Lookups
MCacheInuse
MCacheSys
MSpanInuse
MSpanSys
Mallocs
NextGC
NumForcedGC
NumGC
OtherSys
PauseTotalNs
StackInuse
StackSys
Sys
TotalAlloc
PollCount
(типcounter
) — счётчик, увеличивающийся на 1 при каждом обновлении метрик изruntime
(в каждыйpollInterval
).RandomValue
(типgauge
) — произвольное, регулярно обновляемое значение.
- Метрики из
runtime
должны обновляться каждые2 секунды
(pollInterval
). - Отправка метрик на сервер осуществляется каждые
10 секунд
(reportInterval
).
Для реализации задержки между обновлениями и отправкой данных используйте t.Sleep(n * t.Second)
.
Метрики отправляются через HTTP методом POST.
Формат данных:
http://<АДРЕС_СЕРВЕРА>/update/<ТИП_МЕТРИКИ>/<ИМЯ_МЕТРИКИ>/<ЗНАЧЕНИЕ_МЕТРИКИ>
- Адрес сервера:
http://localhost:8080
. - Заголовок:
Content-Type: text/plain
.
POST /update/counter/someMetric/527 HTTP/1.1
Host: localhost:8080
Content-Length: 0
Content-Type: text/plain
HTTP/1.1 200 OK
Date: Tue, 21 Feb 2023 02:51:35 GMT
Content-Length: 11
Content-Type: text/plain; charset=utf-8
- Код агента и сервера необходимо покрыть соответствующими юнит-тестами.
Перед реализацией этого инкремента:
- Убедитесь, что проект имеет модульную архитектуру с разделением на пакеты и слои, например:
handlers
: для обработки HTTP-запросов.storage
: для логики хранения данных.server
: для запуска сервера.
- В слое
storage
имплементируйте интерфейс, например,repositories
. Это позволит:- Подменять хранилище моком в тестах.
- Использовать Dependency Injection (DI).
Названия слоёв, типов и структур могут быть выбраны в соответствии с вашими предпочтениями.