1load 5m 2 http_requests{job="api-server", instance="0", group="production"} 0+10x10 3 http_requests{job="api-server", instance="1", group="production"} 0+20x10 4 http_requests{job="api-server", instance="0", group="canary"} 0+30x10 5 http_requests{job="api-server", instance="1", group="canary"} 0+40x10 6 http_requests{job="app-server", instance="0", group="production"} 0+50x10 7 http_requests{job="app-server", instance="1", group="production"} 0+60x10 8 http_requests{job="app-server", instance="0", group="canary"} 0+70x10 9 http_requests{job="app-server", instance="1", group="canary"} 0+80x10 10 11load 5m 12 foo{job="api-server", instance="0", region="europe"} 0+90x10 13 foo{job="api-server"} 0+100x10 14 15# Simple sum. 16eval instant at 50m SUM BY (group) (http_requests{job="api-server"}) 17 {group="canary"} 700 18 {group="production"} 300 19 20eval instant at 50m SUM BY (group) (((http_requests{job="api-server"}))) 21 {group="canary"} 700 22 {group="production"} 300 23 24# Test alternative "by"-clause order. 25eval instant at 50m sum by (group) (http_requests{job="api-server"}) 26 {group="canary"} 700 27 {group="production"} 300 28 29# Simple average. 30eval instant at 50m avg by (group) (http_requests{job="api-server"}) 31 {group="canary"} 350 32 {group="production"} 150 33 34# Simple count. 35eval instant at 50m count by (group) (http_requests{job="api-server"}) 36 {group="canary"} 2 37 {group="production"} 2 38 39# Simple without. 40eval instant at 50m sum without (instance) (http_requests{job="api-server"}) 41 {group="canary",job="api-server"} 700 42 {group="production",job="api-server"} 300 43 44# Empty by. 45eval instant at 50m sum by () (http_requests{job="api-server"}) 46 {} 1000 47 48# No by/without. 49eval instant at 50m sum(http_requests{job="api-server"}) 50 {} 1000 51 52# Empty without. 53eval instant at 50m sum without () (http_requests{job="api-server",group="production"}) 54 {group="production",job="api-server",instance="0"} 100 55 {group="production",job="api-server",instance="1"} 200 56 57# Without with mismatched and missing labels. Do not do this. 58eval instant at 50m sum without (instance) (http_requests{job="api-server"} or foo) 59 {group="canary",job="api-server"} 700 60 {group="production",job="api-server"} 300 61 {region="europe",job="api-server"} 900 62 {job="api-server"} 1000 63 64# Lower-cased aggregation operators should work too. 65eval instant at 50m sum(http_requests) by (job) + min(http_requests) by (job) + max(http_requests) by (job) + avg(http_requests) by (job) 66 {job="app-server"} 4550 67 {job="api-server"} 1750 68 69# Test alternative "by"-clause order. 70eval instant at 50m sum by (group) (http_requests{job="api-server"}) 71 {group="canary"} 700 72 {group="production"} 300 73 74# Test both alternative "by"-clause orders in one expression. 75# Public health warning: stick to one form within an expression (or even 76# in an organization), or risk serious user confusion. 77eval instant at 50m sum(sum by (group) (http_requests{job="api-server"})) by (job) 78 {} 1000 79 80eval instant at 50m SUM(http_requests) 81 {} 3600 82 83eval instant at 50m SUM(http_requests{instance="0"}) BY(job) 84 {job="api-server"} 400 85 {job="app-server"} 1200 86 87eval instant at 50m SUM(http_requests) BY (job) 88 {job="api-server"} 1000 89 {job="app-server"} 2600 90 91# Non-existent labels mentioned in BY-clauses shouldn't propagate to output. 92eval instant at 50m SUM(http_requests) BY (job, nonexistent) 93 {job="api-server"} 1000 94 {job="app-server"} 2600 95 96eval instant at 50m COUNT(http_requests) BY (job) 97 {job="api-server"} 4 98 {job="app-server"} 4 99 100eval instant at 50m SUM(http_requests) BY (job, group) 101 {group="canary", job="api-server"} 700 102 {group="canary", job="app-server"} 1500 103 {group="production", job="api-server"} 300 104 {group="production", job="app-server"} 1100 105 106eval instant at 50m AVG(http_requests) BY (job) 107 {job="api-server"} 250 108 {job="app-server"} 650 109 110eval instant at 50m MIN(http_requests) BY (job) 111 {job="api-server"} 100 112 {job="app-server"} 500 113 114eval instant at 50m MAX(http_requests) BY (job) 115 {job="api-server"} 400 116 {job="app-server"} 800 117 118eval instant at 50m abs(-1 * http_requests{group="production",job="api-server"}) 119 {group="production", instance="0", job="api-server"} 100 120 {group="production", instance="1", job="api-server"} 200 121 122eval instant at 50m floor(0.004 * http_requests{group="production",job="api-server"}) 123 {group="production", instance="0", job="api-server"} 0 124 {group="production", instance="1", job="api-server"} 0 125 126eval instant at 50m ceil(0.004 * http_requests{group="production",job="api-server"}) 127 {group="production", instance="0", job="api-server"} 1 128 {group="production", instance="1", job="api-server"} 1 129 130eval instant at 50m round(0.004 * http_requests{group="production",job="api-server"}) 131 {group="production", instance="0", job="api-server"} 0 132 {group="production", instance="1", job="api-server"} 1 133 134# Round should correctly handle negative numbers. 135eval instant at 50m round(-1 * (0.004 * http_requests{group="production",job="api-server"})) 136 {group="production", instance="0", job="api-server"} 0 137 {group="production", instance="1", job="api-server"} -1 138 139# Round should round half up. 140eval instant at 50m round(0.005 * http_requests{group="production",job="api-server"}) 141 {group="production", instance="0", job="api-server"} 1 142 {group="production", instance="1", job="api-server"} 1 143 144eval instant at 50m round(-1 * (0.005 * http_requests{group="production",job="api-server"})) 145 {group="production", instance="0", job="api-server"} 0 146 {group="production", instance="1", job="api-server"} -1 147 148eval instant at 50m round(1 + 0.005 * http_requests{group="production",job="api-server"}) 149 {group="production", instance="0", job="api-server"} 2 150 {group="production", instance="1", job="api-server"} 2 151 152eval instant at 50m round(-1 * (1 + 0.005 * http_requests{group="production",job="api-server"})) 153 {group="production", instance="0", job="api-server"} -1 154 {group="production", instance="1", job="api-server"} -2 155 156# Round should accept the number to round nearest to. 157eval instant at 50m round(0.0005 * http_requests{group="production",job="api-server"}, 0.1) 158 {group="production", instance="0", job="api-server"} 0.1 159 {group="production", instance="1", job="api-server"} 0.1 160 161eval instant at 50m round(2.1 + 0.0005 * http_requests{group="production",job="api-server"}, 0.1) 162 {group="production", instance="0", job="api-server"} 2.2 163 {group="production", instance="1", job="api-server"} 2.2 164 165eval instant at 50m round(5.2 + 0.0005 * http_requests{group="production",job="api-server"}, 0.1) 166 {group="production", instance="0", job="api-server"} 5.3 167 {group="production", instance="1", job="api-server"} 5.3 168 169# Round should work correctly with negative numbers and multiple decimal places. 170eval instant at 50m round(-1 * (5.2 + 0.0005 * http_requests{group="production",job="api-server"}), 0.1) 171 {group="production", instance="0", job="api-server"} -5.2 172 {group="production", instance="1", job="api-server"} -5.3 173 174# Round should work correctly with big toNearests. 175eval instant at 50m round(0.025 * http_requests{group="production",job="api-server"}, 5) 176 {group="production", instance="0", job="api-server"} 5 177 {group="production", instance="1", job="api-server"} 5 178 179eval instant at 50m round(0.045 * http_requests{group="production",job="api-server"}, 5) 180 {group="production", instance="0", job="api-server"} 5 181 {group="production", instance="1", job="api-server"} 10 182 183# Standard deviation and variance. 184eval instant at 50m stddev(http_requests) 185 {} 229.12878474779 186 187eval instant at 50m stddev by (instance)(http_requests) 188 {instance="0"} 223.60679774998 189 {instance="1"} 223.60679774998 190 191eval instant at 50m stdvar(http_requests) 192 {} 52500 193 194eval instant at 50m stdvar by (instance)(http_requests) 195 {instance="0"} 50000 196 {instance="1"} 50000 197 198# Float precision test for standard deviation and variance 199clear 200load 5m 201 http_requests{job="api-server", instance="0", group="production"} 0+1.33x10 202 http_requests{job="api-server", instance="1", group="production"} 0+1.33x10 203 http_requests{job="api-server", instance="0", group="canary"} 0+1.33x10 204 205eval instant at 50m stddev(http_requests) 206 {} 0.0 207 208eval instant at 50m stdvar(http_requests) 209 {} 0.0 210 211 212# Regression test for missing separator byte in labelsToGroupingKey. 213clear 214load 5m 215 label_grouping_test{a="aa", b="bb"} 0+10x10 216 label_grouping_test{a="a", b="abb"} 0+20x10 217 218eval instant at 50m sum(label_grouping_test) by (a, b) 219 {a="a", b="abb"} 200 220 {a="aa", b="bb"} 100 221 222 223 224# Tests for min/max. 225clear 226load 5m 227 http_requests{job="api-server", instance="0", group="production"} 1 228 http_requests{job="api-server", instance="1", group="production"} 2 229 http_requests{job="api-server", instance="0", group="canary"} NaN 230 http_requests{job="api-server", instance="1", group="canary"} 3 231 http_requests{job="api-server", instance="2", group="canary"} 4 232 233eval instant at 0m max(http_requests) 234 {} 4 235 236eval instant at 0m min(http_requests) 237 {} 1 238 239eval instant at 0m max by (group) (http_requests) 240 {group="production"} 2 241 {group="canary"} 4 242 243eval instant at 0m min by (group) (http_requests) 244 {group="production"} 1 245 {group="canary"} 3 246 247clear 248 249# Tests for topk/bottomk. 250load 5m 251 http_requests{job="api-server", instance="0", group="production"} 0+10x10 252 http_requests{job="api-server", instance="1", group="production"} 0+20x10 253 http_requests{job="api-server", instance="2", group="production"} NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN 254 http_requests{job="api-server", instance="0", group="canary"} 0+30x10 255 http_requests{job="api-server", instance="1", group="canary"} 0+40x10 256 http_requests{job="app-server", instance="0", group="production"} 0+50x10 257 http_requests{job="app-server", instance="1", group="production"} 0+60x10 258 http_requests{job="app-server", instance="0", group="canary"} 0+70x10 259 http_requests{job="app-server", instance="1", group="canary"} 0+80x10 260 foo 3+0x10 261 262eval_ordered instant at 50m topk(3, http_requests) 263 http_requests{group="canary", instance="1", job="app-server"} 800 264 http_requests{group="canary", instance="0", job="app-server"} 700 265 http_requests{group="production", instance="1", job="app-server"} 600 266 267eval_ordered instant at 50m topk((3), (http_requests)) 268 http_requests{group="canary", instance="1", job="app-server"} 800 269 http_requests{group="canary", instance="0", job="app-server"} 700 270 http_requests{group="production", instance="1", job="app-server"} 600 271 272eval_ordered instant at 50m topk(5, http_requests{group="canary",job="app-server"}) 273 http_requests{group="canary", instance="1", job="app-server"} 800 274 http_requests{group="canary", instance="0", job="app-server"} 700 275 276eval_ordered instant at 50m bottomk(3, http_requests) 277 http_requests{group="production", instance="0", job="api-server"} 100 278 http_requests{group="production", instance="1", job="api-server"} 200 279 http_requests{group="canary", instance="0", job="api-server"} 300 280 281eval_ordered instant at 50m bottomk(5, http_requests{group="canary",job="app-server"}) 282 http_requests{group="canary", instance="0", job="app-server"} 700 283 http_requests{group="canary", instance="1", job="app-server"} 800 284 285eval instant at 50m topk by (group) (1, http_requests) 286 http_requests{group="production", instance="1", job="app-server"} 600 287 http_requests{group="canary", instance="1", job="app-server"} 800 288 289eval instant at 50m bottomk by (group) (2, http_requests) 290 http_requests{group="canary", instance="0", job="api-server"} 300 291 http_requests{group="canary", instance="1", job="api-server"} 400 292 http_requests{group="production", instance="0", job="api-server"} 100 293 http_requests{group="production", instance="1", job="api-server"} 200 294 295eval_ordered instant at 50m bottomk by (group) (2, http_requests{group="production"}) 296 http_requests{group="production", instance="0", job="api-server"} 100 297 http_requests{group="production", instance="1", job="api-server"} 200 298 299# Test NaN is sorted away from the top/bottom. 300eval_ordered instant at 50m topk(3, http_requests{job="api-server",group="production"}) 301 http_requests{job="api-server", instance="1", group="production"} 200 302 http_requests{job="api-server", instance="0", group="production"} 100 303 http_requests{job="api-server", instance="2", group="production"} NaN 304 305eval_ordered instant at 50m bottomk(3, http_requests{job="api-server",group="production"}) 306 http_requests{job="api-server", instance="0", group="production"} 100 307 http_requests{job="api-server", instance="1", group="production"} 200 308 http_requests{job="api-server", instance="2", group="production"} NaN 309 310# Test topk and bottomk allocate min(k, input_vector) for results vector 311eval_ordered instant at 50m bottomk(9999999999, http_requests{job="app-server",group="canary"}) 312 http_requests{group="canary", instance="0", job="app-server"} 700 313 http_requests{group="canary", instance="1", job="app-server"} 800 314 315eval_ordered instant at 50m topk(9999999999, http_requests{job="api-server",group="production"}) 316 http_requests{job="api-server", instance="1", group="production"} 200 317 http_requests{job="api-server", instance="0", group="production"} 100 318 http_requests{job="api-server", instance="2", group="production"} NaN 319 320# Bug #5276. 321eval_ordered instant at 50m topk(scalar(foo), http_requests) 322 http_requests{group="canary", instance="1", job="app-server"} 800 323 http_requests{group="canary", instance="0", job="app-server"} 700 324 http_requests{group="production", instance="1", job="app-server"} 600 325 326clear 327 328# Tests for count_values. 329load 5m 330 version{job="api-server", instance="0", group="production"} 6 331 version{job="api-server", instance="1", group="production"} 6 332 version{job="api-server", instance="2", group="production"} 6 333 version{job="api-server", instance="0", group="canary"} 8 334 version{job="api-server", instance="1", group="canary"} 8 335 version{job="app-server", instance="0", group="production"} 6 336 version{job="app-server", instance="1", group="production"} 6 337 version{job="app-server", instance="0", group="canary"} 7 338 version{job="app-server", instance="1", group="canary"} 7 339 340eval instant at 5m count_values("version", version) 341 {version="6"} 5 342 {version="7"} 2 343 {version="8"} 2 344 345 346eval instant at 5m count_values(((("version"))), version) 347 {version="6"} 5 348 {version="7"} 2 349 {version="8"} 2 350 351 352eval instant at 5m count_values without (instance)("version", version) 353 {job="api-server", group="production", version="6"} 3 354 {job="api-server", group="canary", version="8"} 2 355 {job="app-server", group="production", version="6"} 2 356 {job="app-server", group="canary", version="7"} 2 357 358# Overwrite label with output. Don't do this. 359eval instant at 5m count_values without (instance)("job", version) 360 {job="6", group="production"} 5 361 {job="8", group="canary"} 2 362 {job="7", group="canary"} 2 363 364# Overwrite label with output. Don't do this. 365eval instant at 5m count_values by (job, group)("job", version) 366 {job="6", group="production"} 5 367 {job="8", group="canary"} 2 368 {job="7", group="canary"} 2 369 370 371# Tests for quantile. 372clear 373 374load 10s 375 data{test="two samples",point="a"} 0 376 data{test="two samples",point="b"} 1 377 data{test="three samples",point="a"} 0 378 data{test="three samples",point="b"} 1 379 data{test="three samples",point="c"} 2 380 data{test="uneven samples",point="a"} 0 381 data{test="uneven samples",point="b"} 1 382 data{test="uneven samples",point="c"} 4 383 foo .8 384 385eval instant at 1m quantile without(point)(0.8, data) 386 {test="two samples"} 0.8 387 {test="three samples"} 1.6 388 {test="uneven samples"} 2.8 389 390# Bug #5276. 391eval instant at 1m quantile without(point)(scalar(foo), data) 392 {test="two samples"} 0.8 393 {test="three samples"} 1.6 394 {test="uneven samples"} 2.8 395 396 397eval instant at 1m quantile without(point)((scalar(foo)), data) 398 {test="two samples"} 0.8 399 {test="three samples"} 1.6 400 {test="uneven samples"} 2.8 401 402# Tests for group. 403clear 404 405load 10s 406 data{test="two samples",point="a"} 0 407 data{test="two samples",point="b"} 1 408 data{test="three samples",point="a"} 0 409 data{test="three samples",point="b"} 1 410 data{test="three samples",point="c"} 2 411 data{test="uneven samples",point="a"} 0 412 data{test="uneven samples",point="b"} 1 413 data{test="uneven samples",point="c"} 4 414 foo .8 415 416eval instant at 1m group without(point)(data) 417 {test="two samples"} 1 418 {test="three samples"} 1 419 {test="uneven samples"} 1 420 421eval instant at 1m group(foo) 422 {} 1 423 424# Tests for avg. 425clear 426 427load 10s 428 data{test="ten",point="a"} 8 429 data{test="ten",point="b"} 10 430 data{test="ten",point="c"} 12 431 data{test="inf",point="a"} 0 432 data{test="inf",point="b"} Inf 433 data{test="inf",point="d"} Inf 434 data{test="inf",point="c"} 0 435 data{test="-inf",point="a"} -Inf 436 data{test="-inf",point="b"} -Inf 437 data{test="-inf",point="c"} 0 438 data{test="inf2",point="a"} Inf 439 data{test="inf2",point="b"} 0 440 data{test="inf2",point="c"} Inf 441 data{test="-inf2",point="a"} -Inf 442 data{test="-inf2",point="b"} 0 443 data{test="-inf2",point="c"} -Inf 444 data{test="inf3",point="b"} Inf 445 data{test="inf3",point="d"} Inf 446 data{test="inf3",point="c"} Inf 447 data{test="inf3",point="d"} -Inf 448 data{test="-inf3",point="b"} -Inf 449 data{test="-inf3",point="d"} -Inf 450 data{test="-inf3",point="c"} -Inf 451 data{test="-inf3",point="c"} Inf 452 data{test="nan",point="a"} -Inf 453 data{test="nan",point="b"} 0 454 data{test="nan",point="c"} Inf 455 data{test="big",point="a"} 9.988465674311579e+307 456 data{test="big",point="b"} 9.988465674311579e+307 457 data{test="big",point="c"} 9.988465674311579e+307 458 data{test="big",point="d"} 9.988465674311579e+307 459 data{test="-big",point="a"} -9.988465674311579e+307 460 data{test="-big",point="b"} -9.988465674311579e+307 461 data{test="-big",point="c"} -9.988465674311579e+307 462 data{test="-big",point="d"} -9.988465674311579e+307 463 data{test="bigzero",point="a"} -9.988465674311579e+307 464 data{test="bigzero",point="b"} -9.988465674311579e+307 465 data{test="bigzero",point="c"} 9.988465674311579e+307 466 data{test="bigzero",point="d"} 9.988465674311579e+307 467 468eval instant at 1m avg(data{test="ten"}) 469 {} 10 470 471eval instant at 1m avg(data{test="inf"}) 472 {} Inf 473 474eval instant at 1m avg(data{test="inf2"}) 475 {} Inf 476 477eval instant at 1m avg(data{test="inf3"}) 478 {} NaN 479 480eval instant at 1m avg(data{test="-inf"}) 481 {} -Inf 482 483eval instant at 1m avg(data{test="-inf2"}) 484 {} -Inf 485 486eval instant at 1m avg(data{test="-inf3"}) 487 {} NaN 488 489eval instant at 1m avg(data{test="nan"}) 490 {} NaN 491 492eval instant at 1m avg(data{test="big"}) 493 {} 9.988465674311579e+307 494 495eval instant at 1m avg(data{test="-big"}) 496 {} -9.988465674311579e+307 497 498eval instant at 1m avg(data{test="bigzero"}) 499 {} 0 500