Merge pull request #14241 from SandroCasagrande/robust-split-proc-stat

Robust whitespace split of cpu utilization line from /proc/stat
This commit is contained in:
OpenShift Merge Robot
2022-05-16 09:38:50 +02:00
committed by GitHub
2 changed files with 9 additions and 10 deletions

View File

@ -406,26 +406,25 @@ func getCPUUtilization() (*define.CPUUsage, error) {
} }
defer f.Close() defer f.Close()
scanner := bufio.NewScanner(f) scanner := bufio.NewScanner(f)
// Read firt line of /proc/stat // Read first line of /proc/stat that has entries for system ("cpu" line)
for scanner.Scan() { for scanner.Scan() {
break break
} }
// column 1 is user, column 3 is system, column 4 is idle // column 1 is user, column 3 is system, column 4 is idle
stats := strings.Split(scanner.Text(), " ") stats := strings.Fields(scanner.Text())
return statToPercent(stats) return statToPercent(stats)
} }
func statToPercent(stats []string) (*define.CPUUsage, error) { func statToPercent(stats []string) (*define.CPUUsage, error) {
// There is always an extra space between cpu and the first metric userTotal, err := strconv.ParseFloat(stats[1], 64)
userTotal, err := strconv.ParseFloat(stats[2], 64)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "unable to parse user value %q", stats[1]) return nil, errors.Wrapf(err, "unable to parse user value %q", stats[1])
} }
systemTotal, err := strconv.ParseFloat(stats[4], 64) systemTotal, err := strconv.ParseFloat(stats[3], 64)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "unable to parse system value %q", stats[3]) return nil, errors.Wrapf(err, "unable to parse system value %q", stats[3])
} }
idleTotal, err := strconv.ParseFloat(stats[5], 64) idleTotal, err := strconv.ParseFloat(stats[4], 64)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "unable to parse idle value %q", stats[4]) return nil, errors.Wrapf(err, "unable to parse idle value %q", stats[4])
} }

View File

@ -20,7 +20,7 @@ func Test_statToPercent(t *testing.T) {
}{ }{
{ {
name: "GoodParse", name: "GoodParse",
args: args{in0: []string{"cpu", " ", "33628064", "27537", "9696996", "1314806705", "588142", "4775073", "2789228", "0", "598711", "0"}}, args: args{in0: []string{"cpu", "33628064", "27537", "9696996", "1314806705", "588142", "4775073", "2789228", "0", "598711", "0"}},
want: &define.CPUUsage{ want: &define.CPUUsage{
UserPercent: 2.48, UserPercent: 2.48,
SystemPercent: 0.71, SystemPercent: 0.71,
@ -30,19 +30,19 @@ func Test_statToPercent(t *testing.T) {
}, },
{ {
name: "BadUserValue", name: "BadUserValue",
args: args{in0: []string{"cpu", " ", "k", "27537", "9696996", "1314806705", "588142", "4775073", "2789228", "0", "598711", "0"}}, args: args{in0: []string{"cpu", "k", "27537", "9696996", "1314806705", "588142", "4775073", "2789228", "0", "598711", "0"}},
want: nil, want: nil,
wantErr: assert.Error, wantErr: assert.Error,
}, },
{ {
name: "BadSystemValue", name: "BadSystemValue",
args: args{in0: []string{"cpu", " ", "33628064", "27537", "k", "1314806705", "588142", "4775073", "2789228", "0", "598711", "0"}}, args: args{in0: []string{"cpu", "33628064", "27537", "k", "1314806705", "588142", "4775073", "2789228", "0", "598711", "0"}},
want: nil, want: nil,
wantErr: assert.Error, wantErr: assert.Error,
}, },
{ {
name: "BadIdleValue", name: "BadIdleValue",
args: args{in0: []string{"cpu", " ", "33628064", "27537", "9696996", "k", "588142", "4775073", "2789228", "0", "598711", "0"}}, args: args{in0: []string{"cpu", "33628064", "27537", "9696996", "k", "588142", "4775073", "2789228", "0", "598711", "0"}},
want: nil, want: nil,
wantErr: assert.Error, wantErr: assert.Error,
}, },