mirror of
https://github.com/weaveworks/scope.git
synced 2026-07-21 22:36:39 +00:00
Rewrite renderers for k8s/ecs/swarm to abstract common parts
Since all the renderers were doing almost-exactly the same thing, we abstract that out into a common function.
This commit is contained in:
@@ -6,32 +6,20 @@ import (
|
||||
|
||||
// ECSTaskRenderer is a Renderer for Amazon ECS tasks.
|
||||
var ECSTaskRenderer = ConditionalRenderer(renderECSTopologies,
|
||||
MakeMap(
|
||||
PropagateSingleMetrics(report.Container),
|
||||
MakeReduce(
|
||||
MakeMap(
|
||||
Map2Parent([]string{report.ECSTask}, NoParentsPseudo, UnmanagedID, nil),
|
||||
MakeFilter(
|
||||
IsRunning,
|
||||
ContainerWithImageNameRenderer,
|
||||
),
|
||||
),
|
||||
SelectECSTask,
|
||||
renderParents(
|
||||
report.Container, []string{report.ECSTask}, NoParentsPseudo, UnmanagedID, nil,
|
||||
MakeFilter(
|
||||
IsRunning,
|
||||
ContainerWithImageNameRenderer,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
// ECSServiceRenderer is a Renderer for Amazon ECS services.
|
||||
var ECSServiceRenderer = ConditionalRenderer(renderECSTopologies,
|
||||
MakeMap(
|
||||
PropagateSingleMetrics(report.ECSTask),
|
||||
MakeReduce(
|
||||
MakeMap(
|
||||
Map2Parent([]string{report.ECSService}, NoParentsDrop, "", nil),
|
||||
ECSTaskRenderer,
|
||||
),
|
||||
SelectECSService,
|
||||
),
|
||||
renderParents(
|
||||
report.ECSTask, []string{report.ECSService}, NoParentsDrop, "", nil,
|
||||
ECSTaskRenderer,
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
107
render/pod.go
107
render/pod.go
@@ -43,22 +43,18 @@ var PodRenderer = ConditionalRenderer(renderKubernetesTopologies,
|
||||
state, ok := n.Latest.Lookup(kubernetes.State)
|
||||
return (!ok || state != kubernetes.StateDeleted)
|
||||
},
|
||||
MakeMap(
|
||||
PropagateSingleMetrics(report.Container),
|
||||
MakeReduce(
|
||||
MakeMap(
|
||||
Map2Parent([]string{report.Pod}, NoParentsPseudo, UnmanagedID, nil),
|
||||
MakeFilter(
|
||||
ComposeFilterFuncs(
|
||||
IsRunning,
|
||||
Complement(isPauseContainer),
|
||||
),
|
||||
ContainerWithImageNameRenderer,
|
||||
MakeReduce(
|
||||
renderParents(
|
||||
report.Container, []string{report.Pod}, NoParentsPseudo, UnmanagedID, nil,
|
||||
MakeFilter(
|
||||
ComposeFilterFuncs(
|
||||
IsRunning,
|
||||
Complement(isPauseContainer),
|
||||
),
|
||||
ContainerWithImageNameRenderer,
|
||||
),
|
||||
ConnectionJoin(SelectPod, MapPod2IP),
|
||||
SelectPod,
|
||||
),
|
||||
ConnectionJoin(SelectPod, MapPod2IP),
|
||||
),
|
||||
),
|
||||
)
|
||||
@@ -66,30 +62,18 @@ var PodRenderer = ConditionalRenderer(renderKubernetesTopologies,
|
||||
// PodServiceRenderer is a Renderer which produces a renderable kubernetes services
|
||||
// graph by merging the pods graph and the services topology.
|
||||
var PodServiceRenderer = ConditionalRenderer(renderKubernetesTopologies,
|
||||
MakeMap(
|
||||
PropagateSingleMetrics(report.Pod),
|
||||
MakeReduce(
|
||||
MakeMap(
|
||||
Map2Parent([]string{report.Service}, NoParentsDrop, "", nil),
|
||||
PodRenderer,
|
||||
),
|
||||
SelectService,
|
||||
),
|
||||
renderParents(
|
||||
report.Pod, []string{report.Service}, NoParentsDrop, "", nil,
|
||||
PodRenderer,
|
||||
),
|
||||
)
|
||||
|
||||
// ReplicaSetRenderer is a Renderer which produces a renderable kubernetes replica sets
|
||||
// graph by merging the pods graph and the replica sets topology.
|
||||
var ReplicaSetRenderer = ConditionalRenderer(renderKubernetesTopologies,
|
||||
MakeMap(
|
||||
PropagateSingleMetrics(report.Pod),
|
||||
MakeReduce(
|
||||
MakeMap(
|
||||
Map2Parent([]string{report.ReplicaSet}, NoParentsDrop, "", nil),
|
||||
PodRenderer,
|
||||
),
|
||||
SelectReplicaSet,
|
||||
),
|
||||
renderParents(
|
||||
report.Pod, []string{report.ReplicaSet}, NoParentsDrop, "", nil,
|
||||
PodRenderer,
|
||||
),
|
||||
)
|
||||
|
||||
@@ -100,41 +84,42 @@ var ReplicaSetRenderer = ConditionalRenderer(renderKubernetesTopologies,
|
||||
// We can't simply combine the rendered graphs of the high level objects as they would never
|
||||
// have connections to each other.
|
||||
var KubeControllerRenderer = ConditionalRenderer(renderKubernetesTopologies,
|
||||
MakeReduce(
|
||||
// Include full deployment topology
|
||||
MakeFilter(
|
||||
// Filter out any remaining unmatched replica sets
|
||||
Complement(IsTopology(report.ReplicaSet)),
|
||||
MakeMap(
|
||||
// Include pod metrics previously mapped to replica sets, in deployments
|
||||
PropagateSingleMetrics(report.ReplicaSet),
|
||||
MakeMap(
|
||||
// Map replica sets to deployments, leaving unmatched replica sets and anything else unchanged
|
||||
Map2Parent([]string{report.Deployment}, NoParentsKeep, "", mapPodCounts),
|
||||
MakeReduce(
|
||||
// Include full replica set and daemonset topologies
|
||||
MakeMap(
|
||||
// Include pod metrics in mapped nodes
|
||||
PropagateSingleMetrics(report.Pod),
|
||||
MakeMap(
|
||||
// Transform pods to replica sets, daemonsets and 'unmanaged'
|
||||
Map2Parent([]string{
|
||||
report.ReplicaSet,
|
||||
report.DaemonSet,
|
||||
}, NoParentsPseudo, UnmanagedID, nil),
|
||||
PodRenderer,
|
||||
),
|
||||
),
|
||||
SelectReplicaSet,
|
||||
SelectDaemonSet,
|
||||
),
|
||||
),
|
||||
MakeFilter(
|
||||
// Filter out any remaining unmatched replica sets
|
||||
Complement(IsTopology(report.ReplicaSet)),
|
||||
renderParents(
|
||||
report.ReplicaSet, []string{report.Deployment}, NoParentsKeep, "", mapPodCounts,
|
||||
renderParents(
|
||||
report.Pod, []string{report.ReplicaSet, report.DaemonSet},
|
||||
NoParentsPseudo, UnmanagedID, nil,
|
||||
PodRenderer,
|
||||
),
|
||||
),
|
||||
SelectDeployment,
|
||||
),
|
||||
)
|
||||
|
||||
// renderParents produces a 'standard' renderer for mapping from some child topology to some parent topologies,
|
||||
// by taking a child renderer, mapping to parents, propagating single metrics, and joining with full parent topology.
|
||||
// Most options are as per Map2Parent.
|
||||
func renderParents(childTopology string, parentTopologies []string, noParentsAction noParentsActionEnum,
|
||||
noParentsPseudoID string, modifyMappedNode func(parent, original report.Node) report.Node,
|
||||
childRenderer Renderer) Renderer {
|
||||
selectors := make([]Renderer, len(parentTopologies))
|
||||
for i, topology := range parentTopologies {
|
||||
selectors[i] = TopologySelector(topology)
|
||||
}
|
||||
return MakeReduce(append(
|
||||
selectors,
|
||||
MakeMap(
|
||||
PropagateSingleMetrics(childTopology),
|
||||
MakeMap(
|
||||
Map2Parent(parentTopologies, noParentsAction, noParentsPseudoID, modifyMappedNode),
|
||||
childRenderer,
|
||||
),
|
||||
),
|
||||
)...)
|
||||
}
|
||||
|
||||
func mapPodCounts(parent, original report.Node) report.Node {
|
||||
// When mapping ReplicaSets to Deployments, we want to propagate the Pods counter
|
||||
if count, ok := original.Counters.Lookup(report.Pod); ok {
|
||||
|
||||
@@ -6,17 +6,11 @@ import (
|
||||
|
||||
// SwarmServiceRenderer is a Renderer for Docker Swarm services
|
||||
var SwarmServiceRenderer = ConditionalRenderer(renderSwarmTopologies,
|
||||
MakeMap(
|
||||
PropagateSingleMetrics(report.Container),
|
||||
MakeReduce(
|
||||
MakeMap(
|
||||
Map2Parent([]string{report.SwarmService}, NoParentsPseudo, UnmanagedID, nil),
|
||||
MakeFilter(
|
||||
IsRunning,
|
||||
ContainerWithImageNameRenderer,
|
||||
),
|
||||
),
|
||||
SelectSwarmService,
|
||||
renderParents(
|
||||
report.Container, []string{report.SwarmService}, NoParentsPseudo, UnmanagedID, nil,
|
||||
MakeFilter(
|
||||
IsRunning,
|
||||
ContainerWithImageNameRenderer,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user