thanos-io / promql-engine

Multi-threaded PromQL engine implementation based on the Volcano paper.
Apache License 2.0
133 stars 52 forks source link

execution: wrong result on binary expression with subquery with @ modifier #383

Closed MichaHoffmann closed 6 months ago

MichaHoffmann commented 6 months ago

Adding this test to TestQueriesAgainstOldEngine results in failure

+               {
+                       name: "subquery in binary expression",
+                       load: `load 30s
+                               http_requests_total{pod="nginx-1", route="/"} 1.00+0.20x40
+                               http_requests_total{pod="nginx-2", route="/"} -44+2.00x40`,
+                       query: `
+      avg_over_time(http_requests_total @ end()[1h:1m] offset 3m3s)
+    or
+      absent_over_time(http_requests_total @ end()[1h:1m] offset 3m1s)
+      `,
+               },
            --- FAIL: TestQueriesAgainstOldEngine/subquery_in_binary_expression#04/disableOptimizers=false/disableFallback=true (0.00s)
                testutil.go:91: engine_test.go:1879: "Query: avg_over_time(http_requests_total @ 1800.000[1h:1m] offset 3m3s) or absent_over_time(http_requests_total @ 1800.000[1h:1m] offset 3m1s)
                    Explanation:
                    [*vectorOperator] or - many-to-many, ignoring: false, group: []:
                    ├──[*subqueryOperator] avg_over_time():
                    │  └──[*stepInvariantOperator]:
                    │     └──[*coalesce]:
                    │        ├──[*concurrencyOperator(buff=2)]:
                    │        │  └──[*vectorSelector] {[__name__="http_requests_total"]} 0 mod 4
                    │        ├──[*concurrencyOperator(buff=2)]:
                    │        │  └──[*vectorSelector] {[__name__="http_requests_total"]} 1 mod 4
                    │        ├──[*concurrencyOperator(buff=2)]:
                    │        │  └──[*vectorSelector] {[__name__="http_requests_total"]} 2 mod 4
                    │        └──[*concurrencyOperator(buff=2)]:
                    │           └──[*vectorSelector] {[__name__="http_requests_total"]} 3 mod 4
                    └──[*absentOperator]

                    "

                        exp: &promql.Result{Err:error(nil), Value:promql.Matrix{promql.Series{Metric:labels.Labels{labels.Label{Name:"pod", Value:"nginx-1"}, labels.Label{Name:"route", Value:"/"}}, Floats:[]promql.FPoint{promql.FPoint{T:0, F:9}, promql.FPoint{T:30000, F:9}, promql.FPoint{T:60000, F:9}, promql.FPoint{T:90000, F:9}, promql.FPoint{T:120000, F:9}, promql.FPoint{T:150000, F:9}, promql.FPoint{T:180000, F:9}, promql.FPoint{T:210000, F:9}, promql.FPoint{T:240000, F:9}, promql.FPoint{T:270000, F:9}, promql.FPoint{T:300000, F:9}, promql.FPoint{T:330000, F:9}, promql.FPoint{T:360000, F:9}, promql.FPoint{T:390000, F:9}, promql.FPoint{T:420000, F:9}, promql.FPoint{T:450000, F:9}, promql.FPoint{T:480000, F:9}, promql.FPoint{T:510000, F:9}, promql.FPoint{T:540000, F:9}, promql.FPoint{T:570000, F:9}, promql.FPoint{T:600000, F:9}, promql.FPoint{T:630000, F:9}, promql.FPoint{T:660000, F:9}, promql.FPoint{T:690000, F:9}, promql.FPoint{T:720000, F:9}, promql.FPoint{T:750000, F:9}, promql.FPoint{T:780000, F:9}, promql...(output trimmed)

                        got: &promql.Result{Err:error(nil), Value:promql.Matrix{promql.Series{Metric:labels.Labels{}, Floats:[]promql.FPoint{promql.FPoint{T:0, F:1}, promql.FPoint{T:30000, F:1}, promql.FPoint{T:60000, F:1}, promql.FPoint{T:90000, F:1}, promql.FPoint{T:120000, F:1}, promql.FPoint{T:150000, F:1}, promql.FPoint{T:180000, F:1}, promql.FPoint{T:210000, F:1}, promql.FPoint{T:240000, F:1}, promql.FPoint{T:270000, F:1}, promql.FPoint{T:300000, F:1}, promql.FPoint{T:330000, F:1}, promql.FPoint{T:360000, F:1}, promql.FPoint{T:390000, F:1}, promql.FPoint{T:420000, F:1}, promql.FPoint{T:450000, F:1}, promql.FPoint{T:480000, F:1}, promql.FPoint{T:510000, F:1}, promql.FPoint{T:540000, F:1}, promql.FPoint{T:570000, F:1}, promql.FPoint{T:600000, F:1}, promql.FPoint{T:630000, F:1}, promql.FPoint{T:660000, F:1}, promql.FPoint{T:690000, F:1}, promql.FPoint{T:720000, F:1}, promql.FPoint{T:750000, F:1}, promql.FPoint{T:780000, F:1}, promql.FPoint{T:810000, F:1}, promql.FPoint{T:840000, F:1}, promql.FPoint{T:870000, F:...(output trimmed)
MichaHoffmann commented 6 months ago

Note that LHS and RHS are passing on their own but in the "or" they start failing