c38f6ff182
* tech(routines): move the async logic from notification to alerting notifier
* tech(notification): reduce code dupe
* fix(notification): dont touch the response unless its an error
* feat(alerting): make alerting exeuction async but flow sync
* tech(alerting): remove commented code
* tech(alerting): remove unused code
* tech(alerting): fix typo
* tech(alerting): implement Context on EvalContext
* tech(alerting): wait for all alerts to return
* feat(alerting): dont allow alert responses to cancel
* Revert "feat(alerting): dont allow alert responses to cancel"
This reverts commit 324b006c96.
* feat(alerting): give alerts some time to finish before closing down
60 lines
1.2 KiB
Go
60 lines
1.2 KiB
Go
package tsdb
|
|
|
|
import "context"
|
|
|
|
type HandleRequestFunc func(ctx context.Context, req *Request) (*Response, error)
|
|
|
|
func HandleRequest(ctx context.Context, req *Request) (*Response, error) {
|
|
context := NewQueryContext(req.Queries, req.TimeRange)
|
|
|
|
batches, err := getBatches(req)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
currentlyExecuting := 0
|
|
|
|
for _, batch := range batches {
|
|
if len(batch.Depends) == 0 {
|
|
currentlyExecuting += 1
|
|
batch.Started = true
|
|
go batch.process(ctx, context)
|
|
}
|
|
}
|
|
|
|
response := &Response{}
|
|
|
|
for currentlyExecuting != 0 {
|
|
select {
|
|
case batchResult := <-context.ResultsChan:
|
|
currentlyExecuting -= 1
|
|
|
|
response.BatchTimings = append(response.BatchTimings, batchResult.Timings)
|
|
|
|
if batchResult.Error != nil {
|
|
return nil, batchResult.Error
|
|
}
|
|
|
|
for refId, result := range batchResult.QueryResults {
|
|
context.Results[refId] = result
|
|
}
|
|
|
|
for _, batch := range batches {
|
|
// not interested in started batches
|
|
if batch.Started {
|
|
continue
|
|
}
|
|
|
|
if batch.allDependenciesAreIn(context) {
|
|
currentlyExecuting += 1
|
|
batch.Started = true
|
|
go batch.process(ctx, context)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
response.Results = context.Results
|
|
return response, nil
|
|
}
|