Skip to content

Commit d6ce8f6

Browse files
jmichalak-fluxninjakwapik
authored andcommitted
Support math expressions for druid granularity (#81)
1 parent 606f645 commit d6ce8f6

File tree

4 files changed

+50
-0
lines changed

4 files changed

+50
-0
lines changed

go.mod

+2
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,8 @@ require (
287287
k8s.io/klog/v2 v2.90.1 // @grafana/grafana-app-platform-squad
288288
)
289289

290+
require github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible
291+
290292
require (
291293
cloud.google.com/go v0.110.0 // indirect
292294
cloud.google.com/go/compute/metadata v0.2.3 // indirect

go.sum

+1
Original file line numberDiff line numberDiff line change
@@ -625,6 +625,7 @@ github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob
625625
github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo=
626626
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk=
627627
github.com/Joker/hpp v1.0.0/go.mod h1:8x5n+M1Hp5hC0g8okX3sR3vFQwynaX/UgSOM9MeBKzY=
628+
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw=
628629
github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
629630
github.com/Masterminds/goutils v1.1.1 h1:5nUrii3FMTL5diU80unEVvNevw1nH4+ZV4DSLVJLSYI=
630631
github.com/Masterminds/goutils v1.1.1/go.mod h1:8cTjp+g8YejhMuvIA5y2vz3BpJxksy863GQaJW2MFNU=

pkg/tsdb/druid/druid.go

+26
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
"strings"
1212
"time"
1313

14+
"github.com/Knetic/govaluate"
1415
"github.com/bitly/go-simplejson"
1516
"github.com/grafadruid/go-druid"
1617
druidquerybuilder "github.com/grafadruid/go-druid/builder"
@@ -443,6 +444,9 @@ func (ds *Service) prepareQuery(qry []byte, s *druidInstanceSettings) (druidquer
443444
defaultQueryContext,
444445
ds.prepareQueryContext(queryContextParameters.([]interface{})))
445446
}
447+
if g, ok := q.Builder["granularity"].(map[string]any); ok {
448+
q.Builder["granularity"] = resolveGranularity(g)
449+
}
446450
jsonQuery, err := json.Marshal(q.Builder)
447451
if err != nil {
448452
return nil, nil, err
@@ -452,6 +456,28 @@ func (ds *Service) prepareQuery(qry []byte, s *druidInstanceSettings) (druidquer
452456
return query, mergeSettings(s.defaultQuerySettings, q.Settings), err
453457
}
454458

459+
func resolveGranularity(m map[string]any) map[string]any {
460+
// granularity is optional, so return early if not set and is of wrong type
461+
if m == nil || m["type"] != "duration" {
462+
return m
463+
}
464+
expr, ok := m["duration"].(string)
465+
if !ok {
466+
return m
467+
}
468+
469+
eval, err := govaluate.NewEvaluableExpression(expr)
470+
if err != nil {
471+
return m
472+
}
473+
result, err := eval.Evaluate(nil)
474+
if err != nil {
475+
return m
476+
}
477+
m["duration"] = result
478+
return m
479+
}
480+
455481
func (ds *Service) prepareQueryContext(parameters []interface{}) map[string]interface{} {
456482
ctx := make(map[string]interface{})
457483
for _, parameter := range parameters {

pkg/tsdb/druid/druid_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package druid
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
)
8+
9+
func TestResolveGranularity(t *testing.T) {
10+
granularity := map[string]any{
11+
"type": "duration",
12+
"duration": "10 * 10",
13+
"origin": "2012-01-01T00:30:00Z",
14+
}
15+
gran := resolveGranularity(granularity)
16+
assert.Equal(t, gran, map[string]any{
17+
"type": "duration",
18+
"duration": 100,
19+
"origin": "2012-01-01T00:30:00Z",
20+
})
21+
}

0 commit comments

Comments
 (0)