Files
weave-scope/render/metrics.go
Bryan Boreham d76da767d8 optimization: store just IDs of child nodes
IDs are a lot smaller, hence quicker to manage.
Any time we want to refer back to the full node we look it up in its topology.

(This relies on nobody trying to store a rendered node as a child).
2020-06-08 16:39:53 +00:00

47 lines
1.2 KiB
Go

package render
import (
"context"
"github.com/weaveworks/scope/report"
)
// 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(ctx context.Context, rpt report.Report) Nodes {
nodes := p.r.Render(ctx, rpt)
outputs := make(report.Nodes, len(nodes.Nodes))
topology, _ := rpt.Topology(p.topology)
for id, n := range nodes.Nodes {
var first report.Node
found := 0
for _, childID := range n.ChildIDs {
if ty, ok := report.NodeIDType(childID); ok && ty == p.topology {
child := topology.Nodes[childID]
if _, ok := child.Latest.Lookup(report.DoesNotMakeConnections); !ok {
if found == 0 {
first = child
}
found++
}
}
}
if found == 1 {
n = n.WithMetrics(first.Metrics)
}
outputs[id] = n
}
return Nodes{Nodes: outputs, Filtered: nodes.Filtered}
}