in pkg/graphql/dashboard/global.go [218:272]
func Global(ctx context.Context, duration api.Duration) (*GlobalData, error) {
// Load template to `globalTemplate`, so the subsequent three calls can ues it directly.
_, err := LoadTemplate(ctx.Value(contextkey.DashboardTemplate{}).(string))
if err != nil {
return nil, nil
}
errors := make(chan error)
done := make(chan bool)
// Use three goroutines to enable concurrent execution of three graphql queries.
var wg sync.WaitGroup
wg.Add(3)
var m [][]*api.SelectedRecord
go func() {
m, err = Metrics(ctx, duration)
if err != nil {
errors <- err
}
wg.Done()
}()
var rl map[string]map[string]*displayable.MetricValue
go func() {
rl = responseLatency(ctx, duration)
wg.Done()
}()
var hm api.HeatMap
go func() {
hm, err = heatMap(ctx, duration)
if err != nil {
errors <- err
}
wg.Done()
}()
go func() {
wg.Wait()
close(done)
}()
select {
case <-done:
break
case err := <-errors:
close(errors)
return nil, err
}
var globalData GlobalData
globalData.Metrics = m
globalData.ResponseLatency = rl
globalData.HeatMap = hm
return &globalData, nil
}