Ensure k8s views are correctly hidden.

- Filter unconnected psuedo nodes from the Pods view
- Don't report these filtered nodes in stats
- Fix typo in logic for hiding views
This commit is contained in:
Tom Wilkie
2016-04-07 12:01:23 +01:00
parent bfb65cb4af
commit 22402c34f7
3 changed files with 32 additions and 11 deletions

View File

@@ -55,6 +55,6 @@ export function setTopologyUrlsById(topologyUrlsById, topologies) {
}
export function filterHiddenTopologies(topologies) {
return topologies.filter(t => (!t.hidden_if_empty || t.stats.node_count > 0 ||
return topologies.filter(t => (!t.hide_if_empty || t.stats.node_count > 0 ||
t.stats.filtered_nodes > 0));
}

View File

@@ -58,12 +58,26 @@ func ColorConnected(r Renderer) Renderer {
// Filter removes nodes from a view based on a predicate.
type Filter struct {
Renderer
FilterFunc func(report.Node) bool
FilterFunc func(report.Node) bool
ReportFiltered bool // false means we don't report stats for how many are filtered
}
// MakeFilter makes a new Filter.
func MakeFilter(f func(report.Node) bool, r Renderer) Renderer {
return Memoise(&Filter{r, f})
return Memoise(&Filter{
Renderer: r,
FilterFunc: f,
ReportFiltered: true,
})
}
// MakeSilentFilter makes a new Filter which does not report how many nodes it filters in Stats.
func MakeSilentFilter(f func(report.Node) bool, r Renderer) Renderer {
return Memoise(&Filter{
Renderer: r,
FilterFunc: f,
ReportFiltered: false,
})
}
// Render implements Renderer
@@ -115,9 +129,11 @@ func (f *Filter) render(rpt report.Report) (report.Nodes, int) {
// Stats implements Renderer
func (f Filter) Stats(rpt report.Report) Stats {
_, filtered := f.render(rpt)
var upstream = f.Renderer.Stats(rpt)
upstream.FilteredNodes += filtered
if f.ReportFiltered {
_, filtered := f.render(rpt)
upstream.FilteredNodes += filtered
}
return upstream
}

View File

@@ -69,11 +69,10 @@ var ProcessNameRenderer = MakeMap(
// but we need to be careful to ensure we only include each edge once, by only
// including the ProcessRenderer once.
var ContainerRenderer = MakeReduce(
MakeFilter(
MakeSilentFilter(
func(n report.Node) bool {
_, inContainer := n.Latest.Lookup(docker.ContainerID)
_, isConnected := n.Latest.Lookup(IsConnected)
return inContainer || isConnected
return n.Topology != Pseudo || isConnected
},
MakeMap(
MapProcess2Container,
@@ -224,9 +223,15 @@ var HostRenderer = MakeReduce(
// PodRenderer is a Renderer which produces a renderable kubernetes
// graph by merging the container graph and the pods topology.
var PodRenderer = MakeReduce(
MakeMap(
MapContainer2Pod,
ContainerRenderer,
MakeSilentFilter(
func(n report.Node) bool {
_, isConnected := n.Latest.Lookup(IsConnected)
return n.Topology != Pseudo || isConnected
},
MakeMap(
MapContainer2Pod,
ColorConnected(ContainerRenderer),
),
),
SelectPod,
)