do not filter endpoints by procspied/ebpf in renderers

The filtering of endpoints causes some connections to get missed for
non-eBPF-tracked connections. Furthermore, the filtering of endpoints
is entirely pointless when the probes run eBPF since the filters just
pass through eBPF-tracked endpoints (for good reason too; because
otherwise some connections would be missed). So in that case it is
just costing CPU and removing it actually improves performance.

Note that removing the filtering does not result in over-counting
connections since that is done by source ip:port pairs.

Fixes #2551.
Fixes #2558.
This commit is contained in:
Matthias Radestock
2017-06-27 12:48:51 +01:00
parent 716a5df87b
commit e5a04ec5a4
3 changed files with 7 additions and 30 deletions

View File

@@ -45,13 +45,7 @@ var ContainerRenderer = MakeFilter(
),
)
var mapEndpoint2IP = MakeMap(
endpoint2IP,
// We drop endpoint nodes which were procspied, as they will be
// joined to containers through the process topology, and we don't
// want to double count edges.
MakeFilter(Complement(procspied), SelectEndpoint),
)
var mapEndpoint2IP = MakeMap(endpoint2IP, SelectEndpoint)
const originalNodeID = "original_node_id"
const originalNodeTopology = "original_node_topology"
@@ -121,8 +115,11 @@ func endpoint2IP(m report.Node, local report.Networks) report.Nodes {
return report.Nodes{}
}
if externalNode, ok := NewDerivedExternalNode(m, addr, local); ok {
return report.Nodes{externalNode.ID: externalNode}
// Nodes without a hostid may be pseudo nodes
if _, ok := m.Latest.Lookup(report.HostNodeID); !ok {
if externalNode, ok := NewDerivedExternalNode(m, addr, local); ok {
return report.Nodes{externalNode.ID: externalNode}
}
}
// We also allow for joining on ip:port pairs. This is useful for

View File

@@ -5,7 +5,6 @@ import (
"github.com/weaveworks/common/mtime"
"github.com/weaveworks/scope/probe/docker"
"github.com/weaveworks/scope/probe/endpoint"
"github.com/weaveworks/scope/probe/kubernetes"
"github.com/weaveworks/scope/report"
)
@@ -237,25 +236,6 @@ func IsRunning(n report.Node) bool {
// IsStopped checks if the node is *not* a running docker container
var IsStopped = Complement(IsRunning)
func procspied(node report.Node) bool {
_, ok := node.Latest.Lookup(endpoint.Procspied)
return ok
}
func procspiedOrEBPF(node report.Node) bool {
if procspied(node) {
return true
}
_, ok := node.Latest.Lookup(endpoint.EBPF)
return ok
}
// FilterProcspiedOrEBPF keeps only endpoints which were found via
// procspy or eBPF.
func FilterProcspiedOrEBPF(r Renderer) Renderer {
return MakeFilter(procspiedOrEBPF, r)
}
// IsApplication checks if the node is an "application" node
func IsApplication(n report.Node) bool {
containerName, _ := n.Latest.Lookup(docker.ContainerName)

View File

@@ -22,7 +22,7 @@ func renderProcesses(rpt report.Report) bool {
}
// EndpointRenderer is a Renderer which produces a renderable endpoint graph.
var EndpointRenderer = FilterProcspiedOrEBPF(SelectEndpoint)
var EndpointRenderer = SelectEndpoint
// ProcessRenderer is a Renderer which produces a renderable process
// graph by merging the endpoint graph and the process topology.