Skip to content

Commit

Permalink
add metric for open files
Browse files Browse the repository at this point in the history
  • Loading branch information
Tobias Schwab committed Aug 25, 2013
1 parent d6ab57d commit d4fdeda
Show file tree
Hide file tree
Showing 6 changed files with 3,124 additions and 3 deletions.
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
GIT_COMMIT = $(shell git rev-parse --short HEAD)
GIT_STATUS = $(shell test -n "`git status --porcelain`" && echo "+CHANGES")
BUILD_CMD = go build -a -ldflags "-X main.GITCOMMIT $(GIT_COMMIT)$(GIT_STATUS)"
BUILD_CMD = go build -ldflags "-X main.GITCOMMIT $(GIT_COMMIT)$(GIT_STATUS)"

default: clean test all
./bin/metrix --cpu --memory --net --df --disk --processes
./bin/metrix --cpu --memory --net --df --disk --processes --files

wip: ctags test

Expand All @@ -22,7 +22,7 @@ test:

jenkins: clean install_dependencies test all
PROC_ROOT=./fixtures ./bin/metrix --loadavg --disk --memory --processes --cpu
./bin/metrix --loadavg --disk --memory --processes --cpu --keys
./bin/metrix --loadavg --disk --memory --processes --cpu --keys --files

all:
$(BUILD_CMD) -o bin/metrix
5 changes: 5 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,11 @@ All metrics are tagged with `file_system` and `mounted_on` when writing to OpenT
net.ip.InOctets
net.ip.OutOctets

### Open Files (fetched with lsof)

$ ./bin/metrix --files --keys
files.Open

### Process

All metrics are tagged with `pid`, parent pid (`ppid`), `name` and raw `comm` value of the process when writing to OpenTSDB.
Expand Down
62 changes: 62 additions & 0 deletions files.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package main

import (
"fmt"
"os/exec"
"strings"
)

const (
FILES = "files"
FILES_OPEN = "Open"
)

var LSOF_CMD = `lsof | tail -n +2 | tr -s " " "` + "\t" + `" | cut -f 1,2`

func init() {
parser.Add(FILES, "true", "Collect open files")
}

type Files struct {
RawStatus []byte
}

func (files *Files) fetch() (b []byte, e error) {
if len(files.RawStatus) == 0 {
args := []string { "-c" }
args = append(args, LSOF_CMD)
files.RawStatus, _ = exec.Command("bash", args...).Output()
if len(files.RawStatus) == 0 {
return b, fmt.Errorf("lsof returned empty result")
}
}
return files.RawStatus, nil
}

func (f *Files) Collect(col *MetricsCollection) error {
b, e := f.fetch()
if e != nil {
return e
}
stats := map[string]int64{}
for _, line := range strings.Split(string(b), "\n") {
stats[line]++
}
for k, v := range stats {
chunks := strings.SplitN(k, "\t", 2)
if len(chunks) == 2 {
name, pid := chunks[0], chunks[1]
tags := map[string]string{"name": NormalizeProcessName(name), "pid": pid}
col.AddWithTags(FILES_OPEN, v, tags)
}
}
return nil
}

func (f *Files) Keys() []string {
return []string{FILES_OPEN}
}

func (f *Files) Prefix() string {
return FILES
}
28 changes: 28 additions & 0 deletions files_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package main

import (
"github.com/stretchr/testify/assert"
"testing"
)

func TestFiles(t *testing.T) {
files := &Files{RawStatus: readFile("fixtures/lsof.txt")}
assert.Equal(t, files.Prefix(), "files")
assert.NotEmpty(t, files.Keys())

mh := new(MetricHandler)
stats, _ := mh.Collect(files)
assert.True(t, len(stats) > 4)
assert.Equal(t, len(stats), 74)

names := map[string]int{}
for _, s := range stats {
names[s.Tags["name"]]++
}
assert.Equal(t, names["kworker/0"], 0)
assert.Equal(t, names["kworker"], 8)
}

func TestParseLsofOutput(t *testing.T) {
return
}
Loading

0 comments on commit d4fdeda

Please sign in to comment.