From 28b2246b5b50dd136bfde27030380ae299b16e59 Mon Sep 17 00:00:00 2001 From: James Bebbington Date: Thu, 2 Jul 2020 11:40:58 +1000 Subject: [PATCH 1/2] Add processes created to misc stats --- load/load.go | 1 + load/load_linux.go | 2 ++ load/load_test.go | 3 ++- 3 files changed, 5 insertions(+), 1 deletion(-) 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_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_test.go b/load/load_test.go index 0aa4de9..7b490a6 100644 --- a/load/load_test.go +++ b/load/load_test.go @@ -47,11 +47,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) } From 79e9a0726366520ba69f0ad28db8641aef30733d Mon Sep 17 00:00:00 2001 From: James Bebbington Date: Sat, 12 Sep 2020 12:35:21 +1000 Subject: [PATCH 2/2] Add ProcsCreated stat for openbsd --- load/load_bsd.go | 12 ++++++++++++ load/load_freebsd.go | 7 +++++++ load/load_openbsd.go | 17 +++++++++++++++++ 3 files changed, 36 insertions(+) create mode 100644 load/load_freebsd.go create mode 100644 load/load_openbsd.go 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_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 +}