mirror of
https://github.com/weaveworks/scope.git
synced 2026-03-03 18:20:27 +00:00
87 lines
2.3 KiB
Go
87 lines
2.3 KiB
Go
package render
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/weaveworks/scope/probe/docker"
|
|
"github.com/weaveworks/scope/report"
|
|
)
|
|
|
|
// ECSTaskRenderer is a Renderer for Amazon ECS tasks.
|
|
var ECSTaskRenderer = ConditionalRenderer(renderECSTopologies,
|
|
ApplyDecorators(
|
|
MakeMap(
|
|
PropagateSingleMetrics(report.Container),
|
|
MakeReduce(
|
|
MakeMap(
|
|
MapContainer2ECSTask,
|
|
ContainerWithImageNameRenderer,
|
|
),
|
|
SelectECSTask,
|
|
),
|
|
),
|
|
),
|
|
)
|
|
|
|
// ECSServiceRenderer is a Renderer for Amazon ECS services.
|
|
var ECSServiceRenderer = ConditionalRenderer(renderECSTopologies,
|
|
ApplyDecorators(
|
|
MakeMap(
|
|
PropagateSingleMetrics(report.ECSTask),
|
|
MakeReduce(
|
|
MakeMap(
|
|
Map2Parent(report.ECSService),
|
|
ECSTaskRenderer,
|
|
),
|
|
SelectECSService,
|
|
),
|
|
),
|
|
),
|
|
)
|
|
|
|
// MapContainer2ECSTask maps container Nodes to ECS Task
|
|
// Nodes.
|
|
//
|
|
// If this function is given a node without an ECS Task parent
|
|
// (including other pseudo nodes), it will produce an "Unmanaged"
|
|
// pseudo node.
|
|
//
|
|
// TODO: worth merging with MapContainer2Pod?
|
|
func MapContainer2ECSTask(n report.Node, _ report.Networks) report.Nodes {
|
|
// Uncontained becomes unmanaged in the tasks view
|
|
if strings.HasPrefix(n.ID, MakePseudoNodeID(UncontainedID)) {
|
|
id := MakePseudoNodeID(UnmanagedID, report.ExtractHostID(n))
|
|
node := NewDerivedPseudoNode(id, n)
|
|
return report.Nodes{id: node}
|
|
}
|
|
|
|
// Propagate all pseudo nodes
|
|
if n.Topology == Pseudo {
|
|
return report.Nodes{n.ID: n}
|
|
}
|
|
|
|
// Ignore non-running containers
|
|
if state, ok := n.Latest.Lookup(docker.ContainerState); ok && state != docker.StateRunning {
|
|
return report.Nodes{}
|
|
}
|
|
|
|
taskIDSet, ok := n.Parents.Lookup(report.ECSTask)
|
|
if !ok || len(taskIDSet) == 0 {
|
|
id := MakePseudoNodeID(UnmanagedID, report.ExtractHostID(n))
|
|
node := NewDerivedPseudoNode(id, n)
|
|
return report.Nodes{id: node}
|
|
}
|
|
nodeID := taskIDSet[0]
|
|
node := NewDerivedNode(nodeID, n).WithTopology(report.ECSTask)
|
|
// Propagate parent service
|
|
if serviceIDSet, ok := n.Parents.Lookup(report.ECSService); ok {
|
|
node = node.WithParents(report.MakeSets().Add(report.ECSService, serviceIDSet))
|
|
}
|
|
node.Counters = node.Counters.Add(n.Topology, 1)
|
|
return report.Nodes{nodeID: node}
|
|
}
|
|
|
|
func renderECSTopologies(rpt report.Report) bool {
|
|
return len(rpt.ECSTask.Nodes)+len(rpt.ECSService.Nodes) >= 1
|
|
}
|