Fixed panic when parsing /proc/stat on 2.6.32-25-pve

Fixes issue described in #38
/proc/stat reports a blank line which needs to be ignored.
Old kernels misses one CPU time field, this needs to be ignored too.
This commit is contained in:
Daniel Speichert 2015-02-06 13:44:22 -05:00 committed by Daniel Speichert
parent 202bbe16fd
commit 1763908013
1 changed files with 9 additions and 1 deletions

View File

@ -90,6 +90,9 @@ func (c *statCollector) Update(ch chan<- prometheus.Metric) (err error) {
scanner := bufio.NewScanner(file) scanner := bufio.NewScanner(file)
for scanner.Scan() { for scanner.Scan() {
parts := strings.Fields(scanner.Text()) parts := strings.Fields(scanner.Text())
if len(parts) == 0 {
continue
}
switch { switch {
case strings.HasPrefix(parts[0], "cpu"): case strings.HasPrefix(parts[0], "cpu"):
// Export only per-cpu stats, it can be aggregated up in prometheus. // 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. // Only some of these may be present, depending on kernel version.
cpuFields := []string{"user", "nice", "system", "idle", "iowait", "irq", "softirq", "steal", "guest"} 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) value, err := strconv.ParseFloat(v, 64)
if err != nil { if err != nil {
return err return err