mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-03 18:20:27 +00:00
Merge pull request #2172 from weaveworks/2163-known-services-can-be-internal
Check for known services before external IPs
This commit is contained in:
@@ -1,7 +1,6 @@
|
||||
package render
|
||||
|
||||
import (
|
||||
"net"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
@@ -111,9 +110,9 @@ func ShortLivedConnectionJoin(r Renderer, toIPs func(report.Node) []string) Rend
|
||||
if !ok {
|
||||
return report.Nodes{}
|
||||
}
|
||||
if ip := net.ParseIP(addr); ip != nil && !local.Contains(ip) {
|
||||
node := externalNode(m)
|
||||
return report.Nodes{node.ID: node}
|
||||
|
||||
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
|
||||
|
||||
48
render/id.go
48
render/id.go
@@ -1,11 +1,21 @@
|
||||
package render
|
||||
|
||||
import (
|
||||
"net"
|
||||
"sort"
|
||||
"strings"
|
||||
|
||||
"github.com/weaveworks/scope/probe/endpoint"
|
||||
"github.com/weaveworks/scope/report"
|
||||
)
|
||||
|
||||
// Constants are used in the tests.
|
||||
const (
|
||||
TheInternetID = "theinternet"
|
||||
IncomingInternetID = "in-" + TheInternetID
|
||||
OutgoingInternetID = "out-" + TheInternetID
|
||||
)
|
||||
|
||||
// MakePseudoNodeID joins the parts of an id into the id of a pseudonode
|
||||
func MakePseudoNodeID(parts ...string) string {
|
||||
return strings.Join(append([]string{"pseudo"}, parts...), ":")
|
||||
@@ -26,3 +36,41 @@ func NewDerivedPseudoNode(id string, node report.Node) report.Node {
|
||||
output := NewDerivedNode(id, node).WithTopology(Pseudo)
|
||||
return output
|
||||
}
|
||||
|
||||
// NewDerivedExternalNode figures out if a node should be considered external and creates the corresponding pseudo node
|
||||
func NewDerivedExternalNode(n report.Node, addr string, local report.Networks) (report.Node, bool) {
|
||||
// First, check if it's a known service and emit a a specific node if it
|
||||
// is. This needs to be done before checking IPs since known services can
|
||||
// live in the same network, see https://github.com/weaveworks/scope/issues/2163
|
||||
for _, hostname := range DNSNames(n) {
|
||||
if isKnownService(hostname) {
|
||||
return NewDerivedPseudoNode(ServiceNodeIDPrefix+hostname, n), true
|
||||
}
|
||||
}
|
||||
|
||||
// If the dstNodeAddr is not in a network local to this report, we emit an
|
||||
// internet pseudoNode
|
||||
if ip := net.ParseIP(addr); ip != nil && !local.Contains(ip) {
|
||||
// emit one internet node for incoming, one for outgoing
|
||||
if len(n.Adjacency) > 0 {
|
||||
return NewDerivedPseudoNode(IncomingInternetID, n), true
|
||||
}
|
||||
return NewDerivedPseudoNode(OutgoingInternetID, n), true
|
||||
}
|
||||
|
||||
// The node is not external
|
||||
return report.Node{}, false
|
||||
}
|
||||
|
||||
// DNSNames returns a prioritized list of snooped and reverse-resolved
|
||||
// DNS names associated with node n.
|
||||
func DNSNames(n report.Node) []string {
|
||||
snoopedNames, _ := n.Sets.Lookup(endpoint.SnoopedDNSNames)
|
||||
reverseNames, _ := n.Sets.Lookup(endpoint.ReverseDNSNames)
|
||||
// sort the names, to make selection for display more
|
||||
// deterministic
|
||||
sort.StringSlice(snoopedNames).Sort()
|
||||
sort.StringSlice(reverseNames).Sort()
|
||||
// prioritize snooped names
|
||||
return append(snoopedNames, reverseNames...)
|
||||
}
|
||||
|
||||
@@ -1,9 +1,6 @@
|
||||
package render
|
||||
|
||||
import (
|
||||
"net"
|
||||
"sort"
|
||||
|
||||
"github.com/weaveworks/scope/probe/docker"
|
||||
"github.com/weaveworks/scope/probe/endpoint"
|
||||
"github.com/weaveworks/scope/probe/process"
|
||||
@@ -12,13 +9,10 @@ import (
|
||||
|
||||
// Constants are used in the tests.
|
||||
const (
|
||||
TheInternetID = "theinternet"
|
||||
IncomingInternetID = "in-" + TheInternetID
|
||||
OutgoingInternetID = "out-" + TheInternetID
|
||||
InboundMajor = "The Internet"
|
||||
OutboundMajor = "The Internet"
|
||||
InboundMinor = "Inbound connections"
|
||||
OutboundMinor = "Outbound connections"
|
||||
InboundMajor = "The Internet"
|
||||
OutboundMajor = "The Internet"
|
||||
InboundMinor = "Inbound connections"
|
||||
OutboundMinor = "Outbound connections"
|
||||
|
||||
// Topology for pseudo-nodes and IPs so we can differentiate them at the end
|
||||
Pseudo = "pseudo"
|
||||
@@ -88,24 +82,18 @@ var ProcessNameRenderer = ConditionalRenderer(renderProcesses,
|
||||
|
||||
// MapEndpoint2Pseudo makes internet of host pesudo nodes from a endpoint node.
|
||||
func MapEndpoint2Pseudo(n report.Node, local report.Networks) report.Nodes {
|
||||
var node report.Node
|
||||
|
||||
addr, ok := n.Latest.Lookup(endpoint.Addr)
|
||||
if !ok {
|
||||
return report.Nodes{}
|
||||
}
|
||||
|
||||
if ip := net.ParseIP(addr); ip != nil && !local.Contains(ip) {
|
||||
// If the dstNodeAddr is not in a network local to this report, we emit an
|
||||
// external pseudoNode
|
||||
node = externalNode(n)
|
||||
} else {
|
||||
// due to https://github.com/weaveworks/scope/issues/1323 we are dropping
|
||||
// all non-internet pseudo nodes for now.
|
||||
// node = NewDerivedPseudoNode(MakePseudoNodeID(addr), n)
|
||||
return report.Nodes{}
|
||||
if externalNode, ok := NewDerivedExternalNode(n, addr, local); ok {
|
||||
return report.Nodes{externalNode.ID: externalNode}
|
||||
}
|
||||
return report.Nodes{node.ID: node}
|
||||
|
||||
// due to https://github.com/weaveworks/scope/issues/1323 we are dropping
|
||||
// all non-external pseudo nodes for now.
|
||||
return report.Nodes{}
|
||||
}
|
||||
|
||||
// MapEndpoint2Process maps endpoint Nodes to process
|
||||
@@ -157,32 +145,3 @@ func MapProcess2Name(n report.Node, _ report.Networks) report.Nodes {
|
||||
node.Counters = node.Counters.Add(n.Topology, 1)
|
||||
return report.Nodes{name: node}
|
||||
}
|
||||
|
||||
func externalNode(n report.Node) report.Node {
|
||||
// First, check if it's a known service and emit a
|
||||
// a specific node if it is
|
||||
for _, hostname := range DNSNames(n) {
|
||||
if isKnownService(hostname) {
|
||||
return NewDerivedPseudoNode(ServiceNodeIDPrefix+hostname, n)
|
||||
}
|
||||
}
|
||||
|
||||
// emit one internet node for incoming, one for outgoing
|
||||
if len(n.Adjacency) > 0 {
|
||||
return NewDerivedPseudoNode(IncomingInternetID, n)
|
||||
}
|
||||
return NewDerivedPseudoNode(OutgoingInternetID, n)
|
||||
}
|
||||
|
||||
// DNSNames returns a prioritized list of snooped and reverse-resolved
|
||||
// DNS names associated with node n.
|
||||
func DNSNames(n report.Node) []string {
|
||||
snoopedNames, _ := n.Sets.Lookup(endpoint.SnoopedDNSNames)
|
||||
reverseNames, _ := n.Sets.Lookup(endpoint.ReverseDNSNames)
|
||||
// sort the names, to make selection for display more
|
||||
// deterministic
|
||||
sort.StringSlice(snoopedNames).Sort()
|
||||
sort.StringSlice(reverseNames).Sort()
|
||||
// prioritize snooped names
|
||||
return append(snoopedNames, reverseNames...)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user