func()

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
}