influxdata / influxdata/kapacitor
Panic when invoking function without parentheses
- Dominant language
- Go
- Stars
- 2.4k
- Forks
- 479
- Avg merge
- 4d 16h
- Merged PRs (30d)
- 4
Description
Found on Kapacitor 1.5.2.
A panic occurs when the `align` function is missing parentheses.
Trying to add this task template:
```
dbrp "telegraf"."two_days"
// Template parameters
var measurement string
var qy = 'select mean(*) from "telegraf"."two_days"."' + measurement + '"'
var agg_1m = batch
|query(qy)
.groupByMeasurement()
.groupBy(*)
.period(1m)
.every(1m)
.align
agg_1m
|influxDBOut()
.database('telegraf')
.retentionPolicy('fred')
.measurement(measurement)
```
kapacitor define template t -tick ./...
This panic and stack results:
```
panic serving 127.0.0.1:46056: reflect: call of reflect.Value.Interface on zero Value
goroutine 28299 [running]:
net/http.(*conn).serve.func1(0xc0001fafa0)
/usr/local/go/src/net/http/server.go:1746 +0xd0
panic(0x1eb3e00, 0xc0007a36a0)
/usr/local/go/src/runtime/panic.go:513 +0x1b9
github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/tick.Evaluate.func1(0xc0004da140)
/root/go/src/github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/tick/eval.go:58 +0x217
panic(0x1eb3e00, 0xc0007a36a0)
/usr/local/go/src/runtime/panic.go:513 +0x1b9
reflect.valueInterface(0x0, 0x0, 0x0, 0x1, 0x1, 0xc001022150)
/usr/local/go/src/reflect/value.go:983 +0x1a0
reflect.Value.Interface(0x0, 0x0, 0x0, 0x5, 0x3f13960)
/usr/local/go/src/reflect/value.go:978 +0x44
github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/tick.(*ReflectionDescriber).Property(0xc03c1ca8a0, 0xc000026106, 0x5, 0xc03c1ca801, 0x0)
/root/go/src/github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/tick/eval.go:815 +0x7a
github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/tick.evalChain(0x24f1ae0, 0xc01f2fa0f0, 0xc0007ae6c0, 0xc001118fa0, 0x0, 0xc04040afc0)
/root/go/src/github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/tick/eval.go:452 +0x241
github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/tick.eval(0x250fb20, 0xc01f2fa0f0, 0xc0007ae6c0, 0xc001118fa0, 0x0, 0xc04040afc0, 0x1, 0x0, 0x0)
/root/go/src/github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/tick/eval.go:181 +0xdad
github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/tick.eval(0x250fc40, 0xc035be6640, 0xc0007ae6c0, 0xc001118fa0, 0x0, 0xc04040afc0, 0x1, 0x0, 0x0)
/root/go/src/github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/tick/eval.go:164 +0x1903
github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/tick.eval(0x250fee0, 0xc04040acc0, 0xc0007ae6c0, 0xc001118fa0, 0x0, 0xc04040afc0, 0x1, 0xc0004da130, 0x0)
/root/go/src/github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/tick/eval.go:216 +0x1517
github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/tick.Evaluate(0xc000026000, 0x17b, 0xc0007ae6c0, 0x0, 0xc000015001, 0x0, 0x3f12708, 0xc0000a9860)
/root/go/src/github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/tick/eval.go:72 +0x16d
github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/pipeline.createPipelineAndVars(0xc000026000, 0x17b, 0x2, 0xc0007ae6c0, 0x2501da0, 0xc000318640, 0x0, 0xc000517101, 0xc000517108, 0x40c448, ...)
/root/go/src/github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/pipeline/pipeline.go:94 +0x1c0
github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/pipeline.CreateTemplatePipeline(0xc000026000, 0x17b, 0x2, 0xc0007ae6c0, 0x2501da0, 0xc000318640, 0xc0003a82d0, 0x227b0f1, 0x4)
/root/go/src/github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/pipeline/pipeline.go:29 +0x81
github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor.(*TaskMaster).NewTemplate(0xc000104580, 0xc0007620c0, 0xd, 0xc000026000, 0x17b, 0x1, 0x0, 0xc0000260a5, 0xc000384e60)
/root/go/src/github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/task_master.go:375 +0xbe
github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/services/task_store.(*Service).templateTask(0xc0005fe0a0, 0xc0007620c0, 0xd, 0x1, 0xc000026000, 0x17b, 0x0, 0x0, 0x0, 0x0, ...)
/root/go/src/github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/services/task_store/service.go:1979 +0x99
github.com/influxdata/fermium/vendor/github.com/influxdata/kapacitor/services/task_store.(*Service).handleCreateTemplate(0xc0005fe0a0, 0x24f9ce0, 0xc0007ae5c0, 0xc001588900)
```
Contributor guide
Research direction
Start with tick/eval.go, following Evaluate through evalChain and ReflectionDescriber.Property, then reproduce the missing-parentheses template with the kapacitor define template command. Done means the invalid align invocation is handled without a server panic and produces an appropriate error; add coverage where the evaluator tests are located.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- go
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 45/100