Skip to content

Commit

Permalink
Cross platform support for the 'processes' plugin
Browse files Browse the repository at this point in the history
closes #798
  • Loading branch information
sparrc committed Mar 8, 2016
1 parent dd52b4b commit 08a219a
Showing 1 changed file with 53 additions and 9 deletions.
62 changes: 53 additions & 9 deletions plugins/inputs/system/processes.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
// +build !windows

package system

import (
"fmt"
"log"
"runtime"

"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/plugins/inputs"
Expand All @@ -23,32 +26,73 @@ func (s *Processes) Gather(acc telegraf.Accumulator) error {
if err != nil {
return fmt.Errorf("error getting pids list: %s", err)
}

// TODO handle other OS (Windows/BSD/Solaris/OSX)
fields := map[string]interface{}{
"paging": uint64(0),
"blocked": uint64(0),
"zombie": uint64(0),
"stopped": uint64(0),
"running": uint64(0),
"sleeping": uint64(0),
"blocked": int64(0),
"zombie": int64(0),
"stopped": int64(0),
"running": int64(0),
"sleeping": int64(0),
}

switch runtime.GOOS {
case "freebsd":
fields["idle"] = int64(0)
fields["wait"] = int64(0)
case "darwin":
fields["idle"] = int64(0)
case "openbsd":
fields["idle"] = int64(0)
case "linux":
fields["paging"] = int64(0)
}

for _, pid := range pids {
process, err := process.NewProcess(pid)
if err != nil {
log.Printf("Can not get process %d status: %s", pid, err)
continue
}
status, err := process.Status()
if err != nil {
if err != nil || len(status) == 0 {
log.Printf("Can not get process %d status: %s\n", pid, err)
continue
}

if status == "disk sleep" {
status = "blocked"
}

switch status[0:1] {
case "W":
switch runtime.GOOS {
case "freebsd":
status = "wait"
default:
status = "paging"
}
case "U", "D":
// Also known as uninterruptible sleep or disk sleep
status = "blocked"
case "Z":
status = "zombie"
case "T":
status = "stopped"
case "R":
status = "running"
case "S":
status = "sleeping"
case "I":
status = "idle"
}

_, exists := fields[status]
if !exists {
log.Printf("Status '%s' for process with pid: %d\n", status, pid)
log.Printf("Unknown Status '%s' for process with pid: %d\n", status, pid)
continue
}
fields[status] = fields[status].(uint64) + uint64(1)
fields[status] = fields[status].(int64) + int64(1)
}

acc.AddFields("processes", fields, nil)
Expand Down

0 comments on commit 08a219a

Please sign in to comment.