mirror of
https://github.com/containers/podman.git
synced 2025-06-23 02:18:13 +08:00
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:
@ -406,26 +406,25 @@ func getCPUUtilization() (*define.CPUUsage, error) {
|
||||
}
|
||||
defer f.Close()
|
||||
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() {
|
||||
break
|
||||
}
|
||||
// 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)
|
||||
}
|
||||
|
||||
func statToPercent(stats []string) (*define.CPUUsage, error) {
|
||||
// There is always an extra space between cpu and the first metric
|
||||
userTotal, err := strconv.ParseFloat(stats[2], 64)
|
||||
userTotal, err := strconv.ParseFloat(stats[1], 64)
|
||||
if err != nil {
|
||||
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 {
|
||||
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 {
|
||||
return nil, errors.Wrapf(err, "unable to parse idle value %q", stats[4])
|
||||
}
|
||||
|
@ -20,7 +20,7 @@ func Test_statToPercent(t *testing.T) {
|
||||
}{
|
||||
{
|
||||
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{
|
||||
UserPercent: 2.48,
|
||||
SystemPercent: 0.71,
|
||||
@ -30,19 +30,19 @@ func Test_statToPercent(t *testing.T) {
|
||||
},
|
||||
{
|
||||
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,
|
||||
wantErr: assert.Error,
|
||||
},
|
||||
{
|
||||
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,
|
||||
wantErr: assert.Error,
|
||||
},
|
||||
{
|
||||
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,
|
||||
wantErr: assert.Error,
|
||||
},
|
||||
|
Reference in New Issue
Block a user