Merge pull request #961 from weaveworks/729-open-fds-metric

Gather file descriptors as process metric
This commit is contained in:
Paul Bellamy
2016-02-17 10:13:42 +00:00
7 changed files with 47 additions and 24 deletions

View File

@@ -10,6 +10,13 @@ const formatters = {
return formatters.metric(obj.value, obj.suffix);
},
integer(value) {
if (value < 1100 && value >= 0) {
return Number(value).toFixed(0);
}
return formatLargeValue(value);
},
number(value) {
if (value < 1100 && value >= 0) {
return Number(value).toFixed(2);

View File

@@ -9,13 +9,14 @@ import (
// We use these keys in node metadata
const (
PID = "pid"
Name = "name"
PPID = "ppid"
Cmdline = "cmdline"
Threads = "threads"
CPUUsage = "process_cpu_usage_percent"
MemoryUsage = "process_memory_usage_bytes"
PID = "pid"
Name = "name"
PPID = "ppid"
Cmdline = "cmdline"
Threads = "threads"
CPUUsage = "process_cpu_usage_percent"
MemoryUsage = "process_memory_usage_bytes"
OpenFilesCount = "open_files_count"
)
// Reporter generates Reports containing the Process topology.
@@ -84,6 +85,7 @@ func (r *Reporter) processTopology() (report.Topology, error) {
}
node = node.WithMetric(MemoryUsage, report.MakeMetric().Add(now, float64(p.RSSBytes)))
node = node.WithMetric(OpenFilesCount, report.MakeMetric().Add(now, float64(p.OpenFilesCount)))
t.AddNode(nodeID, node)
})

View File

@@ -4,12 +4,13 @@ import "sync"
// Process represents a single process.
type Process struct {
PID, PPID int
Name string
Cmdline string
Threads int
Jiffies uint64
RSSBytes uint64
PID, PPID int
Name string
Cmdline string
Threads int
Jiffies uint64
RSSBytes uint64
OpenFilesCount int
}
// Walker is something that walks the /proc directory

View File

@@ -83,6 +83,11 @@ func (w *walker) Walk(f func(Process, Process)) error {
continue
}
openFiles, err := fs.ReadDirNames(path.Join(w.procRoot, filename, "fd"))
if err != nil {
continue
}
cmdline, name := "", "(unknown)"
if cmdlineBuf, err := cachedReadFile(path.Join(w.procRoot, filename, "cmdline")); err == nil {
// like proc, treat name as the first element of command line
@@ -96,13 +101,14 @@ func (w *walker) Walk(f func(Process, Process)) error {
}
f(Process{
PID: pid,
PPID: ppid,
Name: name,
Cmdline: cmdline,
Threads: threads,
Jiffies: jiffies,
RSSBytes: rss,
PID: pid,
PPID: ppid,
Name: name,
Cmdline: cmdline,
Threads: threads,
Jiffies: jiffies,
RSSBytes: rss,
OpenFilesCount: len(openFiles),
}, Process{})
}

View File

@@ -21,6 +21,7 @@ var mockFS = fs.Dir("",
FName: "stat",
FContents: "3 na R 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0",
},
fs.Dir("fd", fs.File{FName: "0"}, fs.File{FName: "1"}, fs.File{FName: "2"}),
),
fs.Dir("2",
fs.File{
@@ -31,6 +32,7 @@ var mockFS = fs.Dir("",
FName: "stat",
FContents: "2 na R 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0",
},
fs.Dir("fd", fs.File{FName: "1"}, fs.File{FName: "2"}),
),
fs.Dir("4",
fs.File{
@@ -41,6 +43,7 @@ var mockFS = fs.Dir("",
FName: "stat",
FContents: "4 na R 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0",
},
fs.Dir("fd", fs.File{FName: "0"}),
),
fs.Dir("notapid"),
fs.Dir("1",
@@ -52,6 +55,7 @@ var mockFS = fs.Dir("",
FName: "stat",
FContents: "1 na R 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0",
},
fs.Dir("fd"),
),
),
)
@@ -61,10 +65,10 @@ func TestWalker(t *testing.T) {
defer fs_hook.Restore()
want := map[int]process.Process{
3: {PID: 3, PPID: 2, Name: "curl", Cmdline: "curl google.com", Threads: 1},
2: {PID: 2, PPID: 1, Name: "bash", Cmdline: "bash", Threads: 1},
4: {PID: 4, PPID: 3, Name: "apache", Cmdline: "apache", Threads: 1},
1: {PID: 1, PPID: 0, Name: "init", Cmdline: "init", Threads: 1},
3: {PID: 3, PPID: 2, Name: "curl", Cmdline: "curl google.com", Threads: 1, OpenFilesCount: 3},
2: {PID: 2, PPID: 1, Name: "bash", Cmdline: "bash", Threads: 1, OpenFilesCount: 2},
4: {PID: 4, PPID: 3, Name: "apache", Cmdline: "apache", Threads: 1, OpenFilesCount: 1},
1: {PID: 1, PPID: 0, Name: "init", Cmdline: "init", Threads: 1, OpenFilesCount: 0},
}
have := map[int]process.Process{}

View File

@@ -42,6 +42,7 @@ var labels = map[string]string{
process.CPUUsage: "CPU",
process.Cmdline: "Command",
process.MemoryUsage: "Memory",
process.OpenFilesCount: "Open Files",
process.PID: "PID",
process.PPID: "Parent PID",
process.Threads: "# Threads",

View File

@@ -13,6 +13,7 @@ import (
const (
defaultFormat = ""
filesizeFormat = "filesize"
integerFormat = "integer"
percentFormat = "percent"
)
@@ -20,6 +21,7 @@ var (
processNodeMetrics = []MetricRow{
{ID: process.CPUUsage, Format: percentFormat},
{ID: process.MemoryUsage, Format: filesizeFormat},
{ID: process.OpenFilesCount, Format: integerFormat},
}
containerNodeMetrics = []MetricRow{
{ID: docker.CPUTotalUsage, Format: percentFormat},