From 39d556f0d541f445c3942e64b8016ae8ae331695 Mon Sep 17 00:00:00 2001 From: Brian Brazil Date: Fri, 18 Mar 2016 12:02:24 +0000 Subject: [PATCH 1/3] Move all the operator tests into one file --- promql/testdata/comparison.test | 47 ---------- promql/testdata/legacy.test | 160 -------------------------------- promql/testdata/operators.test | 151 ++++++++++++++++++++++++++++++ 3 files changed, 151 insertions(+), 207 deletions(-) delete mode 100644 promql/testdata/comparison.test create mode 100644 promql/testdata/operators.test diff --git a/promql/testdata/comparison.test b/promql/testdata/comparison.test deleted file mode 100644 index 012d5891ab..0000000000 --- a/promql/testdata/comparison.test +++ /dev/null @@ -1,47 +0,0 @@ -load 5m - http_requests{job="api-server", instance="0", group="production"} 0+10x10 - http_requests{job="api-server", instance="1", group="production"} 0+20x10 - http_requests{job="api-server", instance="0", group="canary"} 0+30x10 - http_requests{job="api-server", instance="1", group="canary"} 0+40x10 - http_requests{job="app-server", instance="0", group="production"} 0+50x10 - http_requests{job="app-server", instance="1", group="production"} 0+60x10 - http_requests{job="app-server", instance="0", group="canary"} 0+70x10 - http_requests{job="app-server", instance="1", group="canary"} 0+80x10 - -eval instant at 50m SUM(http_requests) BY (job) > 1000 - {job="app-server"} 2600 - - -eval instant at 50m 1000 < SUM(http_requests) BY (job) - {job="app-server"} 1000 - - -eval instant at 50m SUM(http_requests) BY (job) <= 1000 - {job="api-server"} 1000 - - -eval instant at 50m SUM(http_requests) BY (job) != 1000 - {job="app-server"} 2600 - - -eval instant at 50m SUM(http_requests) BY (job) == 1000 - {job="api-server"} 1000 - -eval instant at 50m SUM(http_requests) BY (job) == bool 1000 - {job="api-server"} 1 - {job="app-server"} 0 - -eval instant at 50m SUM(http_requests) BY (job) == bool SUM(http_requests) BY (job) - {job="api-server"} 1 - {job="app-server"} 1 - -eval instant at 50m SUM(http_requests) BY (job) != bool SUM(http_requests) BY (job) - {job="api-server"} 0 - {job="app-server"} 0 - - -eval instant at 50m 0 == bool 1 - 0 - -eval instant at 50m 1 == bool 1 - 1 diff --git a/promql/testdata/legacy.test b/promql/testdata/legacy.test index c4c8111075..3b8088b677 100644 --- a/promql/testdata/legacy.test +++ b/promql/testdata/legacy.test @@ -86,62 +86,6 @@ eval instant at 50m MAX(http_requests) BY (job) {job="app-server"} 800 -eval instant at 50m SUM(http_requests) BY (job) - COUNT(http_requests) BY (job) - {job="api-server"} 996 - {job="app-server"} 2596 - - -eval instant at 50m 2 - SUM(http_requests) BY (job) - {job="api-server"} -998 - {job="app-server"} -2598 - - -eval instant at 50m 1000 / SUM(http_requests) BY (job) - {job="api-server"} 1 - {job="app-server"} 0.38461538461538464 - - -eval instant at 50m SUM(http_requests) BY (job) - 2 - {job="api-server"} 998 - {job="app-server"} 2598 - - -eval instant at 50m SUM(http_requests) BY (job) % 3 - {job="api-server"} 1 - {job="app-server"} 2 - - -eval instant at 50m SUM(http_requests) BY (job) / 0 - {job="api-server"} +Inf - {job="app-server"} +Inf - - -eval instant at 50m SUM(http_requests) BY (job) + SUM(http_requests) BY (job) - {job="api-server"} 2000 - {job="app-server"} 5200 - - -eval instant at 50m http_requests{job="api-server", group="canary"} - http_requests{group="canary", instance="0", job="api-server"} 300 - http_requests{group="canary", instance="1", job="api-server"} 400 - - -eval instant at 50m http_requests{job="api-server", group="canary"} + rate(http_requests{job="api-server"}[5m]) * 5 * 60 - {group="canary", instance="0", job="api-server"} 330 - {group="canary", instance="1", job="api-server"} 440 - - -eval instant at 50m rate(http_requests[25m]) * 25 * 60 - {group="canary", instance="0", job="api-server"} 150 - {group="canary", instance="0", job="app-server"} 350 - {group="canary", instance="1", job="api-server"} 200 - {group="canary", instance="1", job="app-server"} 400 - {group="production", instance="0", job="api-server"} 50 - {group="production", instance="0", job="app-server"} 249.99999999999997 - {group="production", instance="1", job="api-server"} 100 - {group="production", instance="1", job="app-server"} 300 - - # Single-letter label names and values. eval instant at 50m x{y="testvalue"} x{y="testvalue"} 100 @@ -337,110 +281,6 @@ eval instant at 50m {job=~".+-server", job!~"api-.+"} http_requests{group="production", instance="0", job="app-server"} 500 http_requests{group="production", instance="1", job="app-server"} 600 -eval instant at 50m http_requests{group="canary"} and http_requests{instance="0"} - http_requests{group="canary", instance="0", job="api-server"} 300 - http_requests{group="canary", instance="0", job="app-server"} 700 - -eval instant at 50m (http_requests{group="canary"} + 1) and http_requests{instance="0"} - {group="canary", instance="0", job="api-server"} 301 - {group="canary", instance="0", job="app-server"} 701 - -eval instant at 50m (http_requests{group="canary"} + 1) and on(instance, job) http_requests{instance="0", group="production"} - {group="canary", instance="0", job="api-server"} 301 - {group="canary", instance="0", job="app-server"} 701 - -eval instant at 50m (http_requests{group="canary"} + 1) and on(instance) http_requests{instance="0", group="production"} - {group="canary", instance="0", job="api-server"} 301 - {group="canary", instance="0", job="app-server"} 701 - -eval instant at 50m http_requests{group="canary"} or http_requests{group="production"} - http_requests{group="canary", instance="0", job="api-server"} 300 - http_requests{group="canary", instance="0", job="app-server"} 700 - http_requests{group="canary", instance="1", job="api-server"} 400 - http_requests{group="canary", instance="1", job="app-server"} 800 - http_requests{group="production", instance="0", job="api-server"} 100 - http_requests{group="production", instance="0", job="app-server"} 500 - http_requests{group="production", instance="1", job="api-server"} 200 - http_requests{group="production", instance="1", job="app-server"} 600 - -# On overlap the rhs samples must be dropped. -eval instant at 50m (http_requests{group="canary"} + 1) or http_requests{instance="1"} - {group="canary", instance="0", job="api-server"} 301 - {group="canary", instance="0", job="app-server"} 701 - {group="canary", instance="1", job="api-server"} 401 - {group="canary", instance="1", job="app-server"} 801 - http_requests{group="production", instance="1", job="api-server"} 200 - http_requests{group="production", instance="1", job="app-server"} 600 - -# Matching only on instance excludes everything that has instance=0/1 but includes -# entries without the instance label. -eval instant at 50m (http_requests{group="canary"} + 1) or on(instance) (http_requests or cpu_count or vector_matching_a) - {group="canary", instance="0", job="api-server"} 301 - {group="canary", instance="0", job="app-server"} 701 - {group="canary", instance="1", job="api-server"} 401 - {group="canary", instance="1", job="app-server"} 801 - vector_matching_a{l="x"} 10 - vector_matching_a{l="y"} 20 - -eval instant at 50m http_requests{group="canary"} / on(instance,job) http_requests{group="production"} - {instance="0", job="api-server"} 3 - {instance="0", job="app-server"} 1.4 - {instance="1", job="api-server"} 2 - {instance="1", job="app-server"} 1.3333333333333333 - -# Include labels must guarantee uniquely identifiable time series. -eval_fail instant at 50m http_requests{group="production"} / on(instance) group_left(group) cpu_count{type="smp"} - -# Many-to-many matching is not allowed. -eval_fail instant at 50m http_requests{group="production"} / on(instance) group_left(job,type) cpu_count - -# Many-to-one matching must be explicit. -eval_fail instant at 50m http_requests{group="production"} / on(instance) cpu_count{type="smp"} - -eval instant at 50m http_requests{group="production"} / on(instance) group_left(job) cpu_count{type="smp"} - {instance="1", job="api-server"} 1 - {instance="0", job="app-server"} 5 - {instance="1", job="app-server"} 3 - {instance="0", job="api-server"} 1 - -# Ensure sidedness of grouping preserves operand sides. -eval instant at 50m cpu_count{type="smp"} / on(instance) group_right(job) http_requests{group="production"} - {instance="1", job="app-server"} 0.3333333333333333 - {instance="0", job="app-server"} 0.2 - {instance="1", job="api-server"} 1 - {instance="0", job="api-server"} 1 - -# Include labels from both sides. -eval instant at 50m http_requests{group="production"} / on(instance) group_left(job) cpu_count{type="smp"} - {instance="1", job="api-server"} 1 - {instance="0", job="app-server"} 5 - {instance="1", job="app-server"} 3 - {instance="0", job="api-server"} 1 - -eval instant at 50m http_requests{group="production"} < on(instance,job) http_requests{group="canary"} - {instance="1", job="app-server"} 600 - {instance="0", job="app-server"} 500 - {instance="1", job="api-server"} 200 - {instance="0", job="api-server"} 100 - - -eval instant at 50m http_requests{group="production"} > on(instance,job) http_requests{group="canary"} - # no output - -eval instant at 50m http_requests{group="production"} == on(instance,job) http_requests{group="canary"} - # no output - -eval instant at 50m http_requests > on(instance) group_left(group,job) cpu_count{type="smp"} - {group="canary", instance="0", job="app-server"} 700 - {group="canary", instance="1", job="app-server"} 800 - {group="canary", instance="0", job="api-server"} 300 - {group="canary", instance="1", job="api-server"} 400 - {group="production", instance="0", job="app-server"} 500 - {group="production", instance="1", job="app-server"} 600 - -eval instant at 50m {l="x"} + on(__name__) {l="y"} - vector_matching_a 30 - eval instant at 50m absent(nonexistent) {} 1 diff --git a/promql/testdata/operators.test b/promql/testdata/operators.test new file mode 100644 index 0000000000..82806fc482 --- /dev/null +++ b/promql/testdata/operators.test @@ -0,0 +1,151 @@ +load 5m + http_requests{job="api-server", instance="0", group="production"} 0+10x10 + http_requests{job="api-server", instance="1", group="production"} 0+20x10 + http_requests{job="api-server", instance="0", group="canary"} 0+30x10 + http_requests{job="api-server", instance="1", group="canary"} 0+40x10 + http_requests{job="app-server", instance="0", group="production"} 0+50x10 + http_requests{job="app-server", instance="1", group="production"} 0+60x10 + http_requests{job="app-server", instance="0", group="canary"} 0+70x10 + http_requests{job="app-server", instance="1", group="canary"} 0+80x10 + + +load 5m + vector_matching_a{l="x"} 0+1x100 + vector_matching_a{l="y"} 0+2x50 + vector_matching_b{l="x"} 0+4x25 + + +eval instant at 50m SUM(http_requests) BY (job) - COUNT(http_requests) BY (job) + {job="api-server"} 996 + {job="app-server"} 2596 + +eval instant at 50m 2 - SUM(http_requests) BY (job) + {job="api-server"} -998 + {job="app-server"} -2598 + +eval instant at 50m 1000 / SUM(http_requests) BY (job) + {job="api-server"} 1 + {job="app-server"} 0.38461538461538464 + +eval instant at 50m SUM(http_requests) BY (job) - 2 + {job="api-server"} 998 + {job="app-server"} 2598 + +eval instant at 50m SUM(http_requests) BY (job) % 3 + {job="api-server"} 1 + {job="app-server"} 2 + +eval instant at 50m SUM(http_requests) BY (job) / 0 + {job="api-server"} +Inf + {job="app-server"} +Inf + +eval instant at 50m SUM(http_requests) BY (job) + SUM(http_requests) BY (job) + {job="api-server"} 2000 + {job="app-server"} 5200 + + +eval instant at 50m http_requests{job="api-server", group="canary"} + http_requests{group="canary", instance="0", job="api-server"} 300 + http_requests{group="canary", instance="1", job="api-server"} 400 + +eval instant at 50m http_requests{job="api-server", group="canary"} + rate(http_requests{job="api-server"}[5m]) * 5 * 60 + {group="canary", instance="0", job="api-server"} 330 + {group="canary", instance="1", job="api-server"} 440 + +eval instant at 50m rate(http_requests[25m]) * 25 * 60 + {group="canary", instance="0", job="api-server"} 150 + {group="canary", instance="0", job="app-server"} 350 + {group="canary", instance="1", job="api-server"} 200 + {group="canary", instance="1", job="app-server"} 400 + {group="production", instance="0", job="api-server"} 50 + {group="production", instance="0", job="app-server"} 249.99999999999997 + {group="production", instance="1", job="api-server"} 100 + {group="production", instance="1", job="app-server"} 300 + + +eval instant at 50m http_requests{group="canary"} and http_requests{instance="0"} + http_requests{group="canary", instance="0", job="api-server"} 300 + http_requests{group="canary", instance="0", job="app-server"} 700 + +eval instant at 50m (http_requests{group="canary"} + 1) and http_requests{instance="0"} + {group="canary", instance="0", job="api-server"} 301 + {group="canary", instance="0", job="app-server"} 701 + +eval instant at 50m (http_requests{group="canary"} + 1) and on(instance, job) http_requests{instance="0", group="production"} + {group="canary", instance="0", job="api-server"} 301 + {group="canary", instance="0", job="app-server"} 701 + +eval instant at 50m (http_requests{group="canary"} + 1) and on(instance) http_requests{instance="0", group="production"} + {group="canary", instance="0", job="api-server"} 301 + {group="canary", instance="0", job="app-server"} 701 + +eval instant at 50m http_requests{group="canary"} or http_requests{group="production"} + http_requests{group="canary", instance="0", job="api-server"} 300 + http_requests{group="canary", instance="0", job="app-server"} 700 + http_requests{group="canary", instance="1", job="api-server"} 400 + http_requests{group="canary", instance="1", job="app-server"} 800 + http_requests{group="production", instance="0", job="api-server"} 100 + http_requests{group="production", instance="0", job="app-server"} 500 + http_requests{group="production", instance="1", job="api-server"} 200 + http_requests{group="production", instance="1", job="app-server"} 600 + +# On overlap the rhs samples must be dropped. +eval instant at 50m (http_requests{group="canary"} + 1) or http_requests{instance="1"} + {group="canary", instance="0", job="api-server"} 301 + {group="canary", instance="0", job="app-server"} 701 + {group="canary", instance="1", job="api-server"} 401 + {group="canary", instance="1", job="app-server"} 801 + http_requests{group="production", instance="1", job="api-server"} 200 + http_requests{group="production", instance="1", job="app-server"} 600 + + +# Matching only on instance excludes everything that has instance=0/1 but includes +# entries without the instance label. +eval instant at 50m (http_requests{group="canary"} + 1) or on(instance) (http_requests or cpu_count or vector_matching_a) + {group="canary", instance="0", job="api-server"} 301 + {group="canary", instance="0", job="app-server"} 701 + {group="canary", instance="1", job="api-server"} 401 + {group="canary", instance="1", job="app-server"} 801 + vector_matching_a{l="x"} 10 + vector_matching_a{l="y"} 20 + +eval instant at 50m http_requests{group="canary"} / on(instance,job) http_requests{group="production"} + {instance="0", job="api-server"} 3 + {instance="0", job="app-server"} 1.4 + {instance="1", job="api-server"} 2 + {instance="1", job="app-server"} 1.3333333333333333 + + +# Comparisons. +eval instant at 50m SUM(http_requests) BY (job) > 1000 + {job="app-server"} 2600 + +eval instant at 50m 1000 < SUM(http_requests) BY (job) + {job="app-server"} 1000 + +eval instant at 50m SUM(http_requests) BY (job) <= 1000 + {job="api-server"} 1000 + +eval instant at 50m SUM(http_requests) BY (job) != 1000 + {job="app-server"} 2600 + +eval instant at 50m SUM(http_requests) BY (job) == 1000 + {job="api-server"} 1000 + +eval instant at 50m SUM(http_requests) BY (job) == bool 1000 + {job="api-server"} 1 + {job="app-server"} 0 + +eval instant at 50m SUM(http_requests) BY (job) == bool SUM(http_requests) BY (job) + {job="api-server"} 1 + {job="app-server"} 1 + +eval instant at 50m SUM(http_requests) BY (job) != bool SUM(http_requests) BY (job) + {job="api-server"} 0 + {job="app-server"} 0 + +eval instant at 50m 0 == bool 1 + 0 + +eval instant at 50m 1 == bool 1 + 1 From 8788701ce7e8103ffb4633a229713d4d68b30d30 Mon Sep 17 00:00:00 2001 From: Brian Brazil Date: Fri, 18 Mar 2016 12:07:40 +0000 Subject: [PATCH 2/3] Add test for incorrect behaviour --- promql/testdata/operators.test | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/promql/testdata/operators.test b/promql/testdata/operators.test index 82806fc482..ccb019c597 100644 --- a/promql/testdata/operators.test +++ b/promql/testdata/operators.test @@ -115,6 +115,17 @@ eval instant at 50m http_requests{group="canary"} / on(instance,job) http_reques {instance="1", job="api-server"} 2 {instance="1", job="app-server"} 1.3333333333333333 +# https://github.com/prometheus/prometheus/issues/1489 +eval instant at 50m http_requests AND ON (dummy) vector(1) + http_requests{group="canary", instance="0", job="api-server"} 300 + http_requests{group="canary", instance="0", job="app-server"} 700 + http_requests{group="canary", instance="1", job="api-server"} 400 + http_requests{group="canary", instance="1", job="app-server"} 800 + http_requests{group="production", instance="0", job="api-server"} 100 + http_requests{group="production", instance="0", job="app-server"} 500 + http_requests{group="production", instance="1", job="api-server"} 200 + http_requests{group="production", instance="1", job="app-server"} 600 + # Comparisons. eval instant at 50m SUM(http_requests) BY (job) > 1000 From da5311a35f630748a984fcd84e0b5e619b7c822f Mon Sep 17 00:00:00 2001 From: Brian Brazil Date: Thu, 24 Mar 2016 12:46:53 +0000 Subject: [PATCH 3/3] Update common dependency to pick up label fix for #1489 --- vendor/github.com/prometheus/common/model/signature.go | 2 +- vendor/vendor.json | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/vendor/github.com/prometheus/common/model/signature.go b/vendor/github.com/prometheus/common/model/signature.go index cf14e82c5c..8762b13c63 100644 --- a/vendor/github.com/prometheus/common/model/signature.go +++ b/vendor/github.com/prometheus/common/model/signature.go @@ -98,7 +98,7 @@ func labelSetToFastFingerprint(ls LabelSet) Fingerprint { // specified LabelNames into the signature calculation. The labels passed in // will be sorted by this function. func SignatureForLabels(m Metric, labels ...LabelName) uint64 { - if len(m) == 0 || len(labels) == 0 { + if len(labels) == 0 { return emptyLabelSignature } diff --git a/vendor/vendor.json b/vendor/vendor.json index 8cfe495432..e621008795 100644 --- a/vendor/vendor.json +++ b/vendor/vendor.json @@ -174,8 +174,8 @@ }, { "path": "github.com/prometheus/common/model", - "revision": "0e53cc19aa67dd2e8587a26e28643cb152f5403d", - "revisionTime": "2016-01-29T15:16:16+01:00" + "revision": "167b27da48d058a9b46d84b834d67f68f0243f67", + "revisionTime": "2016-03-18T12:23:18Z" }, { "path": "github.com/prometheus/common/route",