diff --git a/internal/insight/insight.go b/internal/insight/insight.go index 92c8069..5dd3873 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,42 @@ 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{} + var wg sync.WaitGroup + var err error + var mu sync.Mutex + for _, chunk := range chunks { - set, err := in.fetch(ctx, dbiResourceId, dur, chunk...) - if err != nil { - return nil, err - } + chunk := chunk + wg.Add(1) - for k, v := range set { - samples[k] = v - } + go func() { + defer wg.Done() + + set, e := in.fetch(childContext, dbiResourceId, dur, chunk...) + + mu.Lock() + defer mu.Unlock() + + if e != nil { + if err == nil { + cancel() + err = e + } + return + } + + for k, v := range set { + samples[k] = v + } + }() + } + wg.Wait() + if err != nil { + return nil, err } return samples, nil