mirror of
https://github.com/weaveworks/scope.git
synced 2026-07-18 04:49:55 +00:00
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).
47 lines
1.2 KiB
Go
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}
|
|
}
|