Skip to content

Commit

Permalink
Use glob match for finding /proc/<pid>/stat files
Browse files Browse the repository at this point in the history
closes #1323
  • Loading branch information
sparrc committed Jun 3, 2016
1 parent 94f9527 commit a362352
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 23 deletions.
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ in conjunction with wildcard dimension values as it will control the amount of
time before a new metric is included by the plugin.

### Features
- [#1262](https://github.com/influxdata/telegraf/pull/1261): Add graylog input pluging.
- [#1262](https://github.com/influxdata/telegraf/pull/1261): Add graylog input pluging.
- [#1294](https://github.com/influxdata/telegraf/pull/1294): consul input plugin. Thanks @harnash
- [#1164](https://github.com/influxdata/telegraf/pull/1164): conntrack input plugin. Thanks @robinpercy!
- [#1165](https://github.com/influxdata/telegraf/pull/1165): vmstat input plugin. Thanks @jshim-xm!
Expand All @@ -48,6 +48,7 @@ time before a new metric is included by the plugin.
- [#1283](https://github.com/influxdata/telegraf/pull/1283): Still send processes metrics if a process exited during metric collection.
- [#1297](https://github.com/influxdata/telegraf/issues/1297): disk plugin panic when usage grab fails.
- [#1316](https://github.com/influxdata/telegraf/pull/1316): Removed leaked "database" tag on redis metrics. Thanks @PierreF!
- [#1323](https://github.com/influxdata/telegraf/issues/1323): Processes plugin: fix potential error with /proc/net/stat directory.

## v0.13.1 [2016-05-24]

Expand Down
35 changes: 13 additions & 22 deletions plugins/inputs/system/processes.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"log"
"os"
"os/exec"
"path"
"path/filepath"
"runtime"
"strconv"

Expand All @@ -19,7 +19,7 @@ import (

type Processes struct {
execPS func() ([]byte, error)
readProcFile func(statFile string) ([]byte, error)
readProcFile func(filename string) ([]byte, error)

forcePS bool
forceProc bool
Expand Down Expand Up @@ -128,22 +128,16 @@ func (p *Processes) gatherFromPS(fields map[string]interface{}) error {

// get process states from /proc/(pid)/stat files
func (p *Processes) gatherFromProc(fields map[string]interface{}) error {
files, err := ioutil.ReadDir("/proc")
filenames, err := filepath.Glob("/proc/[0-9]*/stat")
if err != nil {
return err
}

for _, file := range files {
if !file.IsDir() {
continue
}
for _, filename := range filenames {
_, err := os.Stat(filename)

statFile := path.Join("/proc", file.Name(), "stat")
data, err := p.readProcFile(statFile)
data, err := p.readProcFile(filename)
if err != nil {
if !file.IsDir() {
continue
}
return err
}
if data == nil {
Expand All @@ -159,7 +153,7 @@ func (p *Processes) gatherFromProc(fields map[string]interface{}) error {

stats := bytes.Fields(data)
if len(stats) < 3 {
return fmt.Errorf("Something is terribly wrong with %s", statFile)
return fmt.Errorf("Something is terribly wrong with %s", filename)
}
switch stats[0][0] {
case 'R':
Expand All @@ -176,7 +170,7 @@ func (p *Processes) gatherFromProc(fields map[string]interface{}) error {
fields["paging"] = fields["paging"].(int64) + int64(1)
default:
log.Printf("processes: Unknown state [ %s ] in file %s",
string(stats[0][0]), statFile)
string(stats[0][0]), filename)
}
fields["total"] = fields["total"].(int64) + int64(1)

Expand All @@ -190,15 +184,12 @@ func (p *Processes) gatherFromProc(fields map[string]interface{}) error {
return nil
}

func readProcFile(statFile string) ([]byte, error) {
if _, err := os.Stat(statFile); os.IsNotExist(err) {
return nil, nil
} else if err != nil {
return nil, err
}

data, err := ioutil.ReadFile(statFile)
func readProcFile(filename string) ([]byte, error) {
data, err := ioutil.ReadFile(filename)
if err != nil {
if os.IsNotExist(err) {
return nil, nil
}
return nil, err
}

Expand Down

0 comments on commit a362352

Please sign in to comment.