Merge pull request #369 from weaveworks/336-show-counts

Show how many containers have been grouped together under an image
This commit is contained in:
Tom Wilkie
2015-08-19 15:42:00 +01:00
6 changed files with 79 additions and 20 deletions

View File

@@ -135,7 +135,7 @@ var (
"curl": {
ID: "curl",
LabelMajor: "curl",
LabelMinor: "",
LabelMinor: "2 processes",
Rank: "curl",
Pseudo: false,
Adjacency: report.MakeIDList("apache"),
@@ -155,7 +155,7 @@ var (
"apache": {
ID: "apache",
LabelMajor: "apache",
LabelMinor: "",
LabelMinor: "1 process",
Rank: "apache",
Pseudo: false,
Adjacency: report.MakeIDList(),
@@ -173,7 +173,7 @@ var (
"bash": {
ID: "bash",
LabelMajor: "bash",
LabelMinor: "",
LabelMinor: "1 process",
Rank: "bash",
Pseudo: false,
Origins: report.MakeIDList(
@@ -249,7 +249,7 @@ var (
test.ClientContainerImageName: {
ID: test.ClientContainerImageName,
LabelMajor: test.ClientContainerImageName,
LabelMinor: "",
LabelMinor: "1 container",
Rank: test.ClientContainerImageName,
Pseudo: false,
Adjacency: report.MakeIDList(test.ServerContainerImageName),
@@ -271,7 +271,7 @@ var (
test.ServerContainerImageName: {
ID: test.ServerContainerImageName,
LabelMajor: test.ServerContainerImageName,
LabelMinor: "",
LabelMinor: "1 container",
Rank: test.ServerContainerImageName,
Pseudo: false,
Adjacency: report.MakeIDList(),

View File

@@ -19,6 +19,9 @@ const (
TheInternetID = "theinternet"
TheInternetMajor = "The Internet"
containersKey = "containers"
processesKey = "processes"
)
// LeafMapFunc is anything which can take an arbitrary NodeMetadata, which is
@@ -250,9 +253,27 @@ func MapProcess2Name(n RenderableNode) (RenderableNode, bool) {
node := newDerivedNode(name, n)
node.LabelMajor = name
node.Rank = name
node.NodeMetadata.Counters[processesKey] = 1
return node, true
}
// MapCountProcessName maps 1:1 process name nodes, counting
// the number of processes grouped together and putting
// that info in the minor label.
func MapCountProcessName(n RenderableNode) (RenderableNode, bool) {
if n.Pseudo {
return n, true
}
processes := n.NodeMetadata.Counters[processesKey]
if processes == 1 {
n.LabelMinor = "1 process"
} else {
n.LabelMinor = fmt.Sprintf("%d processes", processes)
}
return n, true
}
// MapContainer2ContainerImage maps container RenderableNodes to container
// image RenderableNodes.
//
@@ -277,7 +298,10 @@ func MapContainer2ContainerImage(n RenderableNode) (RenderableNode, bool) {
return n, false
}
return newDerivedNode(id, n), true
// Add container-<id> key to NMD, which will later be counted to produce the minor label
result := newDerivedNode(id, n)
result.NodeMetadata.Counters[containersKey] = 1
return result, true
}
// MapContainerImage2Name maps container images RenderableNodes to
@@ -304,9 +328,27 @@ func MapContainerImage2Name(n RenderableNode) (RenderableNode, bool) {
node := newDerivedNode(name, n)
node.LabelMajor = name
node.Rank = name
node.NodeMetadata = n.NodeMetadata.Copy() // Propagate NMD for container counting.
return node, true
}
// MapCountContainers maps 1:1 container image nodes, counting
// the number of containers grouped together and putting
// that info in the minor label.
func MapCountContainers(n RenderableNode) (RenderableNode, bool) {
if n.Pseudo {
return n, true
}
containers := n.NodeMetadata.Counters[containersKey]
if containers == 1 {
n.LabelMinor = "1 container"
} else {
n.LabelMinor = fmt.Sprintf("%d container(s)", containers)
}
return n, true
}
// MapAddress2Host maps address RenderableNodes to host RenderableNodes.
//
// Otherthan pseudo nodes, we can assume all nodes have a HostID

View File

@@ -71,8 +71,11 @@ func (r ProcessWithContainerNameRenderer) EdgeMetadata(rpt report.Report, localI
// ProcessRenderer is a Renderer which produces a renderable process
// name graph by munging the progess graph.
var ProcessNameRenderer = Map{
MapFunc: MapProcess2Name,
Renderer: ProcessRenderer,
MapFunc: MapCountProcessName,
Renderer: Map{
MapFunc: MapProcess2Name,
Renderer: ProcessRenderer,
},
}
// ContainerRenderer is a Renderer which produces a renderable container
@@ -92,18 +95,21 @@ var ContainerRenderer = MakeReduce(
// ContainerImageRenderer is a Renderer which produces a renderable container
// image graph by merging the container graph and the container image topology.
var ContainerImageRenderer = Map{
MapFunc: MapContainerImage2Name,
Renderer: MakeReduce(
Map{
MapFunc: MapContainer2ContainerImage,
Renderer: ContainerRenderer,
},
LeafMap{
Selector: report.SelectContainerImage,
Mapper: MapContainerImageIdentity,
Pseudo: PanicPseudoNode,
},
),
MapFunc: MapCountContainers,
Renderer: Map{
MapFunc: MapContainerImage2Name,
Renderer: MakeReduce(
Map{
MapFunc: MapContainer2ContainerImage,
Renderer: ContainerRenderer,
},
LeafMap{
Selector: report.SelectContainerImage,
Mapper: MapContainerImageIdentity,
Pseudo: PanicPseudoNode,
},
),
},
}
// AddressRenderer is a Renderer which produces a renderable address