Emit per-host Uncontained pseudo nodes.

This commit is contained in:
Tom Wilkie
2015-06-19 13:18:57 +00:00
parent 608abf0e4f
commit 25016dbba5
2 changed files with 28 additions and 19 deletions

View File

@@ -155,7 +155,6 @@ func MapEndpoint2Process(n RenderableNode) (RenderableNode, bool) {
pid, ok := n.NodeMetadata["pid"]
if !ok {
// TODO: Propogate a pseudo node instead of dropping this?
return RenderableNode{}, false
}
@@ -180,11 +179,22 @@ func MapProcess2Container(n RenderableNode) (RenderableNode, bool) {
return n, true
}
// Don't propogate non-internet pseudo nodes
if n.Pseudo {
return n, false
}
// Otherwise, if the process is not in a container, group it
// into an "Uncontained" node
// into an per-host "Uncontained" node. If for whatever reason
// this node doesn't have a host id in their nodemetadata, it'll
// all get grouped into a single uncontained node.
id, ok := n.NodeMetadata[docker.ContainerID]
if !ok || n.Pseudo {
return newDerivedPseudoNode(UncontainedID, UncontainedMajor, n), true
if !ok {
hostID := report.ExtractHostID(n.NodeMetadata)
id = fmt.Sprintf("%s:%s", UncontainedID, hostID)
node := newDerivedPseudoNode(id, UncontainedMajor, n)
node.LabelMinor = hostID
return node, true
}
return newDerivedNode(id, n), true
@@ -203,7 +213,6 @@ func MapProcess2Name(n RenderableNode) (RenderableNode, bool) {
name, ok := n.NodeMetadata["comm"]
if !ok {
// TODO: Propogate a pseudo node instead of dropping this?
return RenderableNode{}, false
}
@@ -225,16 +234,16 @@ func MapProcess2Name(n RenderableNode) (RenderableNode, bool) {
// It does not have enough info to do that, and the resulting graph
// must be merged with a container graph to get that info.
func MapContainer2ContainerImage(n RenderableNode) (RenderableNode, bool) {
// Propogate the internet pseudo node
if n.ID == TheInternetID {
// Propogate all pseudo nodes
if n.Pseudo {
return n, true
}
// Otherwise, if the process is not in a container, group it
// into an "Uncontained" node
// Otherwise, if some some reason the container doesn't have a image_id
// (maybe slightly out of sync reports), just drop it
id, ok := n.NodeMetadata[docker.ImageID]
if !ok || n.Pseudo {
return newDerivedPseudoNode(UncontainedID, UncontainedMajor, n), true
if !ok {
return n, false
}
return newDerivedNode(id, n), true

View File

@@ -412,17 +412,17 @@ func TestContainerRenderer(t *testing.T) {
LabelMinor: serverHostName,
Rank: serverContainerImageID,
Pseudo: false,
Adjacency: report.MakeIDList(clientContainerID, render.UncontainedID, render.TheInternetID),
Adjacency: report.MakeIDList(clientContainerID, render.TheInternetID),
Origins: report.MakeIDList(serverContainerNodeID, server80NodeID, serverProcessNodeID, serverHostNodeID),
AggregateMetadata: render.AggregateMetadata{
render.KeyBytesIngress: 150,
render.KeyBytesEgress: 1500,
},
},
render.UncontainedID: {
ID: render.UncontainedID,
fmt.Sprintf("%s:%s", render.UncontainedID, serverHostName): {
ID: fmt.Sprintf("%s:%s", render.UncontainedID, serverHostName),
LabelMajor: render.UncontainedMajor,
LabelMinor: "",
LabelMinor: serverHostName,
Rank: "",
Pseudo: true,
Origins: report.MakeIDList(nonContainerProcessNodeID, serverHostNodeID),
@@ -458,17 +458,17 @@ func TestContainerImageRenderer(t *testing.T) {
LabelMinor: "",
Rank: serverContainerImageID,
Pseudo: false,
Adjacency: report.MakeIDList(clientContainerImageID, render.UncontainedID, render.TheInternetID),
Adjacency: report.MakeIDList(clientContainerImageID, render.TheInternetID),
Origins: report.MakeIDList(serverContainerImageNodeID, serverContainerNodeID, server80NodeID, serverProcessNodeID, serverHostNodeID),
AggregateMetadata: render.AggregateMetadata{
render.KeyBytesIngress: 150,
render.KeyBytesEgress: 1500,
},
},
render.UncontainedID: {
ID: render.UncontainedID,
fmt.Sprintf("%s:%s", render.UncontainedID, serverHostName): {
ID: fmt.Sprintf("%s:%s", render.UncontainedID, serverHostName),
LabelMajor: render.UncontainedMajor,
LabelMinor: "",
LabelMinor: serverHostName,
Rank: "",
Pseudo: true,
Origins: report.MakeIDList(nonContainerProcessNodeID, serverHostNodeID),