// watchServices monitors the consul health checks and creates a new configuration // on every change. func watchServices(client *api.Client, tagPrefix string, config chan string) { var lastIndex uint64 for { q := &api.QueryOptions{RequireConsistent: true, WaitIndex: lastIndex} checks, meta, err := client.Health().State("any", q) if err != nil { log.Printf("[WARN] consul: Error fetching health state. %v", err) time.Sleep(time.Second) continue } log.Printf("[INFO] consul: Health changed to #%d", meta.LastIndex) config <- servicesConfig(client, passingServices(checks), tagPrefix) lastIndex = meta.LastIndex } }
func registerSession(healthPort int, healthCheckName string, client *api.Client, log logging.Logger) string { go setupHealthCheckEndpoint(healthPort, log) checkReg := &api.AgentCheckRegistration{ Name: healthCheckName, } checkReg.AgentServiceCheck.HTTP = fmt.Sprintf("http://localhost:%d", healthPort) checkReg.AgentServiceCheck.Interval = "1s" err := client.Agent().CheckRegister(checkReg) if err != nil { log.Panic("Failed to register health check", err) } waitForHealthy(healthCheckName, client.Health(), log) sessionEntry := &api.SessionEntry{ Checks: []string{checkReg.Name}, } session, _, err := client.Session().Create(sessionEntry, nil) if err != nil { log.Panic("Unable to create session", err) } for { entry, _, err := client.Session().Info(session, nil) if err != nil { log.Panic("Unable to read session info", err) } if entry != nil { break } } return session }