Files
grafana/pkg/services/ngalert/eval/eval_bench_test.go
T
grafana-delivery-bot[bot] 8859bcaf16 [v10.0.x] Alerting: Improve performance of matching captures (#71999)
* Alerting: Improve performance of matching captures (#71828)

This commit updates eval.go to improve the performance of matching
captures in the general case. In some cases we have reduced the
runtime of the function from 10s of minutes to a couple 100ms.
In the case where no capture matches the exact labels, we revert to
the current subset/superset match, but with a reduced search space
due to grouping captures.

(cherry picked from commit 8dd3eb856d)

* Add label fingerprints from grafana-plugin-sdk-go

* Remove unsafe.StringData as we use Go 1.19

* Fix lint

---------

Co-authored-by: George Robinson <george.robinson@grafana.com>
2023-07-24 15:44:12 +02:00

60 lines
1.5 KiB
Go

package eval
import (
"context"
"strconv"
"testing"
"time"
"github.com/grafana/grafana-plugin-sdk-go/backend"
"github.com/grafana/grafana-plugin-sdk-go/data"
"github.com/grafana/grafana/pkg/expr"
"github.com/grafana/grafana/pkg/services/ngalert/models"
"github.com/grafana/grafana/pkg/util"
)
func BenchmarkEvaluate(b *testing.B) {
var dataResp backend.QueryDataResponse
seedDataResponse(&dataResp, 10000)
var evaluator ConditionEvaluator = &conditionEvaluator{
expressionService: &fakeExpressionService{
hook: func(ctx context.Context, now time.Time, pipeline expr.DataPipeline) (*backend.QueryDataResponse, error) {
return &dataResp, nil
},
},
condition: models.Condition{
Condition: "B",
},
}
for i := 0; i < b.N; i++ {
_, err := evaluator.Evaluate(context.Background(), time.Now())
if err != nil {
b.Fatalf("Unexpected error: %s", err)
}
}
}
func seedDataResponse(r *backend.QueryDataResponse, n int) {
resps := make(backend.Responses, n)
for i := 0; i < n; i++ {
labels := data.Labels{
"foo": strconv.Itoa(i),
"bar": strconv.Itoa(i + 1),
}
a, b := resps["A"], resps["B"]
a.Frames = append(a.Frames, &data.Frame{
Fields: data.Fields{
data.NewField("Time", labels, []time.Time{time.Now()}),
data.NewField("Value", labels, []*float64{util.Pointer(1.0)}),
},
})
b.Frames = append(b.Frames, &data.Frame{
Fields: data.Fields{
data.NewField("Value", labels, []*float64{util.Pointer(1.0)}),
},
})
resps["A"], resps["B"] = a, b
}
r.Responses = resps
}