From b36d9a7e9a3a5b9353e21ceac783ded5bd64e4ee Mon Sep 17 00:00:00 2001 From: miton18 Date: Mon, 13 Aug 2018 15:49:29 +0200 Subject: [PATCH 1/2] fix(dependancies): switch to 'sirupsen' --- cmd/root.go | 2 +- cmd/version.go | 2 +- collectors/collector.go | 2 +- collectors/cpu.go | 2 +- collectors/disk.go | 2 +- collectors/load.go | 2 +- collectors/memory.go | 2 +- collectors/net.go | 2 +- glide.lock | 2 +- glide.yaml | 2 +- noderig.go | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index 0acc7be..df7200f 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -9,7 +9,7 @@ import ( "net/http" - log "github.com/Sirupsen/logrus" + log "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/viper" diff --git a/cmd/version.go b/cmd/version.go index e7895c3..4fef18e 100644 --- a/cmd/version.go +++ b/cmd/version.go @@ -7,7 +7,7 @@ import ( ) var ( - version = "2.3.1" + version = "2.3.2" githash = "HEAD" ) diff --git a/collectors/collector.go b/collectors/collector.go index 18be8a5..d514175 100644 --- a/collectors/collector.go +++ b/collectors/collector.go @@ -14,7 +14,7 @@ import ( "sync" "time" - log "github.com/Sirupsen/logrus" + log "github.com/sirupsen/logrus" "github.com/shirou/gopsutil/cpu" ) diff --git a/collectors/cpu.go b/collectors/cpu.go index 5f1da56..48a861f 100644 --- a/collectors/cpu.go +++ b/collectors/cpu.go @@ -7,7 +7,7 @@ import ( "sync" "time" - log "github.com/Sirupsen/logrus" + log "github.com/sirupsen/logrus" "github.com/shirou/gopsutil/cpu" "github.com/shirou/gopsutil/host" ) diff --git a/collectors/disk.go b/collectors/disk.go index 63abecd..fd405c6 100644 --- a/collectors/disk.go +++ b/collectors/disk.go @@ -7,7 +7,7 @@ import ( "sync" "time" - log "github.com/Sirupsen/logrus" + log "github.com/sirupsen/logrus" "github.com/shirou/gopsutil/disk" ) diff --git a/collectors/load.go b/collectors/load.go index 0375a1b..9c387e1 100644 --- a/collectors/load.go +++ b/collectors/load.go @@ -6,7 +6,7 @@ import ( "sync" "time" - log "github.com/Sirupsen/logrus" + log "github.com/sirupsen/logrus" "github.com/shirou/gopsutil/load" ) diff --git a/collectors/memory.go b/collectors/memory.go index a68011a..65dd09e 100644 --- a/collectors/memory.go +++ b/collectors/memory.go @@ -6,7 +6,7 @@ import ( "sync" "time" - log "github.com/Sirupsen/logrus" + log "github.com/sirupsen/logrus" "github.com/shirou/gopsutil/mem" ) diff --git a/collectors/net.go b/collectors/net.go index 5b8b223..117b25f 100644 --- a/collectors/net.go +++ b/collectors/net.go @@ -6,7 +6,7 @@ import ( "sync" "time" - log "github.com/Sirupsen/logrus" + log "github.com/sirupsen/logrus" "github.com/shirou/gopsutil/net" ) diff --git a/glide.lock b/glide.lock index 3eda03e..07583ed 100644 --- a/glide.lock +++ b/glide.lock @@ -41,7 +41,7 @@ imports: - process - name: github.com/shirou/w32 version: bb4de0191aa41b5507caa14b0650cdbddcd9280b -- name: github.com/Sirupsen/logrus +- name: github.com/sirupsen/logrus version: ba1b36c82c5e05c4f912a88eab0dcd91a171688f - name: github.com/spf13/afero version: 2f30b2a92c0e5700bcfe4715891adb1f2a7a406d diff --git a/glide.yaml b/glide.yaml index aa2ca40..494b026 100644 --- a/glide.yaml +++ b/glide.yaml @@ -1,6 +1,6 @@ package: github.com/ovh/noderig import: -- package: github.com/Sirupsen/logrus +- package: github.com/sirupsen/logrus version: ^0.11.0 - package: github.com/spf13/cobra - package: github.com/spf13/viper diff --git a/noderig.go b/noderig.go index b95574f..dbd22de 100644 --- a/noderig.go +++ b/noderig.go @@ -11,7 +11,7 @@ package main import ( - log "github.com/Sirupsen/logrus" + log "github.com/sirupsen/logrus" "github.com/ovh/noderig/cmd" ) From e7c331894c50dd9f9eae7e5ff86bc76aca5c40ea Mon Sep 17 00:00:00 2001 From: miton18 Date: Mon, 3 Sep 2018 23:19:28 +0200 Subject: [PATCH 2/2] feat(collectors): process collector --- Readme.md | 26 ++++++++--- cmd/root.go | 4 ++ collectors/process.go | 101 ++++++++++++++++++++++++++++++++++++++++++ config.yaml | 5 +++ 4 files changed, 131 insertions(+), 5 deletions(-) create mode 100644 collectors/process.go diff --git a/Readme.md b/Readme.md index 3f4793e..1dab597 100644 --- a/Readme.md +++ b/Readme.md @@ -10,6 +10,7 @@ Noderig metrics: - Load - Disk - Net +- Processes - External collectors ## Status @@ -40,6 +41,7 @@ Flags: --mem uint8 memory metrics level (default 1) --net uint8 network metrics level (default 1) --load uint8 load metrics level (default 1) + --process uint8 processes metrics level (default 0) -c --collectors string external collectors directory (default "./collectors") -k --keep-for uint keep collectors data for the given number of fetch (default 3) ``` @@ -119,6 +121,12 @@ Noderig have some built-in collectors. os.net.dropped{direction=out,iface=eth0}iface out drop count (drops) +### Process + + + +
0disabled metrics
1os.process.up{name=ntpd}is process running (boolean)
+ ## Configuration Noderig can read a simple default [config file](config.yaml). @@ -140,11 +148,12 @@ Noderig have some built-in collectors. They could be configured by a log level. You can also defined custom collectors, in an scollector way. (see: http://bosun.org/scollector/external-collectors) ```yaml -cpu: 1 # CPU collector level (Optional, default: 1) -mem: 1 # Memory collector level (Optional, default: 1) -load: 1 # Load collector level (Optional, default: 1) -disk: 1 # Disk collector level (Optional, default: 1) -net: 1 # Network collector level (Optional, default: 1) +cpu: 1 # CPU collector level (Optional, default: 1) +mem: 1 # Memory collector level (Optional, default: 1) +load: 1 # Load collector level (Optional, default: 1) +disk: 1 # Disk collector level (Optional, default: 1) +net: 1 # Network collector level (Optional, default: 1) +process: 0 # Process collector level (Optional, default: 0) ``` #### Collectors Modules @@ -175,6 +184,13 @@ disk-opts: - sda3 ``` +```yaml +process-opts: + whitelist: # Give a filtering list of processes to watch + - httpd + - noderig +``` + #### Parameters Noderig can be customized through some parameters. diff --git a/cmd/root.go b/cmd/root.go index df7200f..fa2fd1f 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -29,6 +29,7 @@ func init() { RootCmd.Flags().Uint8("mem", 1, "memory metrics level") RootCmd.Flags().Uint8("disk", 1, "disk metrics level") RootCmd.Flags().Uint8("net", 1, "network metrics level") + RootCmd.Flags().Uint8("process", 0, "process metrics level") RootCmd.Flags().Uint64("period", 1000, "default collection period") RootCmd.Flags().StringP("collectors", "c", "./collectors", "external collectors directory") RootCmd.Flags().Uint64P("keep-for", "k", 3, "keep collectors data for the given number of fetch") @@ -101,6 +102,9 @@ var RootCmd = &cobra.Command{ disk := collectors.NewDisk(uint(viper.GetInt("period")), uint8(viper.GetInt("disk")), viper.Get("disk-opts")) cs = append(cs, disk) + process := collectors.NewProcess(uint(viper.GetInt("period")), uint8(viper.GetInt("process")), viper.Sub("process-opts")) + cs = append(cs, process) + // Load external collectors cpath := viper.GetString("collectors") cdir, err := os.Open(cpath) diff --git a/collectors/process.go b/collectors/process.go new file mode 100644 index 0000000..eec875a --- /dev/null +++ b/collectors/process.go @@ -0,0 +1,101 @@ +package collectors + +import ( + "bytes" + "fmt" + "strings" + "sync" + "time" + + "github.com/mitchellh/go-ps" + log "github.com/sirupsen/logrus" + "github.com/spf13/viper" +) + +// Process collector +type Process struct { + whitelist []string + mutex sync.RWMutex + sensision bytes.Buffer + level uint8 +} + +// NewProcess collector +func NewProcess(period uint, level uint8, opts *viper.Viper) *Process { + p := &Process{ + level: level, + } + + if opts != nil { + p.whitelist = opts.GetStringSlice("whitelist") + } + log.Debugf("Process whitelist: %+v", p.whitelist) + + if p.level == 0 || len(p.whitelist) == 0 { + return p + } + + log.Debugf("Process whitelist: %+v", p.whitelist) + + tick := time.Tick(time.Duration(period) * time.Millisecond) + go func() { + for range tick { + if err := p.scrape(); err != nil { + log.Error(err) + } + } + }() + + return p +} + +// Metrics delivers metrics. +func (p *Process) Metrics() *bytes.Buffer { + p.mutex.RLock() + defer p.mutex.RUnlock() + + var res bytes.Buffer + res.Write(p.sensision.Bytes()) + return &res +} + +func (p *Process) scrape() error { + processes, err := ps.Processes() + if err != nil { + return err + } + now := time.Now() + + res := map[string]bool{} + + for _, processName := range p.whitelist { + res[processName] = false + for _, process := range processes { + if strings.Contains(process.Executable(), processName) { + res[processName] = true + continue + } + } + } + + // protect consistency + p.mutex.Lock() + defer p.mutex.Unlock() + + p.sensision.Reset() + + for pcs, ok := range res { + if _, err := p.sensision.WriteString(processMetric(now, pcs, ok)); err != nil { + return err + } + } + + return nil +} + +func processMetric(t time.Time, processName string, up bool) string { + if up { + return fmt.Sprintf("%d// os.process.up{name=%s} true\n", t.UnixNano()/1000, processName) + } + return fmt.Sprintf("%d// os.process.up{name=%s} false\n", t.UnixNano()/1000, processName) +} diff --git a/config.yaml b/config.yaml index dcf419c..9dd527b 100644 --- a/config.yaml +++ b/config.yaml @@ -3,8 +3,13 @@ mem: 1 load: 1 disk: 1 net: 1 +process: 0 disk-opts: names: - sda1 +process-opts: + whitelist: + - noderig + - ntpd #flushPath: /tmp/noderig #listen: none