mirror of
https://github.com/weaveworks/scope.git
synced 2026-08-18 03:46:45 +00:00
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:
+20
-6
@@ -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}
|
||||
}
|
||||
|
||||
@@ -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
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user