Junior — Middle+
68
Наблюдение за доступностью веб‑сайтов
Условие задачи
Требуется создать механизм наблюдения за набором веб‑ресурсов, который через определённые интервалы посылает сетевые запросы к каждому адресу, фиксирует полученный HTTP‑статус и длительность обращения, а затем выводит агрегированную статистику. Необходимо учитывать ограничение на количество одновременно исполняемых запросов и позволить задавать частоту опросов через параметр RequestFrequency. Реализация должна использовать конкурентный запуск (через errgroup.Group) и обеспечивать безопасный доступ к общей структуре StatusMap, где хранятся результаты проверок.
const (
// you can limit concurrent net request. It's optional
MaxGoroutines = 1
// timeout for net requests
Timeout = 2 * time.Second
)
type SiteStatus struct {
Name string
StatusCode int
TimeOfRequest time.Time
}
type Monitor struct {
StatusMap map[string]SiteStatus
Mtx *sync.Mutex
G errgroup.Group
Sites []string
RequestFrequency time.Duration
}
func NewMonitor(sites []string, requestFrequency time.Duration) *Monitor {
return &Monitor{
StatusMap: make(map[string]SiteStatus),
Mtx: &sync.Mutex{},
Sites: sites,
RequestFrequency: requestFrequency,
}
}
func (m *Monitor) Run(ctx context.Context) error {
// run printStatuses and checkSite in different goroutines
return nil
}
func (m *Monitor) checkSite(ctx context.Context, site string) {
// check site and write result to StatusMap
}
func (m *Monitor) printStatuses(ctx context.Context) error {
// iterate over map and print results
return nil
}