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
+
+0 | | disabled metrics |
+1 | os.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 0acc7be..fa2fd1f 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"
@@ -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/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/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
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"
)