From a86d47deb0b24d9399409757466e97617ba79f97 Mon Sep 17 00:00:00 2001 From: Tom Wilkie Date: Tue, 18 Aug 2015 10:25:25 +0000 Subject: [PATCH] Add container names to process minor label if possible. --- app/router.go | 2 +- render/topologies.go | 43 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/app/router.go b/app/router.go index 548fe8994..570f223f6 100644 --- a/app/router.go +++ b/app/router.go @@ -104,7 +104,7 @@ var topologyRegistry = map[string]topologyView{ "applications": { human: "Applications", parent: "", - renderer: render.FilterUnconnected{Renderer: render.ProcessRenderer}, + renderer: render.FilterUnconnected{Renderer: render.ProcessWithContainerNameRenderer{}}, }, "applications-by-name": { human: "by name", diff --git a/render/topologies.go b/render/topologies.go index 1a139c7f3..e3df66fd8 100644 --- a/render/topologies.go +++ b/render/topologies.go @@ -1,6 +1,10 @@ package render import ( + "fmt" + + "github.com/weaveworks/scope/probe/docker" + "github.com/weaveworks/scope/probe/process" "github.com/weaveworks/scope/report" ) @@ -25,6 +29,45 @@ var ProcessRenderer = MakeReduce( }, ) +// ProcessWithContainerNameRenderer is a Renderer which produces a process +// graph enriched with container names where appropriate +type ProcessWithContainerNameRenderer struct{} + +// Render produces a process graph where the minor labels contain the +// container name, if found. +func (r ProcessWithContainerNameRenderer) Render(rpt report.Report) RenderableNodes { + var processes = ProcessRenderer.Render(rpt) + var containers = LeafMap{ + Selector: report.SelectContainer, + Mapper: MapContainerIdentity, + Pseudo: PanicPseudoNode, + }.Render(rpt) + + for id, p := range processes { + pid, ok := p.NodeMetadata.Metadata[process.PID] + if !ok { + continue + } + containerID, ok := p.NodeMetadata.Metadata[docker.ContainerID] + if !ok { + continue + } + container, ok := containers[containerID] + if !ok { + continue + } + p.LabelMinor = fmt.Sprintf("%s (%s:%s)", report.ExtractHostID(p.NodeMetadata), container.LabelMajor, pid) + processes[id] = p + } + + return processes +} + +// EdgeMetadata produces an EdgeMetadata for a given edge. +func (r ProcessWithContainerNameRenderer) EdgeMetadata(rpt report.Report, localID, remoteID string) report.EdgeMetadata { + return ProcessRenderer.EdgeMetadata(rpt, localID, remoteID) +} + // ProcessRenderer is a Renderer which produces a renderable process // name graph by munging the progess graph. var ProcessNameRenderer = Map{