mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-06 03:31:00 +00:00
109 lines
3.3 KiB
Go
109 lines
3.3 KiB
Go
package report
|
|
|
|
// Report is the core data type. It's produced by probes, and consumed and
|
|
// stored by apps. It's composed of multiple topologies, each representing
|
|
// a different (related, but not equivalent) view of the network.
|
|
type Report struct {
|
|
// Endpoint nodes are individual (address, port) tuples on each host.
|
|
// They come from inspecting active connections and can (theoretically)
|
|
// be traced back to a process. Edges are present.
|
|
Endpoint Topology
|
|
|
|
// Address nodes are addresses (e.g. ifconfig) on each host. Certain
|
|
// information may be present in this topology that can't be mapped to
|
|
// endpoints (e.g. ICMP). Edges are present.
|
|
Address Topology
|
|
|
|
// Process nodes are processes on each host. Edges are not present.
|
|
Process Topology
|
|
|
|
// Container nodes represent all Docker containers on hosts running probes.
|
|
// Metadata includes things like containter id, name, image id etc.
|
|
// Edges are not present.
|
|
Container Topology
|
|
|
|
// ContainerImages nodes represent all Docker containers images on
|
|
// hosts running probes. Metadata includes things like image id, name etc.
|
|
// Edges are not present.
|
|
ContainerImage Topology
|
|
|
|
// Host nodes are physical hosts that run probes. Metadata includes things
|
|
// like operating system, load, etc. The information is scraped by the
|
|
// probes with each published report. Edges are not present.
|
|
Host Topology
|
|
|
|
// Overlay nodes are active peers in any software-defined network that's
|
|
// overlaid on the infrastructure. The information is scraped by polling
|
|
// their status endpoints. Edges could be present, but aren't currently.
|
|
Overlay Topology
|
|
}
|
|
|
|
const (
|
|
// HostNodeID is a metadata foreign key, linking a node in any topology to
|
|
// a node in the host topology. That host node is the origin host, where
|
|
// the node was originally detected.
|
|
HostNodeID = "host_node_id"
|
|
)
|
|
|
|
// TopologySelector selects a single topology from a report.
|
|
type TopologySelector func(r Report) Topology
|
|
|
|
// SelectEndpoint selects the endpoint topology.
|
|
func SelectEndpoint(r Report) Topology {
|
|
return r.Endpoint
|
|
}
|
|
|
|
// SelectProcess selects the process topology.
|
|
func SelectProcess(r Report) Topology {
|
|
return r.Process
|
|
}
|
|
|
|
// SelectContainer selects the container topology.
|
|
func SelectContainer(r Report) Topology {
|
|
return r.Container
|
|
}
|
|
|
|
// SelectContainerImage selects the container image topology.
|
|
func SelectContainerImage(r Report) Topology {
|
|
return r.ContainerImage
|
|
}
|
|
|
|
// SelectAddress selects the address topology.
|
|
func SelectAddress(r Report) Topology {
|
|
return r.Address
|
|
}
|
|
|
|
// SelectHost selects the address topology.
|
|
func SelectHost(r Report) Topology {
|
|
return r.Host
|
|
}
|
|
|
|
// MakeReport makes a clean report, ready to Merge() other reports into.
|
|
func MakeReport() Report {
|
|
return Report{
|
|
Endpoint: NewTopology(),
|
|
Address: NewTopology(),
|
|
Process: NewTopology(),
|
|
Container: NewTopology(),
|
|
ContainerImage: NewTopology(),
|
|
Host: NewTopology(),
|
|
Overlay: NewTopology(),
|
|
}
|
|
}
|
|
|
|
// Topologies returns a slice of Topologies in this report
|
|
func (r Report) Topologies() []Topology {
|
|
return []Topology{r.Endpoint, r.Address, r.Process, r.Container,
|
|
r.ContainerImage, r.Host, r.Overlay}
|
|
}
|
|
|
|
// Validate checks the report for various inconsistencies.
|
|
func (r Report) Validate() error {
|
|
for _, topology := range r.Topologies() {
|
|
if err := topology.Validate(); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|