in pkg/metrics/collector/pod_ip_metrics.go [385:439]
func (c *podIPMetricsCollector) setupDirectoryWatcher(dir string) error {
if err := c.listIPAddresses(dir); err != nil {
return err
}
watcher, err := fsnotify.NewWatcher()
if err != nil {
glog.Errorf("NewWatcher failed: %v", err)
return err
}
c.reuseIPs.min = uint64(math.Inf(+1))
c.reuseIPs.buckets = make(map[float64]uint64)
for _, bound := range bucketKeys {
c.reuseIPs.buckets[bound] = 0
}
c.reuseMap = make(map[string]*ipReuse)
go func() {
defer func() {
watcher.Close()
c.podIPMetricsWatcherIsInitialized = false
}()
for {
select {
case e, ok := <-watcher.Events:
if !ok {
glog.Error("watcher is not ok")
return
}
if err := c.listIPAddresses(dir); err != nil { //nolint:govet
return
}
// Only update the ip reuse mininum, average and histogram for IPv4.
ok, f := getIPv4(e.Name)
if ok {
c.updateReuseIPStats(e, f)
}
case err, ok := <-watcher.Errors: //nolint:govet
glog.Errorf("Received error from watcher %v, ok: %t", err, ok)
if !ok {
return
}
}
}
}()
err = watcher.Add(dir)
if err != nil {
glog.Errorf("Failed to add watcher for directory %s: %v", dir, err)
}
c.podIPMetricsWatcherIsInitialized = true
return nil
}