mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
app/vmselect/promql: add range_over_time(m[d])
function for calculating value range for m
over d
This commit is contained in:
parent
36973ee975
commit
582dd01f42
5 changed files with 23 additions and 2 deletions
|
@ -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"))`
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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`.
|
||||||
|
|
|
@ -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,
|
||||||
|
|
Loading…
Reference in a new issue