func (probe *DockerProbe) connect() error { var err error logging.GetLogger().Debugf("Connecting to Docker daemon: %s", probe.url) probe.client, err = dockerclient.NewDockerClient(probe.url, nil) if err != nil { logging.GetLogger().Errorf("Failed to connect to Docker daemon: %s", err.Error()) return err } eventsOptions := &dockerclient.MonitorEventsOptions{ Filters: &dockerclient.MonitorEventsFilters{ Events: []string{"start", "die"}, }, } eventErrChan, err := probe.client.MonitorEvents(eventsOptions, nil) if err != nil { logging.GetLogger().Errorf("Unable to monitor Docker events: %s", err.Error()) return err } probe.wg.Add(2) probe.quit = make(chan bool) probe.connected.Store(true) defer probe.connected.Store(false) go func() { defer probe.wg.Done() containers, err := probe.client.ListContainers(false, false, "") if err != nil { logging.GetLogger().Errorf("Failed to list containers: %s", err.Error()) return } for _, c := range containers { if atomic.LoadInt64(&probe.state) != RunningState { break } probe.registerContainer(c.Id) } }() defer probe.wg.Done() for { select { case <-probe.quit: return nil case e := <-eventErrChan: if e.Error != nil { logging.GetLogger().Errorf("Got error while waiting for Docker event: %s", e.Error.Error()) return e.Error } probe.handleDockerEvent(&e.Event) } } }
func (probe *DockerProbe) connect() { var err error logging.GetLogger().Debugf("Connecting to Docker daemon: %s", probe.url) probe.client, err = dockerclient.NewDockerClient(probe.url, nil) if err != nil { logging.GetLogger().Errorf("Failed to connect to Docker daemon: %s", err.Error()) return } eventsOptions := &dockerclient.MonitorEventsOptions{ Filters: &dockerclient.MonitorEventsFilters{ Events: []string{"start", "die"}, }, } probe.quit = make(chan bool) eventErrChan, err := probe.client.MonitorEvents(eventsOptions, nil) if err != nil { logging.GetLogger().Errorf("Unable to monitor Docker events: %s", err.Error()) return } containers, err := probe.client.ListContainers(false, false, "") if err != nil { logging.GetLogger().Errorf("Failed to list containers: %s", err.Error()) return } probe.wg.Add(2) go func() { defer probe.wg.Done() for _, c := range containers { if probe.running.Load() == false { break } info, err := probe.client.InspectContainer(c.Id) if err != nil { logging.GetLogger().Errorf("Failed to inspect container %s: %s", c.Id, err.Error()) continue } probe.registerContainer(*info) } }() defer probe.wg.Done() for { select { case <-probe.quit: return case e := <-eventErrChan: if e.Error != nil { logging.GetLogger().Errorf("Got error while waiting for Docker event: %s", e.Error.Error()) return } probe.handleDockerEvent(&e.Event) } } }