refactor: make PropagateSingleMetrics a renderer

instead of a Map, since it's not really a map as it just updates the
given node.

This is more efficient and also matches what we do in similar
situations elsewhere, e.g. in ContainerWithImageNameRenderer and
ProcessWithContainerNameRenderer.
This commit is contained in:
Matthias Radestock
2017-12-28 20:04:01 +00:00
parent c2b0e568c3
commit 30bef738c0
3 changed files with 23 additions and 11 deletions
+20 -6
View File
@@ -4,13 +4,26 @@ import (
"github.com/weaveworks/scope/report"
)
// PropagateSingleMetrics puts metrics from one of the children onto the parent
// iff there is only one child of that type.
func PropagateSingleMetrics(topology string) MapFunc {
return func(n report.Node) report.Nodes {
// PropagateSingleMetrics creates a renderer which propagates metrics
// from a node's child to the node. The child is selected based on the
// specified topology. No metrics are propagated when there is more
// than one such child.
func PropagateSingleMetrics(topology string, r Renderer) Renderer {
return propagateSingleMetrics{topology: topology, r: r}
}
type propagateSingleMetrics struct {
topology string
r Renderer
}
func (p propagateSingleMetrics) Render(rpt report.Report) Nodes {
nodes := p.r.Render(rpt)
outputs := make(report.Nodes, len(nodes.Nodes))
for id, n := range nodes.Nodes {
var found []report.Node
n.Children.ForEach(func(child report.Node) {
if child.Topology == topology {
if child.Topology == p.topology {
if _, ok := child.Latest.Lookup(report.DoesNotMakeConnections); !ok {
found = append(found, child)
}
@@ -19,6 +32,7 @@ func PropagateSingleMetrics(topology string) MapFunc {
if len(found) == 1 {
n = n.WithMetrics(found[0].Metrics)
}
return report.Nodes{n.ID: n}
outputs[id] = n
}
return Nodes{Nodes: outputs, Filtered: nodes.Filtered}
}
+1 -1
View File
@@ -159,7 +159,7 @@ func TestPropagateSingleMetrics(t *testing.T) {
},
},
} {
got := render.PropagateSingleMetrics(c.topology)(c.input)
got := render.PropagateSingleMetrics(c.topology, mockRenderer{report.Nodes{c.input.ID: c.input}}).Render(report.Report{}).Nodes
if !reflect.DeepEqual(got, c.output) {
t.Errorf("[%s] Diff: %s", c.name, test.Diff(c.output, got))
}
+2 -4
View File
@@ -49,8 +49,7 @@ var PodRenderer = Memoise(ConditionalRenderer(renderKubernetesTopologies,
return (!ok || state != kubernetes.StateDeleted)
},
MakeReduce(
MakeMap(
PropagateSingleMetrics(report.Container),
PropagateSingleMetrics(report.Container,
MakeMap(
Map2Parent([]string{report.Pod}, UnmanagedID),
MakeFilter(
@@ -101,8 +100,7 @@ func renderParents(childTopology string, parentTopologies []string, noParentsPse
}
return MakeReduce(append(
selectors,
MakeMap(
PropagateSingleMetrics(childTopology),
PropagateSingleMetrics(childTopology,
MakeMap(
Map2Parent(parentTopologies, noParentsPseudoID),
childRenderer,