app/vmselect/promql: add range_over_time(m[d]) function for calculating value range for m over d

This commit is contained in:
Aliaksandr Valialkin 2020-01-21 19:05:10 +02:00
parent 36973ee975
commit 582dd01f42
5 changed files with 23 additions and 2 deletions

View file

@ -3248,6 +3248,17 @@ func TestExecSuccess(t *testing.T) {
resultExpected := []netstorage.Result{r} resultExpected := []netstorage.Result{r}
f(q, resultExpected) f(q, resultExpected)
}) })
t.Run(`range_over_time(time)`, func(t *testing.T) {
t.Parallel()
q := `range_over_time(alias(time()/100, "foobar")[3i])`
r := netstorage.Result{
MetricName: metricNameExpected,
Values: []float64{4, 4, 4, 4, 4, 4},
Timestamps: timestampsExpected,
}
resultExpected := []netstorage.Result{r}
f(q, resultExpected)
})
t.Run(`sum(multi-vector)`, func(t *testing.T) { t.Run(`sum(multi-vector)`, func(t *testing.T) {
t.Parallel() t.Parallel()
q := `sum(label_set(10, "foo", "bar") or label_set(time()/100, "baz", "sss"))` q := `sum(label_set(10, "foo", "bar") or label_set(time()/100, "baz", "sss"))`

View file

@ -15,8 +15,6 @@ import (
) )
var rollupFuncs = map[string]newRollupFunc{ var rollupFuncs = map[string]newRollupFunc{
"default_rollup": newRollupFuncOneArg(rollupDefault), // default rollup func
// Standard rollup funcs from PromQL. // Standard rollup funcs from PromQL.
// See funcs accepting range-vector on https://prometheus.io/docs/prometheus/latest/querying/functions/ . // See funcs accepting range-vector on https://prometheus.io/docs/prometheus/latest/querying/functions/ .
"changes": newRollupFuncOneArg(rollupChanges), "changes": newRollupFuncOneArg(rollupChanges),
@ -41,6 +39,8 @@ var rollupFuncs = map[string]newRollupFunc{
"absent_over_time": newRollupFuncOneArg(rollupAbsent), "absent_over_time": newRollupFuncOneArg(rollupAbsent),
// Additional rollup funcs. // Additional rollup funcs.
"default_rollup": newRollupFuncOneArg(rollupDefault), // default rollup func
"range_over_time": newRollupFuncOneArg(rollupRange),
"sum2_over_time": newRollupFuncOneArg(rollupSum2), "sum2_over_time": newRollupFuncOneArg(rollupSum2),
"geomean_over_time": newRollupFuncOneArg(rollupGeomean), "geomean_over_time": newRollupFuncOneArg(rollupGeomean),
"first_over_time": newRollupFuncOneArg(rollupFirst), "first_over_time": newRollupFuncOneArg(rollupFirst),
@ -91,6 +91,7 @@ var rollupAggrFuncs = map[string]rollupFunc{
"absent_over_time": rollupAbsent, "absent_over_time": rollupAbsent,
// Additional rollup funcs. // Additional rollup funcs.
"range_over_time": rollupRange,
"sum2_over_time": rollupSum2, "sum2_over_time": rollupSum2,
"geomean_over_time": rollupGeomean, "geomean_over_time": rollupGeomean,
"first_over_time": rollupFirst, "first_over_time": rollupFirst,
@ -1052,6 +1053,12 @@ func rollupSum(rfa *rollupFuncArg) float64 {
return sum return sum
} }
func rollupRange(rfa *rollupFuncArg) float64 {
max := rollupMax(rfa)
min := rollupMin(rfa)
return max - min
}
func rollupSum2(rfa *rollupFuncArg) float64 { func rollupSum2(rfa *rollupFuncArg) float64 {
// There is no need in handling NaNs here, since they must be cleaned up // There is no need in handling NaNs here, since they must be cleaned up
// before calling rollup funcs. // before calling rollup funcs.

View file

@ -370,6 +370,7 @@ func TestRollupNewRollupFuncSuccess(t *testing.T) {
f("irate", 0) f("irate", 0)
f("rate", 2200) f("rate", 2200)
f("resets", 5) f("resets", 5)
f("range_over_time", 111)
f("avg_over_time", 47.083333333333336) f("avg_over_time", 47.083333333333336)
f("min_over_time", 12) f("min_over_time", 12)
f("max_over_time", 123) f("max_over_time", 123)

View file

@ -66,6 +66,7 @@ This functionality can be tried at [an editable Grafana dashboard](http://play-g
- `lifetime(q[d])` - returns lifetime of `q` over `d` in seconds. It is expected that `d` exceeds the lifetime of `q`. - `lifetime(q[d])` - returns lifetime of `q` over `d` in seconds. It is expected that `d` exceeds the lifetime of `q`.
- `scrape_interval(q[d])` - returns the average interval in seconds between data points of `q` over `d` aka `scrape interval`. - `scrape_interval(q[d])` - returns the average interval in seconds between data points of `q` over `d` aka `scrape interval`.
- Trigonometric functions - `sin(q)`, `cos(q)`, `asin(q)`, `acos(q)` and `pi()`. - Trigonometric functions - `sin(q)`, `cos(q)`, `asin(q)`, `acos(q)` and `pi()`.
- `range_over_time(m[d])` - returns value range for `m` over `d` time window, i.e. `max_over_time(m[d])-min_over_time(m[d])`.
- `median_over_time(m[d])` - calculates median values for `m` over `d` time window. Shorthand to `quantile_over_time(0.5, m[d])`. - `median_over_time(m[d])` - calculates median values for `m` over `d` time window. Shorthand to `quantile_over_time(0.5, m[d])`.
- `median(q)` - median aggregate. Shorthand to `quantile(0.5, q)`. - `median(q)` - median aggregate. Shorthand to `quantile(0.5, q)`.
- `limitk(k, q)` - limits the number of time series returned from `q` to `k`. - `limitk(k, q)` - limits the number of time series returned from `q` to `k`.

View file

@ -30,6 +30,7 @@ var rollupFuncs = map[string]bool{
// Additional rollup funcs. // Additional rollup funcs.
"default_rollup": true, "default_rollup": true,
"range_over_time": true,
"sum2_over_time": true, "sum2_over_time": true,
"geomean_over_time": true, "geomean_over_time": true,
"first_over_time": true, "first_over_time": true,