From 5856f372db558d1281d05111bbad2bcdf6905f3e Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Sun, 18 Apr 2021 17:33:18 +0000 Subject: [PATCH] multitenant: resolve collectors less frequently DNS records don't change that fast --- app/multitenant/aws_collector.go | 3 +++ app/multitenant/collector.go | 13 ++++++++----- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/app/multitenant/aws_collector.go b/app/multitenant/aws_collector.go index 0a387e5c1..c18966125 100644 --- a/app/multitenant/aws_collector.go +++ b/app/multitenant/aws_collector.go @@ -156,6 +156,9 @@ type awsCollector struct { nats *nats.Conn waitersLock sync.Mutex waiters map[watchKey]*nats.Subscription + + collectors []string + lastResolved time.Time } // Shortcut reports: diff --git a/app/multitenant/collector.go b/app/multitenant/collector.go index 466dd3130..3c23373d6 100644 --- a/app/multitenant/collector.go +++ b/app/multitenant/collector.go @@ -10,6 +10,7 @@ import ( "net/http" "strconv" "sync" + "time" "context" @@ -114,12 +115,14 @@ func (c *awsCollector) reportsFromLive(ctx context.Context, userid string) ([]re } // We are a querier: fetch the most up-to-date reports from collectors - // TODO: resolve c.collectorAddress periodically instead of every time we make a call - addrs := resolve(c.cfg.CollectorAddr) - reports := make([]*report.Report, len(addrs)) + if time.Since(c.lastResolved) > time.Second*5 { + c.collectors = resolve(c.cfg.CollectorAddr) + c.lastResolved = time.Now() + } + reports := make([]*report.Report, len(c.collectors)) // make a call to each collector and fetch its data for this userid g, ctx := errgroup.WithContext(ctx) - for i, addr := range addrs { + for i, addr := range c.collectors { i, addr := i, addr // https://golang.org/doc/faq#closures_and_goroutines g.Go(func() error { body, err := oneCall(ctx, addr, "/api/report", userid) @@ -141,7 +144,7 @@ func (c *awsCollector) reportsFromLive(ctx context.Context, userid string) ([]re } // dereference pointers into the expected return format - ret := make([]report.Report, 0, len(addrs)) + ret := make([]report.Report, 0, len(reports)) for _, rpt := range reports { if rpt != nil { ret = append(ret, *rpt)