mirror of
https://github.com/containers/podman.git
synced 2025-09-13 18:54:02 +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()
|
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])
|
||||||
}
|
}
|
||||||
|
@ -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,
|
||||||
},
|
},
|
||||||
|
Reference in New Issue
Block a user