PublicDashboards: Make mixed datasource calls concurrently (#56421)

PublicDashboards: Make mixed datasource calls concurrently
This commit is contained in:
juanicabanas
2022-10-05 18:45:17 -03:00
committed by GitHub
parent d9cc292066
commit 69c49f6ba2
2 changed files with 63 additions and 9 deletions
+22 -8
View File
@@ -26,6 +26,7 @@ import (
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana-plugin-sdk-go/backend/httpclient"
"golang.org/x/sync/errgroup"
)
func ProvideService(
@@ -90,18 +91,31 @@ func (s *Service) QueryDataMultipleSources(ctx context.Context, user *user.Signe
} else {
resp := backend.NewQueryDataResponse()
// create new reqDTO with only the queries for that datasource
g, ctx := errgroup.WithContext(ctx)
results := make([]backend.Responses, len(byDataSource))
for _, queries := range byDataSource {
subDTO := reqDTO.CloneWithQueries(queries)
dataSourceQueries := queries
g.Go(func() error {
subDTO := reqDTO.CloneWithQueries(dataSourceQueries)
subResp, err := s.QueryData(ctx, user, skipCache, subDTO, handleExpressions)
subResp, err := s.QueryData(ctx, user, skipCache, subDTO, handleExpressions)
if err != nil {
return nil, err
}
if err == nil {
results = append(results, subResp.Responses)
}
for refId, queryResponse := range subResp.Responses {
resp.Responses[refId] = queryResponse
return err
})
}
if err := g.Wait(); err != nil {
return nil, err
}
for _, result := range results {
for refId, dataResponse := range result {
resp.Responses[refId] = dataResponse
}
}