From c4ef1fc0088833fa6a72460ac8a3a41d827f6aa9 Mon Sep 17 00:00:00 2001 From: John Howard Date: Thu, 27 Jun 2019 17:32:56 -0700 Subject: [PATCH] Fetch in parallel --- client/client.go | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/client/client.go b/client/client.go index 8c8c7b3..cb6cc5f 100644 --- a/client/client.go +++ b/client/client.go @@ -2,6 +2,7 @@ package client import ( "fmt" + "os" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" @@ -32,17 +33,39 @@ func Run(args *Args) error { if err != nil { return fmt.Errorf("failed to get kubeconfig: %v", err) } - metricsResponse, err := FetchMetrics(config, args.Namespace) - if err != nil { - return fmt.Errorf("failed to fetch metrics: %v", err) - } - podResponse, err := FetchPods(config, args.Namespace) - if err != nil { - return fmt.Errorf("failed to fetch pod: %v", err) + responseChan := make(chan map[string]*PodResource, 2) + errChan := make(chan error, 2) + go func() { + metricsResponse, err := FetchMetrics(config, args.Namespace) + if err != nil { + errChan <- fmt.Errorf("failed to fetch metrics: %v", err) + } else { + responseChan <- metricsResponse + } + }() + go func() { + podResponse, err := FetchPods(config, args.Namespace) + if err != nil { + errChan <- fmt.Errorf("failed to fetch pod: %v", err) + } else { + responseChan <- podResponse + } + }() + + var responses []map[string]*PodResource + got := 0 + for got < 2 { + select { + case res := <-responseChan: + responses = append(responses, res) + case err := <-errChan: + _, _ = fmt.Fprintf(os.Stderr, "warning: %v\n", err) + } + got++ } - resources, err := MergePodResources(metricsResponse, podResponse) + resources, err := MergePodResources(responses...) if err != nil { return fmt.Errorf("failed to merge responses: %v", err) }