Files
weave-scope/vendor/github.com/c9s/goprocinfo/linux/loadavg.go
2015-12-04 13:57:32 +00:00

68 lines
1.4 KiB
Go

package linux
import (
"errors"
"io/ioutil"
"strconv"
"strings"
)
type LoadAvg struct {
Last1Min float64 `json:"last1min"`
Last5Min float64 `json:"last5min"`
Last15Min float64 `json:"last15min"`
ProcessRunning uint64 `json:"process_running"`
ProcessTotal uint64 `json:"process_total"`
LastPID uint64 `json:"last_pid"`
}
func ReadLoadAvg(path string) (*LoadAvg, error) {
b, err := ioutil.ReadFile(path)
if err != nil {
return nil, err
}
content := strings.TrimSpace(string(b))
fields := strings.Fields(content)
if len(fields) < 5 {
return nil, errors.New("Cannot parse loadavg: " + content)
}
process := strings.Split(fields[3], "/")
if len(process) != 2 {
return nil, errors.New("Cannot parse loadavg: " + content)
}
loadavg := LoadAvg{}
if loadavg.Last1Min, err = strconv.ParseFloat(fields[0], 64); err != nil {
return nil, err
}
if loadavg.Last5Min, err = strconv.ParseFloat(fields[1], 64); err != nil {
return nil, err
}
if loadavg.Last15Min, err = strconv.ParseFloat(fields[2], 64); err != nil {
return nil, err
}
if loadavg.ProcessRunning, err = strconv.ParseUint(process[0], 10, 64); err != nil {
return nil, err
}
if loadavg.ProcessTotal, err = strconv.ParseUint(process[1], 10, 64); err != nil {
return nil, err
}
if loadavg.LastPID, err = strconv.ParseUint(fields[4], 10, 64); err != nil {
return nil, err
}
return &loadavg, nil
}