mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-03 02:00:43 +00:00
Merge pull request #545 from weaveworks/544-containers-by-hostname
Add containers by hostname view.
This commit is contained in:
@@ -224,6 +224,15 @@ var topologyRegistry = ®istry{
|
||||
{"hide", "System containers hidden", true, render.FilterSystem},
|
||||
}},
|
||||
},
|
||||
"containers-by-hostname": {
|
||||
human: "by hostname",
|
||||
parent: "containers",
|
||||
renderer: render.ContainerHostnameRenderer,
|
||||
options: optionParams{"system": {
|
||||
{"show", "System containers shown", false, nop},
|
||||
{"hide", "System containers hidden", true, render.FilterSystem},
|
||||
}},
|
||||
},
|
||||
"hosts": {
|
||||
human: "Hosts",
|
||||
parent: "",
|
||||
|
||||
@@ -22,11 +22,12 @@ import (
|
||||
|
||||
// These constants are keys used in node metadata
|
||||
const (
|
||||
ContainerName = "docker_container_name"
|
||||
ContainerCommand = "docker_container_command"
|
||||
ContainerPorts = "docker_container_ports"
|
||||
ContainerCreated = "docker_container_created"
|
||||
ContainerIPs = "docker_container_ips"
|
||||
ContainerName = "docker_container_name"
|
||||
ContainerCommand = "docker_container_command"
|
||||
ContainerPorts = "docker_container_ports"
|
||||
ContainerCreated = "docker_container_created"
|
||||
ContainerIPs = "docker_container_ips"
|
||||
ContainerHostname = "docker_container_hostname"
|
||||
|
||||
NetworkRxDropped = "network_rx_dropped"
|
||||
NetworkRxBytes = "network_rx_bytes"
|
||||
@@ -70,6 +71,7 @@ type Container interface {
|
||||
ID() string
|
||||
Image() string
|
||||
PID() int
|
||||
Hostname() string
|
||||
GetNode([]net.IP) report.Node
|
||||
|
||||
StartGatheringStats() error
|
||||
@@ -100,6 +102,15 @@ func (c *container) PID() int {
|
||||
return c.container.State.Pid
|
||||
}
|
||||
|
||||
func (c *container) Hostname() string {
|
||||
if c.container.Config.Domainname == "" {
|
||||
return c.container.Config.Hostname
|
||||
}
|
||||
|
||||
return fmt.Sprintf("%s.%s", c.container.Config.Hostname,
|
||||
c.container.Config.Domainname)
|
||||
}
|
||||
|
||||
func (c *container) StartGatheringStats() error {
|
||||
c.Lock()
|
||||
defer c.Unlock()
|
||||
@@ -221,6 +232,7 @@ func (c *container) GetNode(localAddrs []net.IP) report.Node {
|
||||
ImageID: c.container.Image,
|
||||
ContainerIPs: strings.Join(append(c.container.NetworkSettings.SecondaryIPAddresses,
|
||||
c.container.NetworkSettings.IPAddress), " "),
|
||||
ContainerHostname: c.Hostname(),
|
||||
})
|
||||
AddLabels(result, c.container.Config.Labels)
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ func TestContainer(t *testing.T) {
|
||||
test.Poll(t, 100*time.Millisecond, want, func() interface{} {
|
||||
node := c.GetNode([]net.IP{})
|
||||
for k, v := range node.Metadata {
|
||||
if v == "0" {
|
||||
if v == "0" || v == "" {
|
||||
delete(node.Metadata, k)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,10 @@ func (c *mockContainer) Image() string {
|
||||
return c.c.Image
|
||||
}
|
||||
|
||||
func (c *mockContainer) Hostname() string {
|
||||
return ""
|
||||
}
|
||||
|
||||
func (c *mockContainer) StartGatheringStats() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -484,7 +484,7 @@ func MapContainer2ContainerImage(n RenderableNode, _ report.Networks) Renderable
|
||||
return RenderableNodes{}
|
||||
}
|
||||
|
||||
// Add container-<id> key to NMD, which will later be counted to produce the minor label
|
||||
// Add container id key to the counters, which will later be counted to produce the minor label
|
||||
result := NewDerivedNode(id, n)
|
||||
result.Node.Counters[containersKey] = 1
|
||||
return RenderableNodes{id: result}
|
||||
@@ -594,6 +594,29 @@ func MapContainer2Pod(n RenderableNode, _ report.Networks) RenderableNodes {
|
||||
return RenderableNodes{id: result}
|
||||
}
|
||||
|
||||
// MapContainer2Hostname maps container RenderableNodes to 'hostname' renderabled nodes..
|
||||
func MapContainer2Hostname(n RenderableNode, _ report.Networks) RenderableNodes {
|
||||
// Propogate all pseudo nodes
|
||||
if n.Pseudo {
|
||||
return RenderableNodes{n.ID: n}
|
||||
}
|
||||
|
||||
// Otherwise, if some some reason the container doesn't have a hostname
|
||||
// (maybe slightly out of sync reports), just drop it
|
||||
id, ok := n.Node.Metadata[docker.ContainerHostname]
|
||||
if !ok {
|
||||
return RenderableNodes{}
|
||||
}
|
||||
|
||||
result := NewDerivedNode(id, n)
|
||||
result.LabelMajor = id
|
||||
result.Rank = id
|
||||
|
||||
// Add container id key to the counters, which will later be counted to produce the minor label
|
||||
result.Node.Counters[containersKey] = 1
|
||||
return RenderableNodes{id: result}
|
||||
}
|
||||
|
||||
// MapCountContainers maps 1:1 container image nodes, counting
|
||||
// the number of containers grouped together and putting
|
||||
// that info in the minor label.
|
||||
|
||||
@@ -171,6 +171,16 @@ var ContainerImageRenderer = Map{
|
||||
},
|
||||
}
|
||||
|
||||
// ContainerHostnameRenderer is a Renderer which produces a renderable container
|
||||
// by hostname graph..
|
||||
var ContainerHostnameRenderer = Map{
|
||||
MapFunc: MapCountContainers,
|
||||
Renderer: Map{
|
||||
MapFunc: MapContainer2Hostname,
|
||||
Renderer: ContainerRenderer,
|
||||
},
|
||||
}
|
||||
|
||||
// AddressRenderer is a Renderer which produces a renderable address
|
||||
// graph from the address topology.
|
||||
var AddressRenderer = Map{
|
||||
|
||||
Reference in New Issue
Block a user