diff --git a/collector/stat.go b/collector/stat.go index f5942f9e..4913abb8 100644 --- a/collector/stat.go +++ b/collector/stat.go @@ -90,6 +90,9 @@ func (c *statCollector) Update(ch chan<- prometheus.Metric) (err error) { scanner := bufio.NewScanner(file) for scanner.Scan() { parts := strings.Fields(scanner.Text()) + if len(parts) == 0 { + continue + } switch { case strings.HasPrefix(parts[0], "cpu"): // Export only per-cpu stats, it can be aggregated up in prometheus. @@ -98,7 +101,12 @@ func (c *statCollector) Update(ch chan<- prometheus.Metric) (err error) { } // Only some of these may be present, depending on kernel version. cpuFields := []string{"user", "nice", "system", "idle", "iowait", "irq", "softirq", "steal", "guest"} - for i, v := range parts[1 : len(cpuFields)+1] { + // OpenVZ guests lack the "guest" CPU field, which needs to be ignored. + expectedFieldNum := len(cpuFields)+1 + if expectedFieldNum > len(parts) { + expectedFieldNum = len(parts) + } + for i, v := range parts[1 : expectedFieldNum] { value, err := strconv.ParseFloat(v, 64) if err != nil { return err