From c3b244cd11978062b90d8aba4853df4dcacbdcc1 Mon Sep 17 00:00:00 2001 From: Anshul Date: Sun, 7 Apr 2024 16:15:25 +0400 Subject: [PATCH] fix: concurrently fetch metrics --- internal/insight/insight.go | 39 ++++++++++++++++++++++++++++--------- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/internal/insight/insight.go b/internal/insight/insight.go index 92c8069..d0edd2c 100644 --- a/internal/insight/insight.go +++ b/internal/insight/insight.go @@ -10,6 +10,7 @@ package insight import ( "context" + "sync" "time" "github.com/aws/aws-sdk-go-v2/aws" @@ -65,17 +66,37 @@ func (in *Insight) Fetch(ctx context.Context, dbiResourceId string, dur time.Dur chunks = append(chunks, metrics[i:end]) } - // TODO: concurrent + childContext, cancel := context.WithCancel(ctx) + defer cancel() + samples := map[string]Samples{} - for _, chunk := range chunks { - set, err := in.fetch(ctx, dbiResourceId, dur, chunk...) - if err != nil { - return nil, err - } + var wg sync.WaitGroup + var err error - for k, v := range set { - samples[k] = v - } + for _, chunk := range chunks { + chunk := chunk + wg.Add(1) + + go func() { + defer wg.Done() + + set, e := in.fetch(childContext, dbiResourceId, dur, chunk...) + if e != nil { + if e != context.Canceled { + cancel() + err = e + } + return + } + + for k, v := range set { + samples[k] = v + } + }() + } + wg.Wait() + if err != nil { + return nil, err } return samples, nil