mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-03 18:20:27 +00:00
This eliminates the awkward distinction between ProcessRenderer and ColorConnectedProcessRenderer. It also ensures that processes resulting from direct rendering of the process topology (/api/topology/processes is invoking ProcessWithContainerNameRenderer and /api/topology/processes-by-name is invoking ProcessNameRenderer) are colored and hence summarising them correctly sets the 'linkable' property. This was the behaviour prior to the revamping of the rendering pipeline. However, it doesn't actually make a practical difference since process detail panels only show other processes as connection endpoints, and these are always marked linkable anyway.
77 lines
2.2 KiB
Go
77 lines
2.2 KiB
Go
package render
|
|
|
|
import (
|
|
"github.com/weaveworks/scope/report"
|
|
)
|
|
|
|
// HostRenderer is a Renderer which produces a renderable host
|
|
// graph from the host topology.
|
|
//
|
|
// not memoised
|
|
var HostRenderer = MakeReduce(
|
|
endpoints2Hosts{},
|
|
CustomRenderer{RenderFunc: nodes2Hosts, Renderer: ProcessRenderer},
|
|
CustomRenderer{RenderFunc: nodes2Hosts, Renderer: ContainerRenderer},
|
|
CustomRenderer{RenderFunc: nodes2Hosts, Renderer: ContainerImageRenderer},
|
|
CustomRenderer{RenderFunc: nodes2Hosts, Renderer: PodRenderer},
|
|
SelectHost,
|
|
)
|
|
|
|
// nodes2Hosts maps any Nodes to host Nodes.
|
|
//
|
|
// If this function is given a node without a hostname
|
|
// (including other pseudo nodes), it will drop the node.
|
|
//
|
|
// Otherwise, this function will produce nodes with the correct ID
|
|
// format for a host, but without any Major or Minor labels. It does
|
|
// not have enough info to do that, and the resulting graph must be
|
|
// merged with a host graph to get that info.
|
|
func nodes2Hosts(nodes Nodes) Nodes {
|
|
ret := newJoinResults()
|
|
|
|
for _, n := range nodes.Nodes {
|
|
if n.Topology == Pseudo {
|
|
continue // Don't propagate pseudo nodes - we do this in endpoints2Hosts
|
|
}
|
|
hostIDs, _ := n.Parents.Lookup(report.Host)
|
|
for _, id := range hostIDs {
|
|
ret.addChild(n, id, func(id string) report.Node {
|
|
return report.MakeNode(id).WithTopology(report.Host)
|
|
})
|
|
}
|
|
}
|
|
ret.fixupAdjacencies(nodes)
|
|
return ret.result()
|
|
}
|
|
|
|
// endpoints2Hosts takes nodes from the endpoint topology and produces
|
|
// host nodes or pseudo nodes.
|
|
type endpoints2Hosts struct {
|
|
}
|
|
|
|
func (e endpoints2Hosts) Render(rpt report.Report) Nodes {
|
|
local := LocalNetworks(rpt)
|
|
endpoints := SelectEndpoint.Render(rpt)
|
|
ret := newJoinResults()
|
|
|
|
for _, n := range endpoints.Nodes {
|
|
// Nodes without a hostid are treated as pseudo nodes
|
|
hostNodeID, timestamp, ok := n.Latest.LookupEntry(report.HostNodeID)
|
|
if !ok {
|
|
id, ok := pseudoNodeID(n, local)
|
|
if !ok {
|
|
continue
|
|
}
|
|
ret.addChild(n, id, newPseudoNode)
|
|
} else {
|
|
id := report.MakeHostNodeID(report.ExtractHostID(n))
|
|
ret.addChild(n, id, func(id string) report.Node {
|
|
return report.MakeNode(id).WithTopology(report.Host).
|
|
WithLatest(report.HostNodeID, timestamp, hostNodeID)
|
|
})
|
|
}
|
|
}
|
|
ret.fixupAdjacencies(endpoints)
|
|
return ret.result()
|
|
}
|