|
@@ -14,51 +14,79 @@ func TestQueryCondition(t *testing.T) {
|
|
|
|
|
|
|
|
Convey("when evaluating query condition", t, func() {
|
|
Convey("when evaluating query condition", t, func() {
|
|
|
|
|
|
|
|
- bus.AddHandler("test", func(query *m.GetDataSourceByIdQuery) error {
|
|
|
|
|
- query.Result = &m.DataSource{Id: 1, Type: "graphite"}
|
|
|
|
|
- return nil
|
|
|
|
|
|
|
+ queryConditionScenario("Given avg() and > 100", func(ctx *queryConditionTestContext) {
|
|
|
|
|
+
|
|
|
|
|
+ ctx.reducer = `{"type": "avg"}`
|
|
|
|
|
+ ctx.evaluator = `{"type": ">", "params": [100]}`
|
|
|
|
|
+
|
|
|
|
|
+ Convey("should trigger when avg is above 100", func() {
|
|
|
|
|
+ ctx.series = tsdb.TimeSeriesSlice{tsdb.NewTimeSeries("test1", [][2]float64{{120, 0}})}
|
|
|
|
|
+ ctx.exec()
|
|
|
|
|
+
|
|
|
|
|
+ So(ctx.result.Error, ShouldBeNil)
|
|
|
|
|
+ So(ctx.result.Triggered, ShouldBeTrue)
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+ Convey("Should not trigger when avg is below 100", func() {
|
|
|
|
|
+ ctx.series = tsdb.TimeSeriesSlice{tsdb.NewTimeSeries("test1", [][2]float64{{90, 0}})}
|
|
|
|
|
+ ctx.exec()
|
|
|
|
|
+
|
|
|
|
|
+ So(ctx.result.Error, ShouldBeNil)
|
|
|
|
|
+ So(ctx.result.Triggered, ShouldBeFalse)
|
|
|
|
|
+ })
|
|
|
})
|
|
})
|
|
|
|
|
+ })
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- Convey("Given avg() and > 100", func() {
|
|
|
|
|
|
|
+type queryConditionTestContext struct {
|
|
|
|
|
+ reducer string
|
|
|
|
|
+ evaluator string
|
|
|
|
|
+ series tsdb.TimeSeriesSlice
|
|
|
|
|
+ result *AlertResultContext
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- jsonModel, err := simplejson.NewJson([]byte(`{
|
|
|
|
|
|
|
+type queryConditionScenarioFunc func(c *queryConditionTestContext)
|
|
|
|
|
+
|
|
|
|
|
+func (ctx *queryConditionTestContext) exec() {
|
|
|
|
|
+ jsonModel, err := simplejson.NewJson([]byte(`{
|
|
|
"type": "query",
|
|
"type": "query",
|
|
|
"query": {
|
|
"query": {
|
|
|
"params": ["A", "5m", "now"],
|
|
"params": ["A", "5m", "now"],
|
|
|
"datasourceId": 1,
|
|
"datasourceId": 1,
|
|
|
"model": {"target": "aliasByNode(statsd.fakesite.counters.session_start.mobile.count, 4)"}
|
|
"model": {"target": "aliasByNode(statsd.fakesite.counters.session_start.mobile.count, 4)"}
|
|
|
},
|
|
},
|
|
|
- "reducer": {"type": "avg", "params": []},
|
|
|
|
|
- "evaluator": {"type": ">", "params": [100]}
|
|
|
|
|
|
|
+ "reducer":` + ctx.reducer + `,
|
|
|
|
|
+ "evaluator":` + ctx.evaluator + `
|
|
|
}`))
|
|
}`))
|
|
|
- So(err, ShouldBeNil)
|
|
|
|
|
-
|
|
|
|
|
- condition, err := NewQueryCondition(jsonModel)
|
|
|
|
|
- So(err, ShouldBeNil)
|
|
|
|
|
-
|
|
|
|
|
- Convey("Should set result to triggered when avg is above 100", func() {
|
|
|
|
|
- context := &AlertResultContext{
|
|
|
|
|
- Rule: &AlertRule{},
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- condition.HandleRequest = func(req *tsdb.Request) (*tsdb.Response, error) {
|
|
|
|
|
- return &tsdb.Response{
|
|
|
|
|
- Results: map[string]*tsdb.QueryResult{
|
|
|
|
|
- "A": &tsdb.QueryResult{
|
|
|
|
|
- Series: tsdb.TimeSeriesSlice{
|
|
|
|
|
- tsdb.NewTimeSeries("test1", [][2]float64{{120, 0}}),
|
|
|
|
|
- },
|
|
|
|
|
- },
|
|
|
|
|
- },
|
|
|
|
|
- }, nil
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
- condition.Eval(context)
|
|
|
|
|
-
|
|
|
|
|
- So(context.Error, ShouldBeNil)
|
|
|
|
|
- So(context.Triggered, ShouldBeTrue)
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ So(err, ShouldBeNil)
|
|
|
|
|
+
|
|
|
|
|
+ condition, err := NewQueryCondition(jsonModel)
|
|
|
|
|
+ So(err, ShouldBeNil)
|
|
|
|
|
+
|
|
|
|
|
+ condition.HandleRequest = func(req *tsdb.Request) (*tsdb.Response, error) {
|
|
|
|
|
+ return &tsdb.Response{
|
|
|
|
|
+ Results: map[string]*tsdb.QueryResult{
|
|
|
|
|
+ "A": {Series: ctx.series},
|
|
|
|
|
+ },
|
|
|
|
|
+ }, nil
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ condition.Eval(ctx.result)
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func queryConditionScenario(desc string, fn queryConditionScenarioFunc) {
|
|
|
|
|
+ Convey(desc, func() {
|
|
|
|
|
+
|
|
|
|
|
+ bus.AddHandler("test", func(query *m.GetDataSourceByIdQuery) error {
|
|
|
|
|
+ query.Result = &m.DataSource{Id: 1, Type: "graphite"}
|
|
|
|
|
+ return nil
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
+ ctx := &queryConditionTestContext{}
|
|
|
|
|
+ ctx.result = &AlertResultContext{
|
|
|
|
|
+ Rule: &AlertRule{},
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ fn(ctx)
|
|
|
})
|
|
})
|
|
|
}
|
|
}
|