package aggregate import ( "context" "net/http" "sort" "sync" "github.com/telemt/telemt-api/internal/config" ) // FetchFleetStatus probes GET health and GET system/info for each alias in parallel. func FetchFleetStatus(ctx context.Context, client *http.Client, parsed *config.Parsed, aliases []string) FleetStatusData { if len(aliases) == 0 { return FleetStatusData{} } rows := make([]FleetServerStatus, len(aliases)) var wg sync.WaitGroup for i, alias := range aliases { i, alias := i, alias wg.Add(1) go func() { defer wg.Done() rows[i] = probeFleetServer(ctx, client, parsed, alias) }() } wg.Wait() sort.Slice(rows, func(i, j int) bool { return rows[i].Alias < rows[j].Alias }) allOK, failed := 0, 0 for _, r := range rows { if r.OK { allOK++ } else { failed++ } } return FleetStatusData{ Servers: rows, ServersTotal: len(rows), ServersAllOK: allOK, ServersFailed: failed, } } func probeFleetServer(ctx context.Context, client *http.Client, parsed *config.Parsed, alias string) FleetServerStatus { h, hm := FetchTelemtGET[HealthData](ctx, client, parsed, alias, "health") s, sm := FetchTelemtGET[SystemInfoData](ctx, client, parsed, alias, "system/info") row := FleetServerStatus{Alias: alias} row.HealthOK = hm.OK row.HealthHTTPStatus = hm.HTTPStatus row.HealthLatencyMs = hm.LatencyMs row.HealthError = hm.Error row.HealthRevision = hm.Revision if hm.OK { row.Health = &h } row.SystemInfoOK = sm.OK row.SystemInfoHTTPStatus = sm.HTTPStatus row.SystemInfoLatencyMs = sm.LatencyMs row.SystemInfoError = sm.Error row.SystemInfoRevision = sm.Revision if sm.OK { row.SystemInfo = &s } row.OK = hm.OK && sm.OK return row }