influxdata / influxdata/kapacitor

EvalNode for joint Batch request doesn't work properply

Open
#2,219 1 comment 1 reaction 0 assignees View on GitHub
Dominant language
Go
Stars
2.4k
Forks
479
Avg merge
4d 16h
Merged PRs (30d)
4

Description

Hello team,

I experience the problem that EvalNode works somehow not consistent (according to my logic at least).

Kapacitor version (I'm using the official Docker container): Kapacitor OSS 1.5.2 (git: HEAD 3086452d00830e01d932838d8c6d1df818648ad3)

TICK script:
```
$ sudo docker container exec -it test_kapacitor kapacitor -url https://localhost:9092 -skipVerify show utiliztion_two_batch
ID: utiliztion_two_batch
Error:
Template:
Type: batch
Status: enabled
Executing: true
Created: 08 Jun 19 20:57 UTC
Modified: 09 Jun 19 10:57 UTC
LastEnabled: 09 Jun 19 10:57 UTC
Databases Retention Policies: ["dcf_snmp"."autogen"]
TICKscript:
dbrp "dcf_snmp"."autogen"

var utilization1 = batch
|query('''
SELECT ifHCOutOctets
FROM dcf_snmp.autogen.interfaceX
WHERE (hostname = 'de-bln-leaf-111' AND ifName = 'swp3')
''')
.align()
.period(15s)
.every(1m)
.offset(1m)
|last('ifHCOutOctets')
.as('ifHCOutOctets')
|log()
.prefix('AAAAAAAAAAAAAAAAAAAAAAA')

var utilization2 = batch
|query('''
SELECT ifHCOutOctets
FROM dcf_snmp.autogen.interfaceX
WHERE (hostname = 'de-bln-leaf-111' AND ifName = 'swp3')
''')
.align()
.period(15s)
.every(1m)
.offset(2m)
|last('ifHCOutOctets')
.as('ifHCOutOctets')
|log()
.prefix('BBBBBBBBBBBBBBBBBBBBBBB')

var utilization3 = batch
|query('''
SELECT ifHCOutOctets
FROM dcf_snmp.autogen.interfaceX
WHERE (hostname = 'de-bln-leaf-111' AND ifName = 'swp3')
''')
.align()
.period(15s)
.every(1m)
.offset(3m)
|last('ifHCOutOctets')
.as('ifHCOutOctets')
|log()
.prefix('CCCCCCCCCCCCCCCCCCCCCCC')

var total_util = utilization1
|join(utilization2, utilization3)
.as('utilization1', 'utilization2', 'utilization3')
.tolerance(3m)
|eval(lambda: ("utilization1.ifHCOutOctets" - "utilization2.ifHCOutOctets") * 8.0 / 600.0)
.as('current_speed')
|log()
.prefix('DDDDDDDDDDDDDDDDDDDDDDD')
|eval(lambda: ("utilization2.ifHCOutOctets" - "utilization3.ifHCOutOctets") * 8.0 / 600.0)
.as('previous_speed')
|log()
.prefix('EEEEEEEEEEEEEEEEEEEEEEE')

DOT:
digraph utiliztion_two_batch {
graph [throughput="0.00 batches/s"];

query7 [avg_exec_time_ns="0s" batches_queried="2" errors="0" points_queried="2" working_cardinality="0" ];
query7 -> last8 [processed="2"];

last8 [avg_exec_time_ns="0s" errors="0" working_cardinality="1" ];
last8 -> log9 [processed="2"];

log9 [avg_exec_time_ns="59.84µs" errors="0" working_cardinality="0" ];
log9 -> join12 [processed="2"];

query4 [avg_exec_time_ns="7.934504ms" batches_queried="2" errors="0" points_queried="2" working_cardinality="0" ];
query4 -> last5 [processed="2"];

last5 [avg_exec_time_ns="572ns" errors="0" working_cardinality="1" ];
last5 -> log6 [processed="2"];

log6 [avg_exec_time_ns="0s" errors="0" working_cardinality="0" ];
log6 -> join12 [processed="2"];

query1 [avg_exec_time_ns="9.422595ms" batches_queried="2" errors="0" points_queried="2" working_cardinality="0" ];
query1 -> last2 [processed="2"];

last2 [avg_exec_time_ns="3.152µs" errors="0" working_cardinality="1" ];
last2 -> log3 [processed="2"];

log3 [avg_exec_time_ns="0s" errors="0" working_cardinality="0" ];
log3 -> join12 [processed="2"];

join12 [avg_exec_time_ns="0s" errors="0" working_cardinality="1" ];
join12 -> eval13 [processed="1"];

eval13 [avg_exec_time_ns="0s" errors="0" working_cardinality="1" ];
eval13 -> log14 [processed="1"];

log14 [avg_exec_time_ns="0s" errors="0" working_cardinality="0" ];
log14 -> eval15 [processed="1"];

eval15 [avg_exec_time_ns="0s" errors="1" working_cardinality="1" ];
eval15 -> log16 [processed="0"];

log16 [avg_exec_time_ns="0s" errors="0" working_cardinality="0" ];
}
```

What I see in the logs. First of all, I can see that the requests to the InfluxDB are sent and the data point are collected:
```
ts=2019-06-09T10:54:00.001Z lvl=debug msg="starting next batch query" service=kapacitor task_master=main task=utiliztion_two_batch node=query7 query="SELECT ifHCOutOctets FROM dcf_snmp.autogen.interfaceX WHERE (hostname = 'de-bln-leaf-111' AND ifName = 'swp3') AND time >= '2019-06-09T10:50:45Z' AND time < '2019-06-09T10:51:00Z'"
ts=2019-06-09T10:54:00.001Z lvl=debug msg="starting next batch query" service=kapacitor task_master=main task=utiliztion_two_batch node=query4 query="SELECT ifHCOutOctets FROM dcf_snmp.autogen.interfaceX WHERE (hostname = 'de-bln-leaf-111' AND ifName = 'swp3') AND time >= '2019-06-09T10:51:45Z' AND time < '2019-06-09T10:52:00Z'"
ts=2019-06-09T10:54:00.001Z lvl=debug msg="starting next batch query" service=kapacitor task_master=main task=utiliztion_two_batch node=query1 query="SELECT ifHCOutOctets FROM dcf_snmp.autogen.interfaceX WHERE (hostname = 'de-bln-leaf-111' AND ifName = 'swp3') AND time >= '2019-06-09T10:52:45Z' AND time < '2019-06-09T10:53:00Z'"
ts=2019-06-09T10:54:00.010Z lvl=info msg=point service=kapacitor task_master=main task=utiliztion_two_batch node=log9 prefix=CCCCCCCCCCCCCCCCCCCCCCC name=interfaceX db= rp= group= field_ifHCOutOctets=461211 time=2019-06-09T10:51:00Z
ts=2019-06-09T10:54:00.013Z lvl=info msg=point service=kapacitor task_master=main task=utiliztion_two_batch node=log3 prefix=AAAAAAAAAAAAAAAAAAAAAAA name=interfaceX db= rp= group= field_ifHCOutOctets=467316 time=2019-06-09T10:53:00Z
ts=2019-06-09T10:54:00.013Z lvl=info msg=point service=kapacitor task_master=main task=utiliztion_two_batch node=log6 prefix=BBBBBBBBBBBBBBBBBBBBBBB name=interfaceX db= rp= group= field_ifHCOutOctets=464293 time=2019-06-09T10:52:00Z
```

But then something wents strange. The first EvalNode can calculate the needed value, but the second exports error:
```
ts=2019-06-09T10:59:00.030Z lvl=info msg=point service=kapacitor task_master=main task=utiliztion_two_batch node=log14 prefix=DDDDDDDDDDDDDDDDDDDDDDD name=interfaceX db= rp= group= field_current_speed=42.08 time=2019-06-09T10:57:00Z
ts=2019-06-09T10:59:00.030Z lvl=error msg="error evaluating expression" service=kapacitor task_master=main task=utiliztion_two_batch node=eval15 err="invalid math operator - for type missing"
```

Also the calculation in the first joint EvalNode isn't consistent, and it provides 0 result:
```
ts=2019-06-09T11:03:00.015Z lvl=info msg=point service=kapacitor task_master=main task=utiliztion_two_batch node=log6 prefix=BBBBBBBBBBBBBBBBBBBBBBB name=interfaceX db= rp= group= field_ifHCOutOctets=492422 time=2019-06-09T11:01:00Z
ts=2019-06-09T11:03:00.016Z lvl=info msg=point service=kapacitor task_master=main task=utiliztion_two_batch node=log3 prefix=AAAAAAAAAAAAAAAAAAAAAAA name=interfaceX db= rp= group= field_ifHCOutOctets=495591 time=2019-06-09T11:02:00Z
ts=2019-06-09T11:03:00.029Z lvl=info msg=point service=kapacitor task_master=main task=utiliztion_two_batch node=log9 prefix=CCCCCCCCCCCCCCCCCCCCCCC name=interfaceX db= rp= group= field_ifHCOutOctets=489364 time=2019-06-09T11:00:00Z
ts=2019-06-09T11:03:00.029Z lvl=info msg=point service=kapacitor task_master=main task=utiliztion_two_batch node=log14 prefix=DDDDDDDDDDDDDDDDDDDDDDD name=interfaceX db= rp= group= field_current_speed=0 time=2019-06-09T11:00:00Z
```

I need help!
Thanks and BR,
Anton

Contributor guide

Open the contributing guide

Research direction

Start by reproducing the TICK script with the three joined batch queries, EvalNode expressions, and the reported Kapacitor 1.5.2 logs. Inspect the EvalNode and join behavior involved in the two calculations; done means both expressions consistently receive the expected fields and produce correct results without missing-operand errors.

Written by the indexing model from the issue text.

Assessment

Tech stack
go
Domain
backend, data
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.