From 3c5a5e147cf9791fc5d3ef0d39e0854238f7f891 Mon Sep 17 00:00:00 2001 From: derailed Date: Sat, 4 May 2019 08:03:15 -0600 Subject: [PATCH] fix clusterinfo on ctx switch --- internal/k8s/metrics.go | 23 ++++++++++++++++++++++ internal/k8s/no.go | 7 +++++++ internal/resource/list.go | 6 ++++++ internal/resource/pod.go | 4 ++++ internal/views/app.go | 4 ++-- internal/views/cluster_info.go | 36 +++++++++++++++++++--------------- internal/views/context.go | 5 +++++ internal/views/resource.go | 7 ++++++- 8 files changed, 73 insertions(+), 19 deletions(-) diff --git a/internal/k8s/metrics.go b/internal/k8s/metrics.go index 92b46078..b78b3209 100644 --- a/internal/k8s/metrics.go +++ b/internal/k8s/metrics.go @@ -1,6 +1,9 @@ package k8s import ( + "time" + + "github.com/rs/zerolog/log" v1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" mv1beta1 "k8s.io/metrics/pkg/apis/metrics/v1beta1" @@ -49,6 +52,10 @@ func NewMetricsServer(c Connection) *MetricsServer { // NodesMetrics retrieves metrics for a given set of nodes. func (m *MetricsServer) NodesMetrics(nodes Collection, metrics *mv1beta1.NodeMetricsList, mmx NodesMetrics) { + defer func(t time.Time) { + log.Debug().Msgf("Node MX %v", time.Since(t)) + }(time.Now()) + for _, n := range nodes { no := n.(v1.Node) mmx[no.Name] = NodeMetrics{ @@ -70,6 +77,10 @@ func (m *MetricsServer) NodesMetrics(nodes Collection, metrics *mv1beta1.NodeMet // ClusterLoad retrieves all cluster nodes metrics. func (m *MetricsServer) ClusterLoad(nodes *v1.NodeList, metrics *mv1beta1.NodeMetricsList, mx *ClusterMetrics) { + defer func(t time.Time) { + log.Debug().Msgf("Cluster Load %v", time.Since(t)) + }(time.Now()) + nodeMetrics := make(NodesMetrics, len(nodes.Items)) for _, n := range nodes.Items { @@ -100,6 +111,10 @@ func (m *MetricsServer) ClusterLoad(nodes *v1.NodeList, metrics *mv1beta1.NodeMe // FetchNodesMetrics return all metrics for pods in a given namespace. func (m *MetricsServer) FetchNodesMetrics() (*mv1beta1.NodeMetricsList, error) { + defer func(t time.Time) { + log.Debug().Msgf("Node metrics %v", time.Since(t)) + }(time.Now()) + client, err := m.MXDial() if err != nil { return nil, err @@ -110,6 +125,10 @@ func (m *MetricsServer) FetchNodesMetrics() (*mv1beta1.NodeMetricsList, error) { // FetchPodsMetrics return all metrics for pods in a given namespace. func (m *MetricsServer) FetchPodsMetrics(ns string) (*mv1beta1.PodMetricsList, error) { + defer func(t time.Time) { + log.Debug().Msgf("Pod Metrics %v", time.Since(t)) + }(time.Now()) + client, err := m.MXDial() if err != nil { return nil, err @@ -120,6 +139,10 @@ func (m *MetricsServer) FetchPodsMetrics(ns string) (*mv1beta1.PodMetricsList, e // PodsMetrics retrieves metrics for all pods in a given namespace. func (m *MetricsServer) PodsMetrics(pods *mv1beta1.PodMetricsList, mmx PodsMetrics) { + defer func(t time.Time) { + log.Debug().Msgf("Pod MX %v", time.Since(t)) + }(time.Now()) + // Compute all pod's containers metrics. for _, p := range pods.Items { var mx PodMetrics diff --git a/internal/k8s/no.go b/internal/k8s/no.go index 6d41de61..cdb5349d 100644 --- a/internal/k8s/no.go +++ b/internal/k8s/no.go @@ -1,6 +1,9 @@ package k8s import ( + "time" + + "github.com/rs/zerolog/log" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -22,6 +25,10 @@ func (n *Node) Get(_, name string) (interface{}, error) { // List all nodes on the cluster. func (n *Node) List(_ string) (Collection, error) { + defer func(t time.Time) { + log.Debug().Msgf("List Node %v", time.Since(t)) + }(time.Now()) + opts := metav1.ListOptions{ LabelSelector: n.labelSelector, FieldSelector: n.fieldSelector, diff --git a/internal/resource/list.go b/internal/resource/list.go index 984e937a..4106cac2 100644 --- a/internal/resource/list.go +++ b/internal/resource/list.go @@ -2,7 +2,9 @@ package resource import ( "reflect" + "time" + "github.com/rs/zerolog/log" "k8s.io/apimachinery/pkg/watch" "k8s.io/cli-runtime/pkg/genericclioptions" ) @@ -217,6 +219,10 @@ func (l *list) Data() TableData { // Reconcile previous vs current state and emits delta events. func (l *list) Reconcile() error { + defer func(t time.Time) { + log.Debug().Msgf("Reconcile %v", time.Since(t)) + }(time.Now()) + items, err := l.resource.List(l.namespace) if err != nil { return err diff --git a/internal/resource/pod.go b/internal/resource/pod.go index c80f6ba5..0b766504 100644 --- a/internal/resource/pod.go +++ b/internal/resource/pod.go @@ -179,6 +179,10 @@ func (r *Pod) Logs(c chan<- string, ns, n, co string, lines int64, prev bool) (c // List resources for a given namespace. func (r *Pod) List(ns string) (Columnars, error) { + defer func(t time.Time) { + log.Debug().Msgf("List Pod %v", time.Since(t)) + }(time.Now()) + pods, err := r.Resource.List(ns) if err != nil { return nil, err diff --git a/internal/views/app.go b/internal/views/app.go index 35419318..ba21a758 100644 --- a/internal/views/app.go +++ b/internal/views/app.go @@ -148,8 +148,8 @@ func (a *appView) stylesUpdater() (*fsnotify.Watcher, error) { a.QueueUpdateDraw(func() { a.refreshStyles() }) - // case err := <-w.Errors: - // log.Info().Err(err).Msg("Skin watcher failed") + case err := <-w.Errors: + log.Info().Err(err).Msg("Skin watcher failed") } } }() diff --git a/internal/views/cluster_info.go b/internal/views/cluster_info.go index d2de78ef..f961359a 100644 --- a/internal/views/cluster_info.go +++ b/internal/views/cluster_info.go @@ -14,8 +14,8 @@ import ( type clusterInfoView struct { *tview.Table - app *appView - cluster *resource.Cluster + app *appView + mxs resource.MetricsServer } // ClusterInfo tracks Kubernetes cluster and K9s information. @@ -31,31 +31,33 @@ type ClusterInfo interface { func newClusterInfoView(app *appView, mx resource.MetricsServer) *clusterInfoView { return &clusterInfoView{ - app: app, - Table: tview.NewTable(), - cluster: resource.NewCluster(app.conn(), &log.Logger, mx), + app: app, + Table: tview.NewTable(), + mxs: mx, } } func (v *clusterInfoView) init() { + cluster := resource.NewCluster(v.app.conn(), &log.Logger, v.mxs) + var row int v.SetCell(row, 0, v.sectionCell("Context")) - v.SetCell(row, 1, v.infoCell(v.cluster.ContextName())) + v.SetCell(row, 1, v.infoCell(cluster.ContextName())) row++ v.SetCell(row, 0, v.sectionCell("Cluster")) - v.SetCell(row, 1, v.infoCell(v.cluster.ClusterName())) + v.SetCell(row, 1, v.infoCell(cluster.ClusterName())) row++ v.SetCell(row, 0, v.sectionCell("User")) - v.SetCell(row, 1, v.infoCell(v.cluster.UserName())) + v.SetCell(row, 1, v.infoCell(cluster.UserName())) row++ v.SetCell(row, 0, v.sectionCell("K9s Rev")) v.SetCell(row, 1, v.infoCell(v.app.version)) row++ - rev := v.cluster.Version() + rev := cluster.Version() v.SetCell(row, 0, v.sectionCell("K8s Rev")) v.SetCell(row, 1, v.infoCell(rev)) row++ @@ -88,29 +90,31 @@ func (v *clusterInfoView) infoCell(t string) *tview.TableCell { } func (v *clusterInfoView) refresh() { + cluster := resource.NewCluster(v.app.conn(), &log.Logger, v.mxs) + var row int - v.GetCell(row, 1).SetText(v.cluster.ContextName()) + v.GetCell(row, 1).SetText(cluster.ContextName()) row++ - v.GetCell(row, 1).SetText(v.cluster.ClusterName()) + v.GetCell(row, 1).SetText(cluster.ClusterName()) row++ - v.GetCell(row, 1).SetText(v.cluster.UserName()) + v.GetCell(row, 1).SetText(cluster.UserName()) row += 2 - v.GetCell(row, 1).SetText(v.cluster.Version()) + v.GetCell(row, 1).SetText(cluster.Version()) row++ - nodes, err := v.cluster.GetNodes() + nodes, err := cluster.GetNodes() if err != nil { log.Warn().Err(err).Msg("List nodes") return } - mxNodes, err := v.cluster.FetchNodesMetrics() + mxNodes, err := cluster.FetchNodesMetrics() if err != nil { log.Warn().Err(err).Msg("List node metrics") return } var mx k8s.ClusterMetrics - v.cluster.Metrics(nodes, mxNodes, &mx) + cluster.Metrics(nodes, mxNodes, &mx) c := v.GetCell(row, 1) cpu := resource.AsPerc(mx.PercCPU) c.SetText(cpu + deltas(strip(c.Text), cpu)) diff --git a/internal/views/context.go b/internal/views/context.go index a47a21b2..092e08bc 100644 --- a/internal/views/context.go +++ b/internal/views/context.go @@ -34,6 +34,11 @@ func (v *contextView) useCmd(evt *tcell.EventKey) *tcell.EventKey { return evt } + // Update cluster info on context switch. + v.app.QueueUpdateDraw(func() { + v.app.clusterInfoView.refresh() + }) + v.app.gotoResource("po", true) return nil diff --git a/internal/views/resource.go b/internal/views/resource.go index 88fb47eb..dfcbb6fe 100644 --- a/internal/views/resource.go +++ b/internal/views/resource.go @@ -116,7 +116,7 @@ func (v *resourceView) updater(ctx context.Context) { if v.isSuspended() { continue } - v.app.QueueUpdate(func() { + v.app.QueueUpdateDraw(func() { v.app.clusterInfoView.refresh() }) } @@ -375,6 +375,11 @@ func (v *resourceView) doSwitchNamespace(ns string) { } func (v *resourceView) refresh() { + log.Debug().Msgf("%s", strings.Repeat("-", 80)) + defer func(t time.Time) { + log.Debug().Msgf("Refresh %v", time.Since(t)) + }(time.Now()) + if _, ok := v.CurrentPage().Item.(*tableView); !ok { return }