Sobes.tech
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
}