mirror of
https://github.com/weaveworks/scope.git
synced 2026-02-28 00:33:51 +00:00
66 lines
1.3 KiB
Go
66 lines
1.3 KiB
Go
package process
|
|
|
|
import (
|
|
"strconv"
|
|
|
|
"github.com/weaveworks/scope/report"
|
|
)
|
|
|
|
// We use these keys in node metadata
|
|
const (
|
|
PID = "pid"
|
|
Comm = "comm"
|
|
PPID = "ppid"
|
|
Cmdline = "cmdline"
|
|
Threads = "threads"
|
|
)
|
|
|
|
// Reporter generates Reports containing the Process topology.
|
|
type Reporter struct {
|
|
scope string
|
|
walker Walker
|
|
}
|
|
|
|
// NewReporter makes a new Reporter.
|
|
func NewReporter(walker Walker, scope string) *Reporter {
|
|
return &Reporter{
|
|
scope: scope,
|
|
walker: walker,
|
|
}
|
|
}
|
|
|
|
// Report implements Reporter.
|
|
func (r *Reporter) Report() (report.Report, error) {
|
|
result := report.MakeReport()
|
|
processes, err := r.processTopology()
|
|
if err != nil {
|
|
return result, err
|
|
}
|
|
result.Process = result.Process.Merge(processes)
|
|
return result, nil
|
|
}
|
|
|
|
func (r *Reporter) processTopology() (report.Topology, error) {
|
|
t := report.MakeTopology()
|
|
err := r.walker.Walk(func(p Process) {
|
|
pidstr := strconv.Itoa(p.PID)
|
|
nodeID := report.MakeProcessNodeID(r.scope, pidstr)
|
|
t.Nodes[nodeID] = report.MakeNode()
|
|
for _, tuple := range []struct{ key, value string }{
|
|
{PID, pidstr},
|
|
{Comm, p.Comm},
|
|
{Cmdline, p.Cmdline},
|
|
{Threads, strconv.Itoa(p.Threads)},
|
|
} {
|
|
if tuple.value != "" {
|
|
t.Nodes[nodeID].Metadata[tuple.key] = tuple.value
|
|
}
|
|
}
|
|
if p.PPID > 0 {
|
|
t.Nodes[nodeID].Metadata[PPID] = strconv.Itoa(p.PPID)
|
|
}
|
|
})
|
|
|
|
return t, err
|
|
}
|