diff --git a/utils/cpuload/cpuload.go b/utils/cpuload/cpuload.go index 1679a8fd..81b7066d 100644 --- a/utils/cpuload/cpuload.go +++ b/utils/cpuload/cpuload.go @@ -37,18 +37,18 @@ type CpuLoadReader interface { } func New() (CpuLoadReader, error) { - // First try to create a netlink based load reader. - reader, err := netlink.New() - if err == nil { - glog.Info("Using a netlink-based load reader") - return reader, nil - } - glog.V(1).Infof("failed to create a netlink-based cpu load read: %v", err) - // Netlink based load reader doesn't work inside namespaces. Fall back to using scheddebug. + // First try to create a scheddebug based load reader. schedReader, schedErr := scheddebug.New() - if schedErr != nil { + if schedErr == nil { + glog.Info("Using a sched debug based load reader") + return schedReader, nil + } + glog.V(1).Infof("failed to create a scheddebug-based cpu load reader: %v", schedErr) + // netlink gives us more data than scheddebug, but it doesn't work inside network namespaces. It also needs to be hierarchical. + reader, err := netlink.New() + if err != nil { return nil, fmt.Errorf("failed to create any cpu load reader - netlink based (%v), scheddebug based (%v)", err, schedErr) } - glog.Info("Using a sched debug based load reader") - return schedReader, nil + glog.Info("Using a netlink-based load reader") + return reader, nil }