[load]all: add Misc in load to get miscellaneous host info from /proc/stat

pull/162/head
Shirou WAKAYAMA 9 years ago
parent 3166d41538
commit f9effa497e

@ -2,8 +2,16 @@ package load
import (
"encoding/json"
"github.com/shirou/gopsutil/internal/common"
)
var invoke common.Invoker
func init() {
invoke = common.Invoke{}
}
type LoadAvgStat struct {
Load1 float64 `json:"load1"`
Load5 float64 `json:"load5"`
@ -14,3 +22,14 @@ func (l LoadAvgStat) String() string {
s, _ := json.Marshal(l)
return string(s)
}
type MiscStat struct {
ProcsRunning int `json:"procsRunning"`
ProcsBlocked int `json:"procsBlocked"`
Ctxt int `json:"ctxt"`
}
func (m MiscStat) String() string {
s, _ := json.Marshal(m)
return string(s)
}

@ -3,7 +3,9 @@
package load
import (
"os/exec"
"strconv"
"strings"
"github.com/shirou/gopsutil/internal/common"
)
@ -35,3 +37,27 @@ func LoadAvg() (*LoadAvgStat, error) {
return ret, nil
}
func Misc() (*MiscStat, error) {
bin, err := exec.LookPath("ps")
if err != nil {
return nil, err
}
out, err := invoke.Command(bin, "axo", "state")
if err != nil {
return nil, err
}
lines := strings.Split(string(out), "\n")
ret := MiscStat{}
for _, l := range lines {
if strings.Contains(l, "R") {
ret.ProcsRunning += 1
} else if strings.Contains(l, "U") {
// uninterruptible sleep == blocked
ret.ProcsBlocked += 1
}
}
return &ret, nil
}

@ -3,7 +3,9 @@
package load
import (
"os/exec"
"strconv"
"strings"
"github.com/shirou/gopsutil/internal/common"
)
@ -35,3 +37,26 @@ func LoadAvg() (*LoadAvgStat, error) {
return ret, nil
}
func Misc() (*MiscStat, error) {
bin, err := exec.LookPath("ps")
if err != nil {
return nil, err
}
out, err := invoke.Command(bin, "axo", "state")
if err != nil {
return nil, err
}
lines := strings.Split(string(out), "\n")
ret := MiscStat{}
for _, l := range lines {
if strings.Contains(l, "R") {
ret.ProcsRunning += 1
} else if strings.Contains(l, "D") {
ret.ProcsBlocked += 1
}
}
return &ret, nil
}

@ -40,3 +40,41 @@ func LoadAvg() (*LoadAvgStat, error) {
return ret, nil
}
func Misc() (*MiscStat, error) {
filename := common.HostProc("stat")
lines, err := ioutil.ReadFile(filename)
if err != nil {
return nil, err
}
ret := &Misc{
ProcsRunning: pr,
ProcsBlocked: pb,
Ctxt: ctxt,
}
for _, line := range lines {
fields := strings.Fields(line)
if len(fields) != 2 {
continue
}
v, err := strconv.ParseInt(fields[1], 10, 64)
if err != nil {
continue
}
switch fields[0] {
case "procs_running":
ret.ProcessRunning = v
case "procs_blocked":
ret.ProcessBlocked = v
case "ctxt":
ret.Ctxt = v
default:
continue
}
}
return ret, nil
}

@ -28,3 +28,27 @@ func TestLoadAvgStat_String(t *testing.T) {
t.Errorf("LoadAvgStat string is invalid: %v", v)
}
}
func TestMisc(t *testing.T) {
v, err := Misc()
if err != nil {
t.Errorf("error %v", err)
}
empty := &MiscStat{}
if v == empty {
t.Errorf("error load: %v", v)
}
}
func TestMiscStatString(t *testing.T) {
v := MiscStat{
ProcsRunning: 1,
ProcsBlocked: 2,
Ctxt: 3,
}
e := `{"procsRunning":1,"procsBlocked":2,"ctxt":3}`
if e != fmt.Sprintf("%v", v) {
t.Errorf("TestMiscString string is invalid: %v", v)
}
}

@ -11,3 +11,9 @@ func LoadAvg() (*LoadAvgStat, error) {
return &ret, common.NotImplementedError
}
func Misc() (*MiscStat, error) {
ret := MiscStat{}
return &ret, common.NotImplementedError
}

Loading…
Cancel
Save