From 41cfd237f6aaa92803313024b98e06cf51563e6b Mon Sep 17 00:00:00 2001 From: Dennis Zhuang Date: Sun, 18 Oct 2026 07:56:32 +0800 Subject: [PATCH] test(promql): pin absent_over_time as absent over present_over_time Signed-off-by: Dennis Zhuang --- .../src/range_eval/absent_over_time_cases.txt | 804 ++++++++++++++++++ src/promql/src/range_eval/tests.rs | 101 +++ src/promql/src/select.rs | 5 +- 3 files changed, 909 insertions(+), 1 deletion(-) create mode 100644 src/promql/src/range_eval/absent_over_time_cases.txt diff --git a/src/promql/src/range_eval/absent_over_time_cases.txt b/src/promql/src/range_eval/absent_over_time_cases.txt new file mode 100644 index 00000000000..308da9c0c5e --- /dev/null +++ b/src/promql/src/range_eval/absent_over_time_cases.txt @@ -0,0 +1,804 @@ +# Generated by promql-compat cmd/narthex-golden-vector built for amd64 (Prometheus v3.15.0 +# engine, seed 1, 120 cases per kind). Each case lists its operation, the grid, the +# input series and either the result series or the error. Points are `grid index:hex bits`. +case absent_over_time 45000 host!="h2" +grid 100000 10000 6 +series __name__=a,host=h2,job=y ; 1:7ff8000000000001 +series __name__=a,host=h1,job=y,zone=z1 ; 5:c079dc0000000000 +series __name__=a,host=h1,job=x,zone=z1 ; 1:4078980000000000 2:406ad00000000000 3:c08b8e0000000000 +result - ; 0:3ff0000000000000 +end +case absent_over_time 10000 host!="h1",job="x",zone!="" +grid 100000 10000 7 +series __name__=a,host=h1,job=x ; 0:c089930000000000 1:c073020000000000 +series __name__=a,host=h2,job=y ; 5:408e5f0000000000 6:4072120000000000 +series __name__=a,host=h1,job=y,zone=z1 ; 4:c0666c0000000000 +result job=x ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 +end +case absent_over_time 45000 - +grid 100000 10000 7 +series __name__=a,host=h1,job=y,zone=z1 ; 1:c08a7d0000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 4:4048800000000000 5:c08e730000000000 +series __name__=a,host=h1,job=x ; 0:c075140000000000 1:0 +series __name__=a,host=h2,job=x ; +end +case absent_over_time 25000 job="x",zone!="z1" +grid 100000 10000 3 +series __name__=a,host=h2,job=x,zone=z1 ; 0:408bfc0000000000 +series __name__=a,host=h2,job=y ; 0:407a580000000000 1:408bc60000000000 +series __name__=a,host=h2,job=x ; 0:c054900000000000 1:408c2a0000000000 +series __name__=a,host=h1,job=x,zone=z1 ; 0:c065100000000000 2:c0886b0000000000 +end +case absent_over_time 10000 zone="" +grid 100000 10000 7 +series __name__=a,host=h1,job=x ; 0:408eea0000000000 +series __name__=a,host=h2,job=y ; 3:4081650000000000 4:c06a840000000000 5:fff0000000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 3:4082530000000000 5:c08dde0000000000 +series __name__=a,host=h1,job=y,zone=z1 ; 3:c05b700000000000 +series __name__=a,host=h1,job=x,zone=z1 ; 6:406b7c0000000000 +series __name__=a,host=h1,job=y ; 0:c080630000000000 1:7ff8000000000001 2:4081c00000000000 +result - ; 6:3ff0000000000000 +end +case absent_over_time 45000 host!="h2",job!="x",zone!="" +grid 100000 10000 3 +series __name__=a,host=h2,job=y ; +series __name__=a,host=h1,job=y,zone=z1 ; 1:c04bb00000000000 2:406b000000000000 +series __name__=a,host=h2,job=x ; +result - ; 0:3ff0000000000000 +end +case absent_over_time 5000 job="x" +grid 100000 10000 5 +series __name__=a,host=h2,job=y,zone=z1 ; 2:4081b90000000000 +series __name__=a,host=h2,job=x ; +series __name__=a,host=h1,job=x ; 3:c0872d0000000000 +result job=x ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 4:3ff0000000000000 +end +case absent_over_time 25000 host="h1" +grid 100000 10000 8 +series __name__=a,host=h1,job=x ; 1:c084510000000000 2:40804d0000000000 3:c0890d0000000000 4:c085580000000000 +series __name__=a,host=h1,job=y ; 3:4088fe0000000000 4:4056f00000000000 5:4082b60000000000 6:7e37e43c8800759c +series __name__=a,host=h2,job=y ; 7:407c440000000000 +result host=h1 ; 0:3ff0000000000000 +end +case absent_over_time 45000 job="y" +grid 100000 10000 4 +series __name__=a,host=h2,job=y ; 1:c087120000000000 2:7e37e43c8800759c 3:40775e0000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 0:405e900000000000 1:0 2:c043a00000000000 3:c08e610000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 0:c066140000000000 1:c0867d0000000000 2:4055a80000000000 3:408c220000000000 +series __name__=a,host=h1,job=y,zone=z1 ; 0:c042b00000000000 1:c073ee0000000000 +series __name__=a,host=h2,job=x ; 3:4071920000000000 +end +case absent_over_time 5000 - +grid 100000 10000 10 +series __name__=a,host=h1,job=x ; 3:c0797e0000000000 4:0 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 +end +case absent_over_time 5000 - +grid 100000 10000 10 +series __name__=a,host=h1,job=x ; +series __name__=a,host=h2,job=x,zone=z1 ; +series __name__=a,host=h2,job=y ; +series __name__=a,host=h2,job=x ; 8:405b980000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 1:4089390000000000 2:c065600000000000 3:c085950000000000 4:40710e0000000000 +result - ; 0:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 9:3ff0000000000000 +end +case absent_over_time 10000 job!="y",zone!="z1" +grid 100000 10000 6 +series __name__=a,host=h1,job=x ; 2:7e37e43c8800759c +result - ; 0:3ff0000000000000 1:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 +end +case absent_over_time 45000 job!="y",zone="z1" +grid 100000 10000 11 +series __name__=a,host=h1,job=x ; 7:7ff8000000000001 +result zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 10:3ff0000000000000 +end +case absent_over_time 25000 host="h2",job!="x",zone!="z1" +grid 100000 10000 6 +series __name__=a,host=h1,job=y ; 2:4068940000000000 3:405a580000000000 +series __name__=a,host=h2,job=x ; +result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 +end +case absent_over_time 10000 zone="" +grid 100000 10000 9 +series __name__=a,host=h2,job=y ; 5:4080eb0000000000 6:4032c00000000000 +series __name__=a,host=h2,job=x ; +series __name__=a,host=h1,job=x ; +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 +end +case absent_over_time 25000 job="y" +grid 100000 10000 3 +series __name__=a,host=h1,job=x,zone=z1 ; 2:7ff0000000000000 +result job=y ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 +end +case absent_over_time 25000 job!="y" +grid 100000 10000 6 +series __name__=a,host=h1,job=x ; 5:fff0000000000000 +series __name__=a,host=h1,job=y ; 1:408af90000000000 2:c079da0000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 5:c030a00000000000 +series __name__=a,host=h1,job=y,zone=z1 ; 2:c071fc0000000000 3:c071d20000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 +end +case absent_over_time 10000 host="h2",job!="x" +grid 100000 10000 4 +series __name__=a,host=h1,job=x,zone=z1 ; 1:c088900000000000 +result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 +end +case absent_over_time 5000 zone!="" +grid 100000 10000 9 +series __name__=a,host=h2,job=x,zone=z1 ; 5:7ff8000000000001 7:c072680000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 6:c074000000000000 7:c08d6b0000000000 +series __name__=a,host=h1,job=x,zone=z1 ; 8:c08efb0000000000 +series __name__=a,host=h1,job=y,zone=z1 ; 1:4082330000000000 +result - ; 0:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 +end +case absent_over_time 45000 job!="y",zone!="z1" +grid 100000 10000 9 +series __name__=a,host=h1,job=x ; 5:408eaf0000000000 6:7ff0000000000000 7:4052180000000000 +series __name__=a,host=h2,job=x ; 0:c08b0a0000000000 +series __name__=a,host=h2,job=y ; 2:408cdf0000000000 3:407bd40000000000 5:408aac0000000000 6:c04ce00000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 1:c083620000000000 3:408ba80000000000 4:7ff8000000000001 5:c07fbe0000000000 6:c072d40000000000 8:c046c00000000000 +end +case absent_over_time 5000 job!="x" +grid 100000 10000 7 +series __name__=a,host=h1,job=x ; 5:405a780000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 +end +case absent_over_time 5000 host="h2",job!="x" +grid 100000 10000 12 +series __name__=a,host=h1,job=y,zone=z1 ; +series __name__=a,host=h1,job=x ; 8:c065d40000000000 9:c0823e0000000000 +series __name__=a,host=h2,job=x ; 1:c000000000000000 2:405ab00000000000 3:7ff0000000000000 4:407aaa0000000000 5:c083e60000000000 6:c084d00000000000 7:c053f80000000000 8:c048200000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 8:c08c180000000000 9:7e37e43c8800759c +result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 10:3ff0000000000000 11:3ff0000000000000 +end +case absent_over_time 45000 zone="z1" +grid 100000 10000 3 +series __name__=a,host=h1,job=x,zone=z1 ; +series __name__=a,host=h2,job=y,zone=z1 ; 1:c089c80000000000 +result zone=z1 ; 0:3ff0000000000000 +end +case absent_over_time 10000 zone="" +grid 100000 10000 6 +series __name__=a,host=h1,job=x,zone=z1 ; 0:40826d0000000000 1:c083ff0000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 +end +case absent_over_time 5000 host="h1" +grid 100000 10000 3 +series __name__=a,host=h1,job=y,zone=z1 ; 1:c077060000000000 +series __name__=a,host=h2,job=y ; 1:405be80000000000 +series __name__=a,host=h1,job=x,zone=z1 ; +result host=h1 ; 0:3ff0000000000000 2:3ff0000000000000 +end +case absent_over_time 45000 job="y" +grid 100000 10000 5 +series __name__=a,host=h1,job=x ; 4:407f1a0000000000 +series __name__=a,host=h2,job=x ; 4:40754a0000000000 +series __name__=a,host=h1,job=x,zone=z1 ; +series __name__=a,host=h1,job=y,zone=z1 ; 1:4074580000000000 2:4084e50000000000 +result job=y ; 0:3ff0000000000000 +end +case absent_over_time 45000 - +grid 100000 10000 2 +series __name__=a,host=h1,job=y ; 1:fff0000000000000 +series __name__=a,host=h1,job=x ; +series __name__=a,host=h2,job=x ; 0:4078200000000000 1:c029000000000000 +series __name__=a,host=h2,job=y ; 0:4083220000000000 +end +case absent_over_time 45000 job!="x",zone="" +grid 100000 10000 8 +series __name__=a,host=h2,job=y,zone=z1 ; 2:408e660000000000 3:c05eb80000000000 +series __name__=a,host=h2,job=y ; 5:4077020000000000 6:c0740a0000000000 +series __name__=a,host=h2,job=x ; 2:fff0000000000000 4:c0774a0000000000 +series __name__=a,host=h1,job=x,zone=z1 ; 6:0 +series __name__=a,host=h1,job=x ; 1:c040900000000000 2:4087350000000000 3:40735e0000000000 5:408e050000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 +end +case absent_over_time 25000 job!="y" +grid 100000 10000 7 +series __name__=a,host=h1,job=y,zone=z1 ; 4:7e37e43c8800759c +series __name__=a,host=h2,job=x ; 6:c0779c0000000000 +series __name__=a,host=h2,job=y ; 2:4084890000000000 3:40683c0000000000 +series __name__=a,host=h1,job=y ; 4:7ff8000000000001 5:404f400000000000 6:c078e40000000000 +series __name__=a,host=h1,job=x ; 3:40759a0000000000 4:40802c0000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 +end +case absent_over_time 25000 host="h2",zone="" +grid 100000 10000 11 +series __name__=a,host=h2,job=x ; 4:0 5:c07bda0000000000 6:4076540000000000 +series __name__=a,host=h2,job=y ; 7:c082630000000000 +series __name__=a,host=h1,job=y ; 9:408a340000000000 +result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 10:3ff0000000000000 +end +case absent_over_time 5000 zone="z1" +grid 100000 10000 11 +series __name__=a,host=h2,job=y ; 4:4076ac0000000000 +series __name__=a,host=h1,job=y,zone=z1 ; 5:c07bd60000000000 6:c065000000000000 8:7ff0000000000000 9:408c110000000000 10:c0746e0000000000 +series __name__=a,host=h1,job=y ; 6:4088000000000000 7:fff0000000000000 8:4077ba0000000000 +result zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 7:3ff0000000000000 +end +case absent_over_time 25000 job="y",zone!="" +grid 100000 10000 12 +series __name__=a,host=h2,job=x ; 2:c06c200000000000 3:4084c10000000000 +series __name__=a,host=h1,job=y ; +series __name__=a,host=h2,job=y ; +result job=y ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 10:3ff0000000000000 11:3ff0000000000000 +end +case absent_over_time 10000 zone!="z1" +grid 100000 10000 3 +series __name__=a,host=h1,job=x ; 1:c069100000000000 2:0 +series __name__=a,host=h1,job=x,zone=z1 ; 1:c086ea0000000000 +series __name__=a,host=h1,job=y ; 2:c077a20000000000 +result - ; 0:3ff0000000000000 +end +case absent_over_time 45000 - +grid 100000 10000 3 +series __name__=a,host=h1,job=y ; 0:40811f0000000000 1:4087810000000000 2:c058b80000000000 +end +case absent_over_time 45000 job="y",zone!="z1" +grid 100000 10000 2 +series __name__=a,host=h2,job=x ; 0:c07fa60000000000 1:40821c0000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 0:407a7a0000000000 +result job=y ; 0:3ff0000000000000 1:3ff0000000000000 +end +case absent_over_time 25000 host="h1",job="y" +grid 100000 10000 5 +series __name__=a,host=h1,job=x ; 4:408d840000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 1:c071b40000000000 3:408b460000000000 4:c0840f0000000000 +series __name__=a,host=h2,job=x ; +series __name__=a,host=h1,job=y ; 1:4054b80000000000 +result host=h1,job=y ; 0:3ff0000000000000 4:3ff0000000000000 +end +case absent_over_time 45000 host="h2",job!="y" +grid 100000 10000 6 +series __name__=a,host=h1,job=x ; 1:c08a650000000000 3:c047200000000000 4:4060980000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 3:bfe4000000000000 4:c07d540000000000 5:4077dc0000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 5:4083d10000000000 +result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 +end +case absent_over_time 5000 - +grid 100000 10000 2 +series __name__=a,host=h2,job=y ; 1:4087460000000000 +series __name__=a,host=h2,job=x ; 0:c068800000000000 +series __name__=a,host=h1,job=x ; 1:c089420000000000 +end +case absent_over_time 25000 host="h1" +grid 100000 10000 10 +series __name__=a,host=h1,job=y ; 8:4080520000000000 9:c08ef50000000000 +series __name__=a,host=h1,job=x ; 5:c089710000000000 6:4074740000000000 7:40823d0000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 5:4089e80000000000 +result host=h1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 +end +case absent_over_time 45000 - +grid 100000 10000 5 +series __name__=a,host=h2,job=x,zone=z1 ; 3:c086dc0000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 0:c07f2a0000000000 1:0 2:408bf70000000000 +end +case absent_over_time 25000 - +grid 100000 10000 3 +series __name__=a,host=h2,job=y,zone=z1 ; 2:c051a80000000000 +series __name__=a,host=h2,job=x ; 0:4087d80000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 2:fff0000000000000 +series __name__=a,host=h1,job=y ; 0:40874b0000000000 +end +case absent_over_time 10000 job="x" +grid 100000 10000 9 +series __name__=a,host=h2,job=y,zone=z1 ; 4:c08b380000000000 5:4085140000000000 7:7ff8000000000001 +series __name__=a,host=h2,job=y ; 4:0 6:c081e60000000000 7:4068f80000000000 +result job=x ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 +end +case absent_over_time 45000 zone!="z1" +grid 100000 10000 12 +series __name__=a,host=h1,job=x ; 4:406e3c0000000000 5:c08b7b0000000000 7:c058f00000000000 8:c08dde0000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 11:405a500000000000 +series __name__=a,host=h1,job=y ; 11:40873f0000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 +end +case absent_over_time 45000 host!="h2",job!="x",zone="z1" +grid 100000 10000 3 +series __name__=a,host=h2,job=x ; 0:7ff0000000000000 1:7ff8000000000001 2:c083120000000000 +series __name__=a,host=h2,job=y ; +series __name__=a,host=h1,job=x,zone=z1 ; 1:4088c70000000000 +result zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 +end +case absent_over_time 25000 zone="" +grid 100000 10000 4 +series __name__=a,host=h1,job=x,zone=z1 ; 1:c082c70000000000 2:c085d40000000000 +series __name__=a,host=h2,job=x,zone=z1 ; +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 +end +case absent_over_time 10000 host!="h1",zone!="z1" +grid 100000 10000 6 +series __name__=a,host=h1,job=x ; 0:0 1:407e220000000000 2:c07aa60000000000 3:c083e50000000000 +series __name__=a,host=h2,job=x ; 5:7ff8000000000001 +series __name__=a,host=h1,job=y,zone=z1 ; 2:c07be60000000000 3:c089540000000000 4:c066740000000000 5:c07c6a0000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 +end +case absent_over_time 10000 host="h1",zone!="" +grid 100000 10000 3 +series __name__=a,host=h1,job=y,zone=z1 ; 2:4087fc0000000000 +series __name__=a,host=h1,job=y ; 2:4086a20000000000 +series __name__=a,host=h1,job=x,zone=z1 ; 2:7ff8000000000001 +series __name__=a,host=h1,job=x ; 1:4074c80000000000 +result host=h1 ; 0:3ff0000000000000 1:3ff0000000000000 +end +case absent_over_time 25000 host="h2",job="y",zone="z1" +grid 100000 10000 9 +series __name__=a,host=h2,job=y ; 8:c087ce0000000000 +series __name__=a,host=h2,job=x ; 3:c089820000000000 4:c07f2a0000000000 5:c04b700000000000 6:0 +result host=h2,job=y,zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 +end +case absent_over_time 5000 - +grid 100000 10000 5 +series __name__=a,host=h2,job=y,zone=z1 ; 1:407dfe0000000000 2:407c820000000000 3:c07d3c0000000000 4:7ff0000000000000 +series __name__=a,host=h1,job=x ; 0:408dbd0000000000 +series __name__=a,host=h1,job=x,zone=z1 ; 4:c081e60000000000 +series __name__=a,host=h1,job=y,zone=z1 ; 0:408bdb0000000000 +end +case absent_over_time 5000 - +grid 100000 10000 11 +series __name__=a,host=h1,job=x ; 9:c085bd0000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 6:7ff8000000000001 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 10:3ff0000000000000 +end +case absent_over_time 5000 host="h2",zone="" +grid 100000 10000 10 +series __name__=a,host=h1,job=y,zone=z1 ; 4:4054900000000000 +result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 +end +case absent_over_time 5000 job!="y" +grid 100000 10000 7 +series __name__=a,host=h1,job=x ; 2:4060600000000000 3:408f080000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 +end +case absent_over_time 45000 host="h2" +grid 100000 10000 8 +series __name__=a,host=h1,job=x ; 2:c071e40000000000 3:c089450000000000 4:4084b40000000000 +series __name__=a,host=h1,job=y ; 5:c060ac0000000000 6:408e290000000000 7:4060f00000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 6:c087fc0000000000 +series __name__=a,host=h2,job=y ; 7:c046f00000000000 +result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 +end +case absent_over_time 25000 host="h1",job!="y" +grid 100000 10000 3 +series __name__=a,host=h2,job=y,zone=z1 ; 1:4084f20000000000 +series __name__=a,host=h1,job=x ; 0:c08dab0000000000 1:c0852b0000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 2:4035400000000000 +series __name__=a,host=h2,job=y ; 1:fff0000000000000 +end +case absent_over_time 5000 host!="h1" +grid 100000 10000 2 +series __name__=a,host=h1,job=x,zone=z1 ; +result - ; 0:3ff0000000000000 1:3ff0000000000000 +end +case absent_over_time 25000 job="x" +grid 100000 10000 11 +series __name__=a,host=h2,job=y,zone=z1 ; 8:c059800000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 5:4071460000000000 7:4081220000000000 +series __name__=a,host=h2,job=x ; 3:407cf80000000000 4:4088fb0000000000 5:40820a0000000000 +result job=x ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 10:3ff0000000000000 +end +case absent_over_time 25000 - +grid 100000 10000 10 +series __name__=a,host=h2,job=y ; +series __name__=a,host=h2,job=x,zone=z1 ; 2:4087750000000000 3:7e37e43c8800759c +series __name__=a,host=h1,job=y,zone=z1 ; 5:0 7:c07a8c0000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 +end +case absent_over_time 25000 host="h2" +grid 100000 10000 10 +series __name__=a,host=h1,job=y ; 0:4082130000000000 2:c084730000000000 3:408ac60000000000 4:4042d00000000000 5:c08daf0000000000 6:40736c0000000000 +series __name__=a,host=h2,job=x ; 1:7ff8000000000001 2:4085af0000000000 3:c074820000000000 5:c0833a0000000000 6:407d660000000000 7:40837d0000000000 9:c06efc0000000000 +result host=h2 ; 0:3ff0000000000000 +end +case absent_over_time 45000 host="h2",zone!="" +grid 100000 10000 11 +series __name__=a,host=h2,job=y,zone=z1 ; 10:4077ba0000000000 +series __name__=a,host=h1,job=y ; 0:408cce0000000000 1:408bd00000000000 3:4084330000000000 5:407ff00000000000 6:c0770a0000000000 7:fff0000000000000 8:7ff0000000000000 9:406ec40000000000 +series __name__=a,host=h2,job=x ; 4:7ff8000000000001 5:c06e840000000000 6:c088c20000000000 7:40813f0000000000 +result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 +end +case absent_over_time 45000 - +grid 100000 10000 8 +series __name__=a,host=h1,job=x,zone=z1 ; 3:4065f80000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 5:c08bd20000000000 6:408c3d0000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 4:c08bb40000000000 7:408ccd0000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 +end +case absent_over_time 45000 host!="h2",job="x" +grid 100000 10000 4 +series __name__=a,host=h1,job=x,zone=z1 ; 2:c082f20000000000 3:c0864b0000000000 +series __name__=a,host=h1,job=y ; 2:40635c0000000000 3:4081d80000000000 +series __name__=a,host=h2,job=y,zone=z1 ; +series __name__=a,host=h2,job=y ; 2:c087ac0000000000 +result job=x ; 0:3ff0000000000000 1:3ff0000000000000 +end +case absent_over_time 25000 job!="y" +grid 100000 10000 5 +series __name__=a,host=h2,job=x ; 2:4057200000000000 +series __name__=a,host=h1,job=y,zone=z1 ; 2:c076bc0000000000 3:c07fc40000000000 4:40883c0000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 0:c08b640000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 3:c080f00000000000 4:40754e0000000000 +end +case absent_over_time 25000 zone="" +grid 100000 10000 2 +series __name__=a,host=h2,job=x,zone=z1 ; 1:c084120000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 +end +case absent_over_time 10000 job="y",zone="z1" +grid 100000 10000 11 +series __name__=a,host=h2,job=y ; 6:c0743c0000000000 +series __name__=a,host=h2,job=x ; 7:7ff0000000000000 8:c066c00000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 0:c06f580000000000 2:c077d60000000000 +series __name__=a,host=h1,job=y,zone=z1 ; 5:4074c40000000000 6:c08ea90000000000 7:c06ca80000000000 8:c05ed80000000000 10:4063200000000000 +result job=y,zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 9:3ff0000000000000 +end +case absent_over_time 45000 - +grid 100000 10000 3 +series __name__=a,host=h2,job=y ; 1:4062cc0000000000 2:c089f60000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 1:c0711c0000000000 +result - ; 0:3ff0000000000000 +end +case absent_over_time 25000 zone!="" +grid 100000 10000 11 +series __name__=a,host=h2,job=x ; 8:40678c0000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 10:3ff0000000000000 +end +case absent_over_time 25000 job!="x" +grid 100000 10000 1 +series __name__=a,host=h2,job=x,zone=z1 ; +result - ; 0:3ff0000000000000 +end +case absent_over_time 5000 host="h1",job!="x" +grid 100000 10000 10 +series __name__=a,host=h2,job=y ; 4:c086d20000000000 5:7ff0000000000000 6:0 7:40602c0000000000 8:7ff8000000000001 +series __name__=a,host=h2,job=x,zone=z1 ; 7:4084ff0000000000 8:4086af0000000000 +series __name__=a,host=h2,job=x ; 5:c08a490000000000 6:7ff8000000000001 7:c0896e0000000000 9:c082710000000000 +series __name__=a,host=h1,job=x,zone=z1 ; 8:408e860000000000 +series __name__=a,host=h1,job=y ; 1:c07ef40000000000 2:c0862d0000000000 3:c07d940000000000 4:c0848b0000000000 6:c05f580000000000 7:408b0a0000000000 8:4084cd0000000000 +result host=h1 ; 0:3ff0000000000000 5:3ff0000000000000 9:3ff0000000000000 +end +case absent_over_time 5000 zone!="z1" +grid 100000 10000 4 +series __name__=a,host=h1,job=x,zone=z1 ; +series __name__=a,host=h2,job=x,zone=z1 ; +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 +end +case absent_over_time 10000 host="h1",zone!="" +grid 100000 10000 12 +series __name__=a,host=h1,job=x,zone=z1 ; 6:4081980000000000 +series __name__=a,host=h2,job=x ; 8:c088ee0000000000 +series __name__=a,host=h1,job=x ; 4:c06b780000000000 5:c080be0000000000 +series __name__=a,host=h1,job=y ; 1:4043800000000000 2:c068ec0000000000 3:4044200000000000 +series __name__=a,host=h2,job=y ; 10:407e900000000000 +result host=h1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 10:3ff0000000000000 11:3ff0000000000000 +end +case absent_over_time 10000 job="x",zone!="z1" +grid 100000 10000 8 +series __name__=a,host=h2,job=x,zone=z1 ; 0:4047700000000000 1:7ff8000000000001 +series __name__=a,host=h2,job=y ; 6:c06a580000000000 +result job=x ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 +end +case absent_over_time 45000 job!="x" +grid 100000 10000 5 +series __name__=a,host=h1,job=y ; 4:4062340000000000 +series __name__=a,host=h2,job=y ; 4:7ff8000000000001 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 +end +case absent_over_time 25000 host!="h2",zone="" +grid 100000 10000 4 +series __name__=a,host=h2,job=y ; 3:c063f00000000000 +series __name__=a,host=h1,job=y,zone=z1 ; 1:c077860000000000 +series __name__=a,host=h1,job=y ; 0:c088540000000000 1:406c140000000000 2:4052600000000000 +end +case absent_over_time 10000 host="h1",job="x" +grid 100000 10000 5 +series __name__=a,host=h2,job=y,zone=z1 ; 1:c0889f0000000000 2:405fb00000000000 3:c088810000000000 +series __name__=a,host=h2,job=y ; 1:c084a70000000000 +result host=h1,job=x ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 +end +case absent_over_time 10000 host="h2" +grid 100000 10000 6 +series __name__=a,host=h1,job=x,zone=z1 ; 5:40831c0000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 2:c082e40000000000 +series __name__=a,host=h2,job=y ; 0:c083b30000000000 1:c087ad0000000000 +result host=h2 ; 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 +end +case absent_over_time 45000 - +grid 100000 10000 6 +series __name__=a,host=h2,job=y ; 1:7ff8000000000001 2:c081860000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 1:4087300000000000 2:c068780000000000 +series __name__=a,host=h2,job=x ; +series __name__=a,host=h1,job=x ; +result - ; 0:3ff0000000000000 +end +case absent_over_time 10000 zone="" +grid 100000 10000 11 +series __name__=a,host=h2,job=y,zone=z1 ; 2:407d260000000000 3:7ff8000000000001 4:7ff8000000000001 +series __name__=a,host=h2,job=y ; 5:407d8e0000000000 +series __name__=a,host=h2,job=x ; 8:4087c30000000000 9:4079940000000000 10:7e37e43c8800759c +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 +end +case absent_over_time 25000 host="h2",job!="y" +grid 100000 10000 1 +series __name__=a,host=h1,job=y ; 0:c08c650000000000 +result host=h2 ; 0:3ff0000000000000 +end +case absent_over_time 45000 host="h1" +grid 100000 10000 9 +series __name__=a,host=h1,job=y ; 1:c06acc0000000000 2:c07ee60000000000 4:7e37e43c8800759c 5:4089760000000000 6:c08d7c0000000000 7:402b000000000000 8:4063140000000000 +series __name__=a,host=h2,job=y ; 3:0 4:7ff0000000000000 5:c070a20000000000 +series __name__=a,host=h1,job=y,zone=z1 ; 1:c0751e0000000000 2:408b840000000000 5:407f8c0000000000 7:7ff8000000000001 8:c089570000000000 +series __name__=a,host=h2,job=x ; +result host=h1 ; 0:3ff0000000000000 +end +case absent_over_time 5000 zone="" +grid 100000 10000 6 +series __name__=a,host=h2,job=x,zone=z1 ; 3:7ff8000000000001 4:4074960000000000 5:4076400000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 +end +case absent_over_time 5000 job="y" +grid 100000 10000 9 +series __name__=a,host=h2,job=y,zone=z1 ; 1:c06aec0000000000 2:7e37e43c8800759c 3:408e0a0000000000 +series __name__=a,host=h1,job=y ; 2:c088280000000000 4:c07af60000000000 +series __name__=a,host=h1,job=x,zone=z1 ; +result job=y ; 0:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 +end +case absent_over_time 25000 host="h2",job!="x" +grid 100000 10000 5 +series __name__=a,host=h2,job=x ; 3:7ff8000000000001 +series __name__=a,host=h2,job=y ; 2:4042b00000000000 3:7e37e43c8800759c +series __name__=a,host=h2,job=y,zone=z1 ; 3:403ba00000000000 4:4088470000000000 +result host=h2 ; 0:3ff0000000000000 1:3ff0000000000000 +end +case absent_over_time 45000 job!="y",zone="" +grid 100000 10000 6 +series __name__=a,host=h1,job=x,zone=z1 ; 2:c084530000000000 +series __name__=a,host=h2,job=x ; 0:40661c0000000000 1:c050700000000000 2:c074100000000000 +series __name__=a,host=h1,job=x ; 1:7ff8000000000001 +series __name__=a,host=h2,job=y ; 5:c050580000000000 +end +case absent_over_time 5000 - +grid 100000 10000 8 +series __name__=a,host=h2,job=y,zone=z1 ; 3:408cb00000000000 4:408c2a0000000000 5:40661c0000000000 +series __name__=a,host=h1,job=x,zone=z1 ; 4:c08bbb0000000000 5:c086730000000000 6:4089800000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 7:3ff0000000000000 +end +case absent_over_time 25000 job="y" +grid 100000 10000 6 +series __name__=a,host=h2,job=y ; 1:0 3:408ef10000000000 4:c087950000000000 5:c075120000000000 +series __name__=a,host=h1,job=x ; 5:40813d0000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 2:408b070000000000 3:c045400000000000 +result job=y ; 0:3ff0000000000000 +end +case absent_over_time 45000 zone!="" +grid 100000 10000 10 +series __name__=a,host=h2,job=y ; 5:7e37e43c8800759c 6:c084330000000000 7:c073760000000000 +series __name__=a,host=h1,job=x ; 2:c067a80000000000 3:406d240000000000 4:407df60000000000 5:407a100000000000 7:c073960000000000 8:4084090000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 +end +case absent_over_time 25000 host!="h1",zone="" +grid 100000 10000 2 +series __name__=a,host=h2,job=y ; 1:4074da0000000000 +series __name__=a,host=h1,job=y ; 1:7ff8000000000001 +series __name__=a,host=h1,job=x ; 1:7ff8000000000001 +result - ; 0:3ff0000000000000 +end +case absent_over_time 10000 host!="h2" +grid 100000 10000 9 +series __name__=a,host=h2,job=y ; 5:c08ca90000000000 +series __name__=a,host=h2,job=x ; 2:4061c00000000000 +series __name__=a,host=h1,job=x ; +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 +end +case absent_over_time 45000 - +grid 100000 10000 5 +series __name__=a,host=h2,job=x,zone=z1 ; 2:c084e70000000000 +series __name__=a,host=h1,job=y ; 2:4070760000000000 +series __name__=a,host=h1,job=x,zone=z1 ; 1:40862d0000000000 2:408edc0000000000 3:c049000000000000 +series __name__=a,host=h1,job=x ; 4:c06fbc0000000000 +result - ; 0:3ff0000000000000 +end +case absent_over_time 10000 host!="h1",zone!="" +grid 100000 10000 4 +series __name__=a,host=h1,job=y ; 1:c087880000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 +end +case absent_over_time 45000 job="x" +grid 100000 10000 4 +series __name__=a,host=h2,job=x ; 1:c06f800000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 2:c06b2c0000000000 +series __name__=a,host=h1,job=x ; 3:c0782a0000000000 +result job=x ; 0:3ff0000000000000 +end +case absent_over_time 5000 zone!="" +grid 100000 10000 6 +series __name__=a,host=h1,job=y ; 5:c089420000000000 +series __name__=a,host=h1,job=x ; +series __name__=a,host=h2,job=x,zone=z1 ; 0:40707a0000000000 1:4083090000000000 2:c083440000000000 +result - ; 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 +end +case absent_over_time 5000 host!="h1",zone!="z1" +grid 100000 10000 6 +series __name__=a,host=h1,job=x ; 3:4063480000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 +end +case absent_over_time 5000 job!="y",zone!="" +grid 100000 10000 5 +series __name__=a,host=h2,job=y ; +series __name__=a,host=h1,job=y ; 2:408e210000000000 3:c073e00000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 +end +case absent_over_time 10000 host="h1",zone="" +grid 100000 10000 6 +series __name__=a,host=h1,job=x ; 3:7ff8000000000001 4:c065b40000000000 +series __name__=a,host=h2,job=y ; 5:4083ab0000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 0:c08f2f0000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 1:4072700000000000 2:c08e9e0000000000 +result host=h1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 5:3ff0000000000000 +end +case absent_over_time 25000 host!="h2",zone="" +grid 100000 10000 12 +series __name__=a,host=h2,job=y,zone=z1 ; 5:c08f160000000000 6:408bc20000000000 7:c0897f0000000000 +series __name__=a,host=h1,job=y ; 2:c087330000000000 4:7ff0000000000000 5:c080850000000000 7:408b820000000000 8:7e37e43c8800759c 10:c074840000000000 11:4063c80000000000 +series __name__=a,host=h2,job=y ; 9:c0877b0000000000 10:fff0000000000000 11:4057c80000000000 +series __name__=a,host=h1,job=x ; 6:c03ca00000000000 7:c06e700000000000 +series __name__=a,host=h1,job=y,zone=z1 ; 9:40874a0000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 1:407c460000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 +end +case absent_over_time 10000 - +grid 100000 10000 10 +series __name__=a,host=h2,job=x,zone=z1 ; 0:c019000000000000 1:7ff8000000000001 +series __name__=a,host=h1,job=x,zone=z1 ; +series __name__=a,host=h1,job=y ; 0:c082570000000000 1:c087380000000000 2:c069b80000000000 +result - ; 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 +end +case absent_over_time 45000 job="x",zone="z1" +grid 100000 10000 5 +series __name__=a,host=h1,job=x,zone=z1 ; 1:c0854c0000000000 +result job=x,zone=z1 ; 0:3ff0000000000000 +end +case absent_over_time 45000 job="y",zone!="" +grid 100000 10000 12 +series __name__=a,host=h1,job=x ; 6:4067f80000000000 7:0 +series __name__=a,host=h1,job=y ; 7:fff0000000000000 8:c086ba0000000000 10:4079380000000000 11:7ff8000000000001 +series __name__=a,host=h2,job=y,zone=z1 ; 11:4082f50000000000 +series __name__=a,host=h2,job=y ; 11:406f040000000000 +result job=y ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 10:3ff0000000000000 +end +case absent_over_time 10000 job!="x" +grid 100000 10000 7 +series __name__=a,host=h2,job=x,zone=z1 ; 0:40817b0000000000 1:c078100000000000 3:c078320000000000 5:7ff8000000000001 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 +end +case absent_over_time 25000 job="x" +grid 100000 10000 10 +series __name__=a,host=h1,job=x ; 0:4071560000000000 1:c064fc0000000000 2:4080b40000000000 7:c052e00000000000 8:408a5f0000000000 +series __name__=a,host=h2,job=y ; 2:408c5b0000000000 +result job=x ; 5:3ff0000000000000 6:3ff0000000000000 +end +case absent_over_time 10000 - +grid 100000 10000 5 +series __name__=a,host=h2,job=y ; 4:c060e80000000000 +series __name__=a,host=h1,job=y,zone=z1 ; 3:c08aec0000000000 +series __name__=a,host=h1,job=x ; 2:4088e80000000000 3:40876c0000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 +end +case absent_over_time 25000 host!="h2",zone="z1" +grid 100000 10000 8 +series __name__=a,host=h1,job=y ; +series __name__=a,host=h1,job=x ; 6:7ff8000000000001 +series __name__=a,host=h2,job=x ; 3:7e37e43c8800759c 4:406f600000000000 5:c07d7e0000000000 6:c08cd50000000000 +result zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 +end +case absent_over_time 5000 host="h2",job="x",zone="z1" +grid 100000 10000 6 +series __name__=a,host=h1,job=y ; 5:40725c0000000000 +series __name__=a,host=h2,job=y ; 2:c082840000000000 +series __name__=a,host=h2,job=x ; 2:c06eb40000000000 +result host=h2,job=x,zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 +end +case absent_over_time 25000 - +grid 100000 10000 7 +series __name__=a,host=h1,job=x,zone=z1 ; 4:c076a80000000000 5:4088a20000000000 6:40833b0000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 5:40753a0000000000 6:405d100000000000 +series __name__=a,host=h1,job=x ; +series __name__=a,host=h1,job=y ; 2:4083850000000000 3:c0881b0000000000 4:4087110000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 +end +case absent_over_time 45000 - +grid 100000 10000 2 +series __name__=a,host=h1,job=y ; +series __name__=a,host=h1,job=x ; 1:40813e0000000000 +result - ; 0:3ff0000000000000 +end +case absent_over_time 10000 - +grid 100000 10000 6 +series __name__=a,host=h1,job=y ; 5:7ff8000000000001 +series __name__=a,host=h1,job=x ; 0:c0867a0000000000 1:40744e0000000000 2:0 3:7ff8000000000001 4:7ff8000000000001 +series __name__=a,host=h2,job=x ; +end +case absent_over_time 45000 job="y" +grid 100000 10000 3 +series __name__=a,host=h2,job=x ; 1:4084e10000000000 +series __name__=a,host=h2,job=y ; +series __name__=a,host=h1,job=x ; +result job=y ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 +end +case absent_over_time 5000 job="y" +grid 100000 10000 2 +series __name__=a,host=h2,job=y ; 0:7ff8000000000001 1:408e570000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 0:4085530000000000 1:7e37e43c8800759c +end +case absent_over_time 45000 zone="" +grid 100000 10000 11 +series __name__=a,host=h1,job=x ; 9:408e050000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 5:40806c0000000000 6:c079500000000000 7:406ef80000000000 8:c082b20000000000 9:c088410000000000 +series __name__=a,host=h1,job=y,zone=z1 ; 1:7ff8000000000001 2:c08b7a0000000000 3:c068080000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 +end +case absent_over_time 10000 zone="" +grid 100000 10000 10 +series __name__=a,host=h1,job=x,zone=z1 ; 0:c083b60000000000 1:4077be0000000000 2:40854d0000000000 3:4080900000000000 4:408e200000000000 +series __name__=a,host=h1,job=x ; 4:4069740000000000 5:408a390000000000 6:405c080000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 8:4089040000000000 +series __name__=a,host=h2,job=x ; +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 +end +case absent_over_time 5000 job!="x",zone="z1" +grid 100000 10000 11 +series __name__=a,host=h2,job=y ; 0:4081dd0000000000 1:c08bbf0000000000 2:4069d00000000000 +series __name__=a,host=h1,job=y,zone=z1 ; 5:7ff0000000000000 +result zone=z1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 6:3ff0000000000000 7:3ff0000000000000 8:3ff0000000000000 9:3ff0000000000000 10:3ff0000000000000 +end +case absent_over_time 25000 zone="" +grid 100000 10000 6 +series __name__=a,host=h2,job=x,zone=z1 ; 0:fff0000000000000 +series __name__=a,host=h2,job=x ; +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 +end +case absent_over_time 45000 - +grid 100000 10000 6 +series __name__=a,host=h1,job=y,zone=z1 ; 5:4065780000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 +end +case absent_over_time 25000 host!="h2",job!="x" +grid 100000 10000 8 +series __name__=a,host=h2,job=y ; 2:c058680000000000 4:c0689c0000000000 +series __name__=a,host=h2,job=x ; 7:c086690000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 7:c087330000000000 +series __name__=a,host=h1,job=y ; 0:408b130000000000 1:c07ff80000000000 2:408bd20000000000 3:c040100000000000 4:7e37e43c8800759c +result - ; 7:3ff0000000000000 +end +case absent_over_time 5000 - +grid 100000 10000 3 +series __name__=a,host=h2,job=x ; 2:c072160000000000 +series __name__=a,host=h2,job=y,zone=z1 ; 0:c06b880000000000 +series __name__=a,host=h1,job=y ; +series __name__=a,host=h1,job=x,zone=z1 ; 1:c071820000000000 2:0 +end +case absent_over_time 10000 zone!="z1" +grid 100000 10000 4 +series __name__=a,host=h2,job=x ; 2:408ece0000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 3:3ff0000000000000 +end +case absent_over_time 10000 - +grid 100000 10000 6 +series __name__=a,host=h1,job=x ; +series __name__=a,host=h2,job=y ; +series __name__=a,host=h1,job=y ; 5:fff0000000000000 +result - ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 +end +case absent_over_time 45000 job="y",zone!="z1" +grid 100000 10000 7 +series __name__=a,host=h2,job=y ; 6:c087ff0000000000 +series __name__=a,host=h2,job=x ; 4:403fa00000000000 5:c08c740000000000 +series __name__=a,host=h1,job=x ; 1:c08b9a0000000000 2:4086000000000000 3:407d680000000000 4:c0881e0000000000 +series __name__=a,host=h2,job=x,zone=z1 ; 2:408b6e0000000000 +result job=y ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 +end +case absent_over_time 25000 host="h1",job!="x" +grid 100000 10000 7 +series __name__=a,host=h1,job=x ; 4:c0607c0000000000 +result host=h1 ; 0:3ff0000000000000 1:3ff0000000000000 2:3ff0000000000000 3:3ff0000000000000 4:3ff0000000000000 5:3ff0000000000000 6:3ff0000000000000 +end diff --git a/src/promql/src/range_eval/tests.rs b/src/promql/src/range_eval/tests.rs index 2f571337a04..49c2ac6b92e 100644 --- a/src/promql/src/range_eval/tests.rs +++ b/src/promql/src/range_eval/tests.rs @@ -44,6 +44,7 @@ use crate::grid_series::reference::{ Dense, assert_series_eq, assert_series_eq_any_nan, random_dense, special_value, }; use crate::range_array::RangeArray; +use crate::select::{LabelMatcher, MatchOp, absent, absent_labels}; /// One raw row: source timestamp and a value per field, `None` when missing. type Row = (i64, Vec>); @@ -1207,3 +1208,103 @@ fn anchored_window_before_the_series_retains_nothing() { assert!(evaluator.fields[0].timestamps.len() <= 100); } } + +/// `absent_over_time(v[r])` is `absent` over the series of `present_over_time(v[r])`, with the +/// labels derived from the selector's matchers. Checked against 120 cases from the Prometheus +/// v3.15.0 engine (`absent_over_time_cases.txt`, promql-compat `cmd/narthex-golden-vector +/// -absent-over-time`); samples sit on grid points. +#[test] +fn absent_over_time_is_absent_over_present_over_time() { + let text = include_str!("absent_over_time_cases.txt"); + let mut checked = 0; + for case in text.split("end\n").filter(|case| case.contains("case ")) { + let lines: Vec<&str> = case.lines().filter(|line| !line.starts_with('#')).collect(); + let spec: Vec<&str> = lines[0].split_whitespace().collect(); + let range_ms: i64 = spec[2].parse().unwrap(); + let matchers: Vec = spec[3] + .split(',') + .filter(|matcher| *matcher != "-") + .map(|matcher| { + let (name, op, value) = match matcher.split_once("!=") { + Some((name, value)) => (name, MatchOp::NotEqual, value), + None => { + let (name, value) = matcher.split_once('=').unwrap(); + (name, MatchOp::Equal, value) + } + }; + let value = value.trim_matches('"'); + LabelMatcher { + name: Arc::from(name), + op, + value: Arc::from(value), + matches_empty: (op == MatchOp::Equal) == value.is_empty(), + } + }) + .collect(); + let grid_spec: Vec = lines[1] + .split_whitespace() + .skip(1) + .map(|field| field.parse().unwrap()) + .collect(); + let grid = grid(grid_spec[0], grid_spec[1], grid_spec[2] as u64); + let window = RangeWindow { + range_ms, + offset_ms: 0, + anchor_ms: None, + }; + let mut present = Vec::new(); + let mut expected = None; + for (host, line) in lines[2..].iter().enumerate() { + let (kind, rest) = line.split_once(' ').unwrap(); + let (labels, points) = rest.split_once(" ;").unwrap(); + let points: Vec<(i64, f64)> = points + .split_whitespace() + .map(|point| { + let (index, bits) = point.split_once(':').unwrap(); + let ts = grid_spec[0] + index.parse::().unwrap() * grid_spec[1]; + (ts, f64::from_bits(u64::from_str_radix(bits, 16).unwrap())) + }) + .collect(); + if kind == "result" { + let mut dense = vec![vec![None]; grid_spec[2] as usize]; + for (ts, value) in points { + dense[((ts - grid_spec[0]) / grid_spec[1]) as usize][0] = Some(value); + } + expected = Some(dense); + continue; + } + let selected = matchers.iter().all(|matcher| { + let value = labels + .split(',') + .find_map(|pair| pair.strip_prefix(&format!("{}=", matcher.name))) + .unwrap_or(""); + (value == &*matcher.value) == (matcher.op == MatchOp::Equal) + }); + if !selected || points.is_empty() { + continue; + } + let rows: Vec = points + .into_iter() + .map(|(ts, value)| (ts, vec![Some(value)])) + .collect(); + let mut evaluator = RangeEvaluator::try_new( + &raw_schema(1), + grid.clone(), + window, + RangeFunction::PresentOverTime, + ) + .unwrap(); + present.extend(evaluator.push(&chunk(&rows, 1, host as u64, true)).unwrap()); + } + let schema = SeriesSchema { + fields: raw_schema(1).fields, + eval_grid: Some(grid.clone()), + }; + let labels = absent_labels(&matchers).unwrap(); + let actual = absent(&schema, &present, labels.clone()).unwrap(); + let expected = expected.unwrap_or_else(|| vec![vec![None]; grid_spec[2] as usize]); + assert_series_eq(actual.as_ref(), &expected, &labels); + checked += 1; + } + assert_eq!(checked, 120); +} diff --git a/src/promql/src/select.rs b/src/promql/src/select.rs index 3b47c9619f8..6a7e944a096 100644 --- a/src/promql/src/select.rs +++ b/src/promql/src/select.rs @@ -17,7 +17,7 @@ //! //! Semantics follow Prometheus (`aggregationK`, `funcScalar`, `funcAbsent`, //! `createLabelsForAbsentFunction`, `funcSort*`). A scalar is a grid series without labels that -//! has a value at every point. +//! has a value at every point, so `vector(s)` is `s` itself and has no kernel. use std::cmp::Ordering; use std::collections::HashMap; @@ -163,6 +163,9 @@ pub fn scalar(schema: &SeriesSchema, series: &[Series]) -> Result { } /// `absent(v)`: 1 with `labels` at every point where no series is present. +/// +/// `absent_over_time(v[r])` is this over the result of `present_over_time(v[r])`, with `labels` +/// from the matchers of `v`, as Prometheus derives them for both. pub fn absent( schema: &SeriesSchema, series: &[Series],