Skip to content

Commit 885e036

Browse files
committed
feat(influxdb): support raw queries in alerting
ref grafana#6231
1 parent ccee1b3 commit 885e036

File tree

5 files changed

+83
-0
lines changed

5 files changed

+83
-0
lines changed

pkg/tsdb/influxdb/model_parser.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ type InfluxdbQueryParser struct{}
1010

1111
func (qp *InfluxdbQueryParser) Parse(model *simplejson.Json) (*Query, error) {
1212
policy := model.Get("policy").MustString("default")
13+
rawQuery := model.Get("query").MustString("")
1314

1415
measurement, err := model.Get("measurement").String()
1516
if err != nil {
@@ -43,6 +44,7 @@ func (qp *InfluxdbQueryParser) Parse(model *simplejson.Json) (*Query, error) {
4344
GroupBy: groupBys,
4445
Tags: tags,
4546
Selects: selects,
47+
RawQuery: rawQuery,
4648
}, nil
4749
}
4850

pkg/tsdb/influxdb/model_parser_test.go

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,5 +111,61 @@ func TestInfluxdbQueryParser(t *testing.T) {
111111
So(len(res.Selects), ShouldEqual, 3)
112112
So(len(res.Tags), ShouldEqual, 2)
113113
})
114+
115+
Convey("can part raw query json model", func() {
116+
json := `
117+
{
118+
"dsType": "influxdb",
119+
"groupBy": [
120+
{
121+
"params": [
122+
"$interval"
123+
],
124+
"type": "time"
125+
},
126+
{
127+
"params": [
128+
"null"
129+
],
130+
"type": "fill"
131+
}
132+
],
133+
"policy": "default",
134+
"query": "RawDummieQuery",
135+
"rawQuery": true,
136+
"refId": "A",
137+
"resultFormat": "time_series",
138+
"select": [
139+
[
140+
{
141+
"params": [
142+
"value"
143+
],
144+
"type": "field"
145+
},
146+
{
147+
"params": [
148+
149+
],
150+
"type": "mean"
151+
}
152+
]
153+
],
154+
"tags": [
155+
156+
]
157+
}
158+
`
159+
160+
modelJson, err := simplejson.NewJson([]byte(json))
161+
So(err, ShouldBeNil)
162+
163+
res, err := parser.Parse(modelJson)
164+
So(err, ShouldBeNil)
165+
So(res.RawQuery, ShouldEqual, "RawDummieQuery")
166+
So(len(res.GroupBy), ShouldEqual, 2)
167+
So(len(res.Selects), ShouldEqual, 2)
168+
So(len(res.Tags), ShouldEqual, 0)
169+
})
114170
})
115171
}

pkg/tsdb/influxdb/models.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ type Query struct {
77
Tags []*Tag
88
GroupBy []*QueryPart
99
Selects []*Select
10+
RawQuery string
1011

1112
Interval string
1213
}

pkg/tsdb/influxdb/query_builder.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@ import (
1010
type QueryBuilder struct{}
1111

1212
func (qb *QueryBuilder) Build(query *Query, queryContext *tsdb.QueryContext) (string, error) {
13+
if query.RawQuery != "" {
14+
q := query.RawQuery
15+
16+
q = strings.Replace(q, "$timeFilter", qb.renderTimeFilter(query, queryContext), 1)
17+
q = strings.Replace(q, "$interval", tsdb.CalculateInterval(queryContext.TimeRange), 1)
18+
19+
return q, nil
20+
}
21+
1322
res := qb.renderSelectors(query, queryContext)
1423
res += qb.renderMeasurement(query)
1524
res += qb.renderWhereClause(query)

pkg/tsdb/influxdb/query_builder_test.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,5 +68,20 @@ func TestInfluxdbQueryBuilder(t *testing.T) {
6868
So(builder.renderTimeFilter(&query, queryContext), ShouldEqual, "time > now() - 10m")
6969
})
7070
})
71+
72+
Convey("can build query from raw query", func() {
73+
query := &Query{
74+
Selects: []*Select{{*qp1, *qp2}},
75+
Measurement: "cpu",
76+
Policy: "policy",
77+
GroupBy: []*QueryPart{groupBy1, groupBy3},
78+
Interval: "10s",
79+
RawQuery: "Raw query",
80+
}
81+
82+
rawQuery, err := builder.Build(query, queryContext)
83+
So(err, ShouldBeNil)
84+
So(rawQuery, ShouldEqual, `Raw query`)
85+
})
7186
})
7287
}

0 commit comments

Comments
 (0)