Files
weave-scope/app/origin_node.go
2015-05-22 15:57:52 +02:00

66 lines
1.8 KiB
Go

package main
import "github.com/weaveworks/scope/report"
// OriginNode is a node in the originating report topology. It's a process ID
// or network host. It's used by the /api/topology/{topology}/{nodeID} handler
// to generate detailed information. One node from a rendered topology may
// have multiple origin nodes.
type OriginNode struct {
Table report.Table
}
func getOriginNode(t report.Topology, id string) (OriginNode, bool) {
node, ok := t.NodeMetadatas[id]
if !ok {
return OriginNode{}, false
}
// The node represents different actual things depending on the topology.
// So we deduce what it is, based on the metadata.
if _, ok := node["pid"]; ok {
return originNodeForProcess(node), true
}
// Assume network host. Could strengthen this guess by adding a
// special key in the probe spying procedure.
return originNodeForNetworkHost(node), true
}
func originNodeForProcess(node report.NodeMetadata) OriginNode {
rows := []report.Row{
{Key: "Host", ValueMajor: node["domain"], ValueMinor: ""},
{Key: "PID", ValueMajor: node["pid"], ValueMinor: ""},
{Key: "Process name", ValueMajor: node["name"], ValueMinor: ""},
}
for _, tuple := range []struct{ key, human string }{
{"docker_id", "Container ID"},
{"docker_name", "Container name"},
{"cgroup", "cgroup"},
} {
if val, ok := node[tuple.key]; ok {
rows = append(rows, report.Row{Key: tuple.human, ValueMajor: val, ValueMinor: ""})
}
}
return OriginNode{
Table: report.Table{
Title: "Origin Process",
Numeric: false,
Rows: rows,
},
}
}
func originNodeForNetworkHost(node report.NodeMetadata) OriginNode {
rows := []report.Row{
{"Hostname", node["name"], ""},
}
return OriginNode{
Table: report.Table{
Title: "Origin Host",
Numeric: false,
Rows: rows,
},
}
}