in blueprints/cloud-operations/unmanaged-instances-healthcheck/function/healthchecker/healthchecker.go [62:106]
func (hc *HealthChecker) Start() error {
wg := sync.WaitGroup{}
// Limit max parallel goroutines to prevent exhausting socket connections limit
guard := make(chan struct{}, hc.config.max_parallelism)
instances, err := hc.getInstances()
if err != nil {
fmt.Printf("GettingInstances: %v", err)
return err
}
for _, instance := range instances {
guard <- struct{}{}
wg.Add(1)
go func(instance compute.Instance) {
defer wg.Done()
ip := instance.NetworkInterfaces[0].NetworkIP
err := checkTcpPort(ip, hc.config.port, hc.config.timeout)
if err != nil {
fmt.Printf("Instance %s is not responding, will recheck.\n", instance.Name)
time.Sleep(hc.config.recheck_interval)
err := checkTcpPort(ip, hc.config.port, hc.config.timeout)
if err != nil {
fmt.Printf("Healthcheck failed for instance %s\n", instance.Name)
err = hc.sendRestartTask(instance)
if err != nil {
fmt.Printf("SendRecreateMessage %v:", err)
return
}
fmt.Printf("Instance restart task has been sent for instance %s\n", instance.Name)
}
}
<-guard
}(instance)
wg.Wait()
}
return nil
}