in internal/gcpdial/gcpdial.go [79:123]
func (p *prober) probe() {
if p.ip == "" && !p.getIP() {
return
}
ctx, cancel := context.WithTimeout(p.ctx, 30*time.Second)
defer cancel()
req, err := http.NewRequest("GET", "http://"+p.ip+"/healthz", nil)
if err != nil {
log.Printf("gcpdial: prober %s: NewRequest: %v", p.instURL, err)
return
}
req = req.WithContext(ctx)
res, err := http.DefaultClient.Do(req)
if res != nil {
defer res.Body.Close()
defer io.Copy(ioutil.Discard, res.Body)
}
healthy := err == nil && res.StatusCode == http.StatusOK
if healthy == p.healthy {
// No change.
return
}
p.healthy = healthy
p.d.mu.Lock()
defer p.d.mu.Unlock()
if healthy {
if p.d.ready == nil {
p.d.ready = map[string]string{}
}
p.d.ready[p.instURL] = p.ip
// TODO: possible optimization: trigger
// Dialer.PickIP waiters to wake up rather
// than them polling once a second.
} else {
delete(p.d.ready, p.instURL)
var why string
if err != nil {
why = err.Error()
} else {
why = res.Status
}
log.Printf("gcpdial: prober %s: no longer healthy; %v", p.instURL, why)
}
}