render sensible labels for parent nodes with little/no metadata

We eliminate the custom parent renderer, which was a very partial
implementation MakeBasicNodeSummary.

We also ensure that parents are always rendered in the same, sensible
order. Previously the order was an alphabetic sort of the parent
topology IDs. Now lower level topologies come before higher level
topologies.
This commit is contained in:
Matthias Radestock
2017-12-24 15:18:01 +00:00
parent 8cf65ea8b6
commit b88a2e4509
3 changed files with 37 additions and 68 deletions

View File

@@ -229,16 +229,16 @@ func TestMakeDetailedContainerNode(t *testing.T) {
Label: fixture.ServerContainerImageName,
TopologyID: "containers-by-image",
},
{
ID: fixture.ServerHostNodeID,
Label: fixture.ServerHostName,
TopologyID: "hosts",
},
{
ID: fixture.ServerPodNodeID,
Label: "pong-b",
TopologyID: "pods",
},
{
ID: fixture.ServerHostNodeID,
Label: "server",
TopologyID: "hosts",
},
},
},
Controls: []detailed.ControlInstance{},
@@ -339,16 +339,16 @@ func TestMakeDetailedPodNode(t *testing.T) {
{ID: "kubernetes_namespace", Label: "Namespace", Value: "ping", Priority: 5},
},
Parents: []detailed.Parent{
{
ID: fixture.ServerHostNodeID,
Label: fixture.ServerHostName,
TopologyID: "hosts",
},
{
ID: fixture.ServiceNodeID,
Label: fixture.ServiceName,
TopologyID: "services",
},
{
ID: fixture.ServerHostNodeID,
Label: "server",
TopologyID: "hosts",
},
},
},
Controls: []detailed.ControlInstance{},

View File

@@ -1,12 +1,6 @@
package detailed
import (
"sort"
"github.com/weaveworks/scope/probe/awsecs"
"github.com/weaveworks/scope/probe/docker"
"github.com/weaveworks/scope/probe/host"
"github.com/weaveworks/scope/probe/kubernetes"
"github.com/weaveworks/scope/report"
)
@@ -17,24 +11,21 @@ type Parent struct {
TopologyID string `json:"topologyId"`
}
var (
kubernetesParentLabel = latestLookup(kubernetes.Name)
getLabelForTopology = map[string]func(report.Node) string{
report.Container: getRenderableContainerName,
report.Pod: kubernetesParentLabel,
report.Deployment: kubernetesParentLabel,
report.DaemonSet: kubernetesParentLabel,
report.StatefulSet: kubernetesParentLabel,
report.CronJob: kubernetesParentLabel,
report.Service: kubernetesParentLabel,
report.ECSTask: latestLookup(awsecs.TaskFamily),
report.ECSService: ecsServiceParentLabel,
report.SwarmService: latestLookup(docker.ServiceName),
report.ContainerImage: containerImageParentLabel,
report.Host: latestLookup(host.HostName),
}
)
// parent topologies, in the order we want to show them
var parentTopologies = []string{
report.Container,
report.ContainerImage,
report.Pod,
report.Deployment,
report.DaemonSet,
report.StatefulSet,
report.CronJob,
report.Service,
report.ECSTask,
report.ECSService,
report.SwarmService,
report.Host,
}
// Parents renders the parents of this report.Node, which have been aggregated
// from the probe reports.
@@ -43,13 +34,7 @@ func Parents(r report.Report, n report.Node) []Parent {
return nil
}
result := make([]Parent, 0, n.Parents.Size())
topologyIDs := []string{}
for topologyID := range getLabelForTopology {
topologyIDs = append(topologyIDs, topologyID)
}
sort.Strings(topologyIDs)
for _, topologyID := range topologyIDs {
getLabel := getLabelForTopology[topologyID]
for _, topologyID := range parentTopologies {
topology, ok := r.Topology(topologyID)
if !ok {
continue
@@ -63,7 +48,7 @@ func Parents(r report.Report, n report.Node) []Parent {
var parentNode report.Node
// Special case: container image parents should be empty nodes for some reason
if topologyID == report.ContainerImage {
parentNode = report.MakeNode(id)
parentNode = report.MakeNode(id).WithTopology(topologyID)
} else {
if parent, ok := topology.Nodes[id]; ok {
parentNode = parent
@@ -76,12 +61,13 @@ func Parents(r report.Report, n report.Node) []Parent {
if !ok {
continue
}
result = append(result, Parent{
ID: id,
Label: getLabel(parentNode),
TopologyID: apiTopologyID,
})
if summary, ok := MakeBasicNodeSummary(r, parentNode); ok {
result = append(result, Parent{
ID: summary.ID,
Label: summary.Label,
TopologyID: apiTopologyID,
})
}
}
}
if len(result) == 0 {
@@ -89,20 +75,3 @@ func Parents(r report.Report, n report.Node) []Parent {
}
return result
}
func latestLookup(key string) func(report.Node) string {
return func(n report.Node) string {
value, _ := n.Latest.Lookup(key)
return value
}
}
func ecsServiceParentLabel(n report.Node) string {
_, name, _ := report.ParseECSServiceNodeID(n.ID)
return name
}
func containerImageParentLabel(n report.Node) string {
name, _ := report.ParseContainerImageNodeID(n.ID)
return name
}

View File

@@ -34,7 +34,7 @@ func TestParents(t *testing.T) {
name: "Container image",
node: render.ContainerImageRenderer.Render(fixture.Report).Nodes[expected.ClientContainerImageNodeID],
want: []detailed.Parent{
{ID: fixture.ClientHostNodeID, Label: fixture.ClientHostName, TopologyID: "hosts"},
{ID: fixture.ClientHostNodeID, Label: "client", TopologyID: "hosts"},
},
},
{
@@ -42,15 +42,15 @@ func TestParents(t *testing.T) {
node: render.ContainerWithImageNameRenderer.Render(fixture.Report).Nodes[fixture.ClientContainerNodeID],
want: []detailed.Parent{
{ID: expected.ClientContainerImageNodeID, Label: fixture.ClientContainerImageName, TopologyID: "containers-by-image"},
{ID: fixture.ClientHostNodeID, Label: fixture.ClientHostName, TopologyID: "hosts"},
{ID: fixture.ClientPodNodeID, Label: "pong-a", TopologyID: "pods"},
{ID: fixture.ClientHostNodeID, Label: "client", TopologyID: "hosts"},
},
},
{
node: render.ProcessRenderer.Render(fixture.Report).Nodes[fixture.ClientProcess1NodeID],
want: []detailed.Parent{
{ID: fixture.ClientContainerNodeID, Label: fixture.ClientContainerName, TopologyID: "containers"},
{ID: fixture.ClientHostNodeID, Label: fixture.ClientHostName, TopologyID: "hosts"},
{ID: fixture.ClientHostNodeID, Label: "client", TopologyID: "hosts"},
},
},
} {