diff --git a/pkg/poller/influx.go b/pkg/poller/influx.go index 8d89e7ba..3660cf38 100644 --- a/pkg/poller/influx.go +++ b/pkg/poller/influx.go @@ -44,7 +44,6 @@ func (u *UnifiPoller) CollectAndProcess() error { report, err := u.Influx.ReportMetrics(metrics) if err != nil { - u.LogErrorf("processing metrics: %v", err) return err } diff --git a/pkg/poller/start.go b/pkg/poller/start.go index c15afddf..4ef96124 100644 --- a/pkg/poller/start.go +++ b/pkg/poller/start.go @@ -92,11 +92,13 @@ func (f *Flag) Parse(args []string) { // 2. Run the collector one time and report the metrics to influxdb. (lambda) // 3. Start a web server and wait for Prometheus to poll the application for metrics. func (u *UnifiPoller) Run() error { - if err := u.GetUnifi(); err != nil { - return err + switch err := u.GetUnifi(); err { + case nil: + u.Logf("Polling UniFi Controller at %s v%s as user %s. Sites: %v", + u.Config.UnifiBase, u.Unifi.ServerVersion, u.Config.UnifiUser, u.Config.Sites) + default: + u.LogErrorf("Controller Auth or Connection failed, but continuing to retry! %v", err) } - u.Logf("Polling UniFi Controller at %s v%s as user %s. Sites: %v", - u.Config.UnifiBase, u.Unifi.ServerVersion, u.Config.UnifiUser, u.Config.Sites) switch strings.ToLower(u.Config.Mode) { default: @@ -116,23 +118,13 @@ func (u *UnifiPoller) Run() error { // PollController runs forever, polling UniFi and pushing to InfluxDB // This is started by Run() or RunBoth() after everything checks out. func (u *UnifiPoller) PollController() { - var tryAgain bool interval := u.Config.Interval.Round(time.Second) log.Printf("[INFO] Everything checks out! Poller started, InfluxDB interval: %v", interval) ticker := time.NewTicker(interval) for u.LastCheck = range ticker.C { - // Some users need to re-auth every interval because the cookie times out. - if u.Config.ReAuth || tryAgain { - u.LogDebugf("Re-authenticating to UniFi Controller") - if err := u.Unifi.Login(); err != nil { - u.LogErrorf("%v", err) - continue - } - tryAgain = false - } if err := u.CollectAndProcess(); err != nil { u.LogErrorf("%v", err) - tryAgain = true + u.Unifi = nil // trigger re-auth in unifi.go. } } } diff --git a/pkg/poller/unifi.go b/pkg/poller/unifi.go index 5873ffa0..9c924441 100644 --- a/pkg/poller/unifi.go +++ b/pkg/poller/unifi.go @@ -21,6 +21,7 @@ func (u *UnifiPoller) GetUnifi() (err error) { DebugLog: u.LogDebugf, // Log debug messages. }) if err != nil { + u.Unifi = nil return fmt.Errorf("unifi controller: %v", err) } u.LogDebugf("Authenticated with controller successfully") @@ -63,20 +64,31 @@ FIRST: // CollectMetrics grabs all the measurements from a UniFi controller and returns them. func (u *UnifiPoller) CollectMetrics() (*metrics.Metrics, error) { + if u.Unifi == nil || u.Config.ReAuth { + // Some users need to re-auth every interval because the cookie times out. + // Sometimes we hit this path when the controller dies. + u.LogDebugf("Re-authenticating to UniFi Controller") + if err := u.GetUnifi(); err != nil { + return nil, err + } + } m := &metrics.Metrics{TS: u.LastCheck} // At this point, it's the Current Check. var err error // Get the sites we care about. - m.Sites, err = u.GetFilteredSites() - u.LogErrorf("unifi.GetSites(): %v", err) + if m.Sites, err = u.GetFilteredSites(); err != nil { + u.LogErrorf("unifi.GetSites(): %v", err) + } if u.Config.SaveIDS { m.IDSList, err = u.Unifi.GetIDS(m.Sites, time.Now().Add(u.Config.Interval.Duration), time.Now()) u.LogErrorf("unifi.GetIDS(): %v", err) } // Get all the points. - m.Clients, err = u.Unifi.GetClients(m.Sites) - u.LogErrorf("unifi.GetClients(): %v", err) - m.Devices, err = u.Unifi.GetDevices(m.Sites) - u.LogErrorf("unifi.GetDevices(): %v", err) + if m.Clients, err = u.Unifi.GetClients(m.Sites); err != nil { + u.LogErrorf("unifi.GetClients(): %v", err) + } + if m.Devices, err = u.Unifi.GetDevices(m.Sites); err != nil { + u.LogErrorf("unifi.GetDevices(): %v", err) + } return m, err }