|
|
|
# Testdata for resets() and changes().
|
|
|
|
load 5m
|
|
|
|
http_requests{path="/foo"} 1 2 3 0 1 0 0 1 2 0
|
|
|
|
http_requests{path="/bar"} 1 2 3 4 5 1 2 3 4 5
|
|
|
|
http_requests{path="/biz"} 0 0 0 0 0 1 1 1 1 1
|
|
|
|
|
|
|
|
# Tests for resets().
|
|
|
|
eval instant at 50m resets(http_requests[5m])
|
|
|
|
{path="/foo"} 0
|
|
|
|
{path="/bar"} 0
|
|
|
|
{path="/biz"} 0
|
|
|
|
|
|
|
|
eval instant at 50m resets(http_requests[20m])
|
|
|
|
{path="/foo"} 1
|
|
|
|
{path="/bar"} 0
|
|
|
|
{path="/biz"} 0
|
|
|
|
|
|
|
|
eval instant at 50m resets(http_requests[30m])
|
|
|
|
{path="/foo"} 2
|
|
|
|
{path="/bar"} 1
|
|
|
|
{path="/biz"} 0
|
|
|
|
|
|
|
|
eval instant at 50m resets(http_requests[50m])
|
|
|
|
{path="/foo"} 3
|
|
|
|
{path="/bar"} 1
|
|
|
|
{path="/biz"} 0
|
|
|
|
|
|
|
|
eval instant at 50m resets(nonexistent_metric[50m])
|
|
|
|
|
|
|
|
# Tests for changes().
|
|
|
|
eval instant at 50m changes(http_requests[5m])
|
|
|
|
{path="/foo"} 0
|
|
|
|
{path="/bar"} 0
|
|
|
|
{path="/biz"} 0
|
|
|
|
|
|
|
|
eval instant at 50m changes(http_requests[20m])
|
|
|
|
{path="/foo"} 3
|
|
|
|
{path="/bar"} 3
|
|
|
|
{path="/biz"} 0
|
|
|
|
|
|
|
|
eval instant at 50m changes(http_requests[30m])
|
|
|
|
{path="/foo"} 4
|
|
|
|
{path="/bar"} 5
|
|
|
|
{path="/biz"} 1
|
|
|
|
|
|
|
|
eval instant at 50m changes(http_requests[50m])
|
|
|
|
{path="/foo"} 8
|
|
|
|
{path="/bar"} 9
|
|
|
|
{path="/biz"} 1
|
|
|
|
|
|
|
|
eval instant at 50m changes(nonexistent_metric[50m])
|
|
|
|
|
|
|
|
|
|
|
|
clear
|
|
|
|
|
|
|
|
# Tests for increase().
|
|
|
|
load 5m
|
|
|
|
http_requests{path="/foo"} 0+10x10
|
|
|
|
http_requests{path="/bar"} 0+10x5 0+10x5
|
|
|
|
|
|
|
|
# Tests for increase().
|
|
|
|
eval instant at 50m increase(http_requests[50m])
|
|
|
|
{path="/foo"} 100
|
|
|
|
{path="/bar"} 90
|
|
|
|
|
|
|
|
clear
|
|
|
|
|
|
|
|
# Tests for irate().
|
|
|
|
load 5m
|
|
|
|
http_requests{path="/foo"} 0+10x10
|
|
|
|
http_requests{path="/bar"} 0+10x5 0+10x5
|
|
|
|
|
|
|
|
eval instant at 50m irate(http_requests[50m])
|
|
|
|
{path="/foo"} .03333333333333333333
|
|
|
|
{path="/bar"} .03333333333333333333
|
|
|
|
|
|
|
|
# Counter reset.
|
|
|
|
eval instant at 30m irate(http_requests[50m])
|
|
|
|
{path="/foo"} .03333333333333333333
|
|
|
|
{path="/bar"} 0
|
|
|
|
|
|
|
|
clear
|
|
|
|
|
|
|
|
# Tests for deriv() and predict_linear().
|
|
|
|
load 5m
|
|
|
|
testcounter_reset_middle 0+10x4 0+10x5
|
|
|
|
http_requests{job="app-server", instance="1", group="canary"} 0+80x10
|
|
|
|
|
|
|
|
# deriv should return the same as rate in simple cases.
|
|
|
|
eval instant at 50m rate(http_requests{group="canary", instance="1", job="app-server"}[60m])
|
|
|
|
{group="canary", instance="1", job="app-server"} 0.26666666666666666
|
|
|
|
|
|
|
|
eval instant at 50m deriv(http_requests{group="canary", instance="1", job="app-server"}[60m])
|
|
|
|
{group="canary", instance="1", job="app-server"} 0.26666666666666666
|
|
|
|
|
|
|
|
# deriv should return correct result.
|
|
|
|
eval instant at 50m deriv(testcounter_reset_middle[100m])
|
|
|
|
{} 0.010606060606060607
|
|
|
|
|
|
|
|
# predict_linear should return correct result.
|
|
|
|
eval instant at 50m predict_linear(testcounter_reset_middle[100m], 3600)
|
|
|
|
{} 88.181818181818185200
|
|
|
|
|
|
|
|
# predict_linear is syntactic sugar around deriv.
|
|
|
|
eval instant at 50m predict_linear(http_requests[50m], 3600) - (http_requests + deriv(http_requests[50m]) * 3600)
|
|
|
|
{group="canary", instance="1", job="app-server"} 0
|
|
|
|
|
|
|
|
eval instant at 50m predict_linear(testcounter_reset_middle[100m], 3600) - (testcounter_reset_middle + deriv(testcounter_reset_middle[100m]) * 3600)
|
|
|
|
{} 0
|
|
|
|
|
|
|
|
clear
|
|
|
|
|
|
|
|
# Tests for label_replace.
|
|
|
|
load 5m
|
|
|
|
testmetric{src="source-value-10",dst="original-destination-value"} 0
|
|
|
|
testmetric{src="source-value-20",dst="original-destination-value"} 1
|
|
|
|
|
|
|
|
# label_replace does a full-string match and replace.
|
|
|
|
eval instant at 0m label_replace(testmetric, "dst", "destination-value-$1", "src", "source-value-(.*)")
|
|
|
|
testmetric{src="source-value-10",dst="destination-value-10"} 0
|
|
|
|
testmetric{src="source-value-20",dst="destination-value-20"} 1
|
|
|
|
|
|
|
|
# label_replace does not do a sub-string match.
|
|
|
|
eval instant at 0m label_replace(testmetric, "dst", "destination-value-$1", "src", "value-(.*)")
|
|
|
|
testmetric{src="source-value-10",dst="original-destination-value"} 0
|
|
|
|
testmetric{src="source-value-20",dst="original-destination-value"} 1
|
|
|
|
|
|
|
|
# label_replace works with multiple capture groups.
|
|
|
|
eval instant at 0m label_replace(testmetric, "dst", "$1-value-$2", "src", "(.*)-value-(.*)")
|
|
|
|
testmetric{src="source-value-10",dst="source-value-10"} 0
|
|
|
|
testmetric{src="source-value-20",dst="source-value-20"} 1
|
|
|
|
|
|
|
|
# label_replace does not overwrite the destination label if the source label
|
|
|
|
# does not exist.
|
|
|
|
eval instant at 0m label_replace(testmetric, "dst", "value-$1", "nonexistent-src", "source-value-(.*)")
|
|
|
|
testmetric{src="source-value-10",dst="original-destination-value"} 0
|
|
|
|
testmetric{src="source-value-20",dst="original-destination-value"} 1
|
|
|
|
|
|
|
|
# label_replace overwrites the destination label if the source label is empty,
|
|
|
|
# but matched.
|
|
|
|
eval instant at 0m label_replace(testmetric, "dst", "value-$1", "nonexistent-src", "(.*)")
|
|
|
|
testmetric{src="source-value-10",dst="value-"} 0
|
|
|
|
testmetric{src="source-value-20",dst="value-"} 1
|
|
|
|
|
|
|
|
# label_replace does not overwrite the destination label if the source label
|
|
|
|
# is not matched.
|
|
|
|
eval instant at 0m label_replace(testmetric, "dst", "value-$1", "src", "non-matching-regex")
|
|
|
|
testmetric{src="source-value-10",dst="original-destination-value"} 0
|
|
|
|
testmetric{src="source-value-20",dst="original-destination-value"} 1
|
|
|
|
|
|
|
|
# label_replace drops labels that are set to empty values.
|
|
|
|
eval instant at 0m label_replace(testmetric, "dst", "", "dst", ".*")
|
|
|
|
testmetric{src="source-value-10"} 0
|
|
|
|
testmetric{src="source-value-20"} 1
|
|
|
|
|
|
|
|
# label_replace fails when the regex is invalid.
|
|
|
|
eval_fail instant at 0m label_replace(testmetric, "dst", "value-$1", "src", "(.*")
|
|
|
|
|
|
|
|
# label_replace fails when the destination label name is not a valid Prometheus label name.
|
|
|
|
eval_fail instant at 0m label_replace(testmetric, "invalid-label-name", "", "src", "(.*)")
|
|
|
|
|
|
|
|
# label_replace fails when there would be duplicated identical output label sets.
|
|
|
|
eval_fail instant at 0m label_replace(testmetric, "src", "", "", "")
|
|
|
|
|
|
|
|
clear
|
|
|
|
|
|
|
|
# Tests for vector.
|
|
|
|
eval instant at 0m vector(1)
|
|
|
|
{} 1
|
|
|
|
|
|
|
|
eval instant at 60m vector(time())
|
|
|
|
{} 3600
|
|
|
|
|
|
|
|
clear
|
|
|
|
|
|
|
|
# Tests for clamp_max and clamp_min().
|
|
|
|
load 5m
|
|
|
|
test_clamp{src="clamp-a"} -50
|
|
|
|
test_clamp{src="clamp-b"} 0
|
|
|
|
test_clamp{src="clamp-c"} 100
|
|
|
|
|
|
|
|
eval instant at 0m clamp_max(test_clamp, 75)
|
|
|
|
{src="clamp-a"} -50
|
|
|
|
{src="clamp-b"} 0
|
|
|
|
{src="clamp-c"} 75
|
|
|
|
|
|
|
|
eval instant at 0m clamp_min(test_clamp, -25)
|
|
|
|
{src="clamp-a"} -25
|
|
|
|
{src="clamp-b"} 0
|
|
|
|
{src="clamp-c"} 100
|
|
|
|
|
|
|
|
eval instant at 0m clamp_max(clamp_min(test_clamp, -20), 70)
|
|
|
|
{src="clamp-a"} -20
|
|
|
|
{src="clamp-b"} 0
|
|
|
|
{src="clamp-c"} 70
|
|
|
|
|
|
|
|
clear
|
|
|
|
|
|
|
|
# Tests for topk/bottomk.
|
|
|
|
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="2", group="production"} NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
|
|
|
|
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_ordered instant at 50m topk(3, http_requests)
|
|
|
|
http_requests{group="canary", instance="1", job="app-server"} 800
|
|
|
|
http_requests{group="canary", instance="0", job="app-server"} 700
|
|
|
|
http_requests{group="production", instance="1", job="app-server"} 600
|
|
|
|
|
|
|
|
eval_ordered instant at 50m topk(5, http_requests{group="canary",job="app-server"})
|
|
|
|
http_requests{group="canary", instance="1", job="app-server"} 800
|
|
|
|
http_requests{group="canary", instance="0", job="app-server"} 700
|
|
|
|
|
|
|
|
eval_ordered instant at 50m bottomk(3, http_requests)
|
|
|
|
http_requests{group="production", instance="0", job="api-server"} 100
|
|
|
|
http_requests{group="production", instance="1", job="api-server"} 200
|
|
|
|
http_requests{group="canary", instance="0", job="api-server"} 300
|
|
|
|
|
|
|
|
eval_ordered instant at 50m bottomk(5, http_requests{group="canary",job="app-server"})
|
|
|
|
http_requests{group="canary", instance="0", job="app-server"} 700
|
|
|
|
http_requests{group="canary", instance="1", job="app-server"} 800
|
|
|
|
|
|
|
|
# Test NaN is sorted away from the top/bottom.
|
|
|
|
eval_ordered instant at 50m topk(3, http_requests{job="api-server",group="production"})
|
|
|
|
http_requests{job="api-server", instance="1", group="production"} 200
|
|
|
|
http_requests{job="api-server", instance="0", group="production"} 100
|
|
|
|
http_requests{job="api-server", instance="2", group="production"} NaN
|
|
|
|
|
|
|
|
eval_ordered instant at 50m bottomk(3, http_requests{job="api-server",group="production"})
|
|
|
|
http_requests{job="api-server", instance="0", group="production"} 100
|
|
|
|
http_requests{job="api-server", instance="1", group="production"} 200
|
|
|
|
http_requests{job="api-server", instance="2", group="production"} NaN
|
|
|
|
|
|
|
|
|
|
|
|
# Tests for sort/sort_desc.
|
|
|
|
clear
|
|
|
|
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="api-server", instance="2", group="canary"} NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
|
|
|
|
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_ordered instant at 50m sort(http_requests)
|
|
|
|
http_requests{group="production", instance="0", job="api-server"} 100
|
|
|
|
http_requests{group="production", instance="1", job="api-server"} 200
|
|
|
|
http_requests{group="canary", instance="0", job="api-server"} 300
|
|
|
|
http_requests{group="canary", instance="1", job="api-server"} 400
|
|
|
|
http_requests{group="production", instance="0", job="app-server"} 500
|
|
|
|
http_requests{group="production", instance="1", job="app-server"} 600
|
|
|
|
http_requests{group="canary", instance="0", job="app-server"} 700
|
|
|
|
http_requests{group="canary", instance="1", job="app-server"} 800
|
|
|
|
http_requests{group="canary", instance="2", job="api-server"} NaN
|
|
|
|
|
|
|
|
eval_ordered instant at 50m sort_desc(http_requests)
|
|
|
|
http_requests{group="canary", instance="1", job="app-server"} 800
|
|
|
|
http_requests{group="canary", instance="0", job="app-server"} 700
|
|
|
|
http_requests{group="production", instance="1", job="app-server"} 600
|
|
|
|
http_requests{group="production", instance="0", job="app-server"} 500
|
|
|
|
http_requests{group="canary", instance="1", job="api-server"} 400
|
|
|
|
http_requests{group="canary", instance="0", job="api-server"} 300
|
|
|
|
http_requests{group="production", instance="1", job="api-server"} 200
|
|
|
|
http_requests{group="production", instance="0", job="api-server"} 100
|
|
|
|
http_requests{group="canary", instance="2", job="api-server"} NaN
|