|
|
|
@ -5,11 +5,15 @@ import ( |
|
|
|
|
"errors" |
|
|
|
|
"math" |
|
|
|
|
"testing" |
|
|
|
|
|
|
|
|
|
"time" |
|
|
|
|
|
|
|
|
|
"github.com/grafana/grafana/pkg/bus" |
|
|
|
|
"github.com/grafana/grafana/pkg/components/simplejson" |
|
|
|
|
"github.com/grafana/grafana/pkg/infra/usagestats" |
|
|
|
|
"github.com/grafana/grafana/pkg/models" |
|
|
|
|
"github.com/grafana/grafana/pkg/setting" |
|
|
|
|
. "github.com/smartystreets/goconvey/convey" |
|
|
|
|
"github.com/stretchr/testify/require" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
type FakeEvalHandler struct { |
|
|
|
@ -37,15 +41,65 @@ func (handler *FakeResultHandler) handle(evalContext *EvalContext) error { |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type usageStatsMock struct { |
|
|
|
|
t *testing.T |
|
|
|
|
metricsFuncs []usagestats.MetricsFunc |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (usm *usageStatsMock) RegisterMetricsFunc(fn usagestats.MetricsFunc) { |
|
|
|
|
usm.metricsFuncs = append(usm.metricsFuncs, fn) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (usm *usageStatsMock) GetUsageReport(_ context.Context) (usagestats.Report, error) { |
|
|
|
|
all := make(map[string]interface{}) |
|
|
|
|
for _, fn := range usm.metricsFuncs { |
|
|
|
|
fnMetrics, err := fn() |
|
|
|
|
require.NoError(usm.t, err) |
|
|
|
|
|
|
|
|
|
for name, value := range fnMetrics { |
|
|
|
|
all[name] = value |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return usagestats.Report{Metrics: all}, nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (usm *usageStatsMock) ShouldBeReported(_ string) bool { |
|
|
|
|
return true |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func TestEngineProcessJob(t *testing.T) { |
|
|
|
|
Convey("Alerting engine job processing", t, func() { |
|
|
|
|
engine := ProvideAlertEngine(nil, nil, nil, nil, setting.NewCfg()) |
|
|
|
|
bus := bus.New() |
|
|
|
|
usMock := &usageStatsMock{t: t} |
|
|
|
|
engine := ProvideAlertEngine(nil, bus, nil, nil, usMock, setting.NewCfg()) |
|
|
|
|
setting.AlertingEvaluationTimeout = 30 * time.Second |
|
|
|
|
setting.AlertingNotificationTimeout = 30 * time.Second |
|
|
|
|
setting.AlertingMaxAttempts = 3 |
|
|
|
|
engine.resultHandler = &FakeResultHandler{} |
|
|
|
|
job := &Job{running: true, Rule: &Rule{}} |
|
|
|
|
|
|
|
|
|
Convey("Should register usage metrics func", func() { |
|
|
|
|
bus.AddHandler(func(q *models.GetAllAlertsQuery) error { |
|
|
|
|
settings, err := simplejson.NewJson([]byte(`{"conditions": [{"query": { "datasourceId": 1}}]}`)) |
|
|
|
|
if err != nil { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
q.Result = []*models.Alert{{Settings: settings}} |
|
|
|
|
return nil |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
bus.AddHandler(func(q *models.GetDataSourceQuery) error { |
|
|
|
|
q.Result = &models.DataSource{Id: 1, Type: models.DS_PROMETHEUS} |
|
|
|
|
return nil |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
report, err := usMock.GetUsageReport(context.Background()) |
|
|
|
|
So(err, ShouldBeNil) |
|
|
|
|
|
|
|
|
|
So(report.Metrics["stats.alerting.ds.prometheus.count"], ShouldEqual, 1) |
|
|
|
|
So(report.Metrics["stats.alerting.ds.other.count"], ShouldEqual, 0) |
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
Convey("Should trigger retry if needed", func() { |
|
|
|
|
Convey("error + not last attempt -> retry", func() { |
|
|
|
|
engine.evalHandler = NewFakeEvalHandler(0) |
|
|
|
|