diff --git a/load/load.go b/load/load.go index 86d9114..a4926c2 100644 --- a/load/load.go +++ b/load/load.go @@ -21,6 +21,7 @@ func (l AvgStat) String() string { type MiscStat struct { ProcsTotal int `json:"procsTotal"` + ProcsCreated int `json:"procsCreated"` ProcsRunning int `json:"procsRunning"` ProcsBlocked int `json:"procsBlocked"` Ctxt int `json:"ctxt"` diff --git a/load/load_bsd.go b/load/load_bsd.go index dfac10c..9cb254a 100644 --- a/load/load_bsd.go +++ b/load/load_bsd.go @@ -37,6 +37,12 @@ func AvgWithContext(ctx context.Context) (*AvgStat, error) { return ret, nil } +type forkstat struct { + forks int + vforks int + __tforks int +} + // Misc returns miscellaneous host-wide statistics. // darwin use ps command to get process running/blocked count. // Almost same as Darwin implementation, but state is different. @@ -64,5 +70,11 @@ func MiscWithContext(ctx context.Context) (*MiscStat, error) { } } + f, err := getForkStat() + if err != nil { + return nil, err + } + ret.ProcsCreated = f.forks + return &ret, nil } diff --git a/load/load_freebsd.go b/load/load_freebsd.go new file mode 100644 index 0000000..bee8f55 --- /dev/null +++ b/load/load_freebsd.go @@ -0,0 +1,7 @@ +// +build freebsd + +package load + +func getForkStat() (forkstat, error) { + return forkstat{}, nil +} diff --git a/load/load_linux.go b/load/load_linux.go index 081e2cc..38b4b03 100644 --- a/load/load_linux.go +++ b/load/load_linux.go @@ -92,6 +92,8 @@ func MiscWithContext(ctx context.Context) (*MiscStat, error) { continue } switch fields[0] { + case "processes": + ret.ProcsCreated = int(v) case "procs_running": ret.ProcsRunning = int(v) case "procs_blocked": diff --git a/load/load_openbsd.go b/load/load_openbsd.go new file mode 100644 index 0000000..b299f58 --- /dev/null +++ b/load/load_openbsd.go @@ -0,0 +1,17 @@ +// +build openbsd + +package load + +import ( + "unsafe" + + "golang.org/x/sys/unix" +) + +func getForkStat() (forkstat, error) { + b, err := unix.SysctlRaw("kern.forkstat") + if err != nil { + return forkstat{}, err + } + return *(*forkstat)(unsafe.Pointer((&b[0]))), nil +} diff --git a/load/load_test.go b/load/load_test.go index 72f1fc9..2c809b9 100644 --- a/load/load_test.go +++ b/load/load_test.go @@ -57,11 +57,12 @@ func TestMisc(t *testing.T) { func TestMiscStatString(t *testing.T) { v := MiscStat{ ProcsTotal: 4, + ProcsCreated: 5, ProcsRunning: 1, ProcsBlocked: 2, Ctxt: 3, } - e := `{"procsTotal":4,"procsRunning":1,"procsBlocked":2,"ctxt":3}` + e := `{"procsTotal":4,"procsCreated":5,"procsRunning":1,"procsBlocked":2,"ctxt":3}` if e != fmt.Sprintf("%v", v) { t.Errorf("TestMiscString string is invalid: %v", v) }