Implement HasReports for live data from collectors

This commit is contained in:
Bryan Boreham
2021-04-12 19:44:03 +00:00
parent 055ca53241
commit 99582ba835
2 changed files with 47 additions and 0 deletions

View File

@@ -564,6 +564,10 @@ func (c *awsCollector) HasReports(ctx context.Context, timestamp time.Time) (boo
if err != nil {
return false, err
}
if time.Since(timestamp) < c.cfg.Window {
has, err := c.hasReportsFromLive(ctx, userid)
return has, err
}
start := timestamp.Add(-c.cfg.Window)
reportKeys, err := c.getReportKeys(ctx, userid, start, timestamp)
return len(reportKeys) > 0, err

View File

@@ -3,6 +3,7 @@ package multitenant
// Collect reports from probes per-tenant, and supply them to queriers on demand
import (
"encoding/json"
"fmt"
"io"
"net"
@@ -46,6 +47,48 @@ func (c *awsCollector) isCollector() bool {
return c.cfg.StoreInterval != 0
}
func (c *awsCollector) hasReportsFromLive(ctx context.Context, userid string) (bool, error) {
span, ctx := opentracing.StartSpanFromContext(ctx, "hasReportsFromLive")
defer span.Finish()
if c.isCollector() {
e, found := c.pending.Load(userid)
if !found {
return false, nil
}
entry := e.(*pendingEntry)
entry.Lock()
defer entry.Unlock()
if entry.report != nil {
return true, nil
}
for _, v := range entry.older {
if v != nil {
return true, nil
}
}
return false, nil
}
// We are a querier: ask each collector if it has any
// (serially, since we will bail out on the first one that has reports)
addrs := resolve(c.cfg.CollectorAddr)
for _, addr := range addrs {
body, err := oneCall(ctx, addr, "/api/probes?sparse=true", userid)
if err != nil {
return false, err
}
var hasReports bool
decoder := json.NewDecoder(body)
if err := decoder.Decode(&hasReports); err != nil {
log.Errorf("Error encoding response: %v", err)
}
body.Close()
if hasReports {
return true, nil
}
}
return false, nil
}
func (c *awsCollector) reportsFromLive(ctx context.Context, userid string) ([]report.Report, error) {
span, ctx := opentracing.StartSpanFromContext(ctx, "reportsFromLive")
defer span.Finish()