app/vmselect/promql: add present_over_time(m[d]) function, which will be available starting from Prometheus 2.29.0

See https://github.com/prometheus/prometheus/releases/tag/v2.29.0-rc.0 and https://github.com/prometheus/prometheus/pull/9097
This commit is contained in:
Aliaksandr Valialkin 2021-08-03 12:21:05 +03:00
parent fa9c5c5940
commit e92fde7945
7 changed files with 68 additions and 21 deletions

View file

@ -698,6 +698,39 @@ func TestExecSuccess(t *testing.T) {
resultExpected := []netstorage.Result{} resultExpected := []netstorage.Result{}
f(q, resultExpected) f(q, resultExpected)
}) })
t.Run("present_over_time(time())", func(t *testing.T) {
t.Parallel()
q := `present_over_time(time())`
r := netstorage.Result{
MetricName: metricNameExpected,
Values: []float64{1, 1, 1, 1, 1, 1},
Timestamps: timestampsExpected,
}
resultExpected := []netstorage.Result{r}
f(q, resultExpected)
})
t.Run("present_over_time(time()[100:300])", func(t *testing.T) {
t.Parallel()
q := `present_over_time(time()[100:300])`
r := netstorage.Result{
MetricName: metricNameExpected,
Values: []float64{nan, 1, nan, nan, 1, nan},
Timestamps: timestampsExpected,
}
resultExpected := []netstorage.Result{r}
f(q, resultExpected)
})
t.Run("present_over_time(time()<10m)", func(t *testing.T) {
t.Parallel()
q := `present_over_time(time()<1600)`
r := netstorage.Result{
MetricName: metricNameExpected,
Values: []float64{1, 1, 1, nan, nan, nan},
Timestamps: timestampsExpected,
}
resultExpected := []netstorage.Result{r}
f(q, resultExpected)
})
t.Run("absent(123)", func(t *testing.T) { t.Run("absent(123)", func(t *testing.T) {
t.Parallel() t.Parallel()
q := `absent(123)` q := `absent(123)`

View file

@ -42,6 +42,7 @@ var rollupFuncs = map[string]newRollupFunc{
"stddev_over_time": newRollupFuncOneArg(rollupStddev), "stddev_over_time": newRollupFuncOneArg(rollupStddev),
"stdvar_over_time": newRollupFuncOneArg(rollupStdvar), "stdvar_over_time": newRollupFuncOneArg(rollupStdvar),
"absent_over_time": newRollupFuncOneArg(rollupAbsent), "absent_over_time": newRollupFuncOneArg(rollupAbsent),
"present_over_time": newRollupFuncOneArg(rollupPresent),
// Additional rollup funcs. // Additional rollup funcs.
"default_rollup": newRollupFuncOneArg(rollupDefault), // default rollup func "default_rollup": newRollupFuncOneArg(rollupDefault), // default rollup func
@ -97,23 +98,24 @@ var rollupFuncs = map[string]newRollupFunc{
// rollupAggrFuncs are functions that can be passed to `aggr_over_time()` // rollupAggrFuncs are functions that can be passed to `aggr_over_time()`
var rollupAggrFuncs = map[string]rollupFunc{ var rollupAggrFuncs = map[string]rollupFunc{
// Standard rollup funcs from PromQL. // Standard rollup funcs from PromQL.
"changes": rollupChanges, "changes": rollupChanges,
"delta": rollupDelta, "delta": rollupDelta,
"deriv": rollupDerivSlow, "deriv": rollupDerivSlow,
"deriv_fast": rollupDerivFast, "deriv_fast": rollupDerivFast,
"idelta": rollupIdelta, "idelta": rollupIdelta,
"increase": rollupDelta, // + rollupFuncsRemoveCounterResets "increase": rollupDelta, // + rollupFuncsRemoveCounterResets
"irate": rollupIderiv, // + rollupFuncsRemoveCounterResets "irate": rollupIderiv, // + rollupFuncsRemoveCounterResets
"rate": rollupDerivFast, // + rollupFuncsRemoveCounterResets "rate": rollupDerivFast, // + rollupFuncsRemoveCounterResets
"resets": rollupResets, "resets": rollupResets,
"avg_over_time": rollupAvg, "avg_over_time": rollupAvg,
"min_over_time": rollupMin, "min_over_time": rollupMin,
"max_over_time": rollupMax, "max_over_time": rollupMax,
"sum_over_time": rollupSum, "sum_over_time": rollupSum,
"count_over_time": rollupCount, "count_over_time": rollupCount,
"stddev_over_time": rollupStddev, "stddev_over_time": rollupStddev,
"stdvar_over_time": rollupStdvar, "stdvar_over_time": rollupStdvar,
"absent_over_time": rollupAbsent, "absent_over_time": rollupAbsent,
"present_over_time": rollupPresent,
// Additional rollup funcs. // Additional rollup funcs.
"range_over_time": rollupRange, "range_over_time": rollupRange,
@ -157,6 +159,7 @@ var rollupFuncsCannotAdjustWindow = map[string]bool{
"stddev_over_time": true, "stddev_over_time": true,
"stdvar_over_time": true, "stdvar_over_time": true,
"absent_over_time": true, "absent_over_time": true,
"present_over_time": true,
"sum2_over_time": true, "sum2_over_time": true,
"geomean_over_time": true, "geomean_over_time": true,
"distinct_over_time": true, "distinct_over_time": true,
@ -1284,6 +1287,15 @@ func rollupAbsent(rfa *rollupFuncArg) float64 {
return nan return nan
} }
func rollupPresent(rfa *rollupFuncArg) float64 {
// There is no need in handling NaNs here, since they must be cleaned up
// before calling rollup funcs.
if len(rfa.values) > 0 {
return 1
}
return nan
}
func rollupCount(rfa *rollupFuncArg) float64 { func rollupCount(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

@ -6,6 +6,7 @@ sort: 15
## tip ## tip
* FEATURE: add `present_over_time(m[d])` function, which returns 1 if `m` has a least a single sample over the previous duration `d`. This function has been added also to [Prometheus 2.29](https://github.com/prometheus/prometheus/releases/tag/v2.29.0-rc.0).
* FEATURE: add `-search.maxSamplesPerSeries` command-line flag for limiting the number of raw samples a single query can process per each time series. This option can protect from out of memory errors when a query processes tens of millions of raw samples per series. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1067). * FEATURE: add `-search.maxSamplesPerSeries` command-line flag for limiting the number of raw samples a single query can process per each time series. This option can protect from out of memory errors when a query processes tens of millions of raw samples per series. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1067).
* FEATURE: add `-search.maxSamplesPerQuery` command-line flag for limiting the number of raw samples a single query can process across all the time series. This option can protect from heavy queries, which select too big number of raw samples. Thanks to @jiangxinlingdu for [the initial pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/1478). * FEATURE: add `-search.maxSamplesPerQuery` command-line flag for limiting the number of raw samples a single query can process across all the time series. This option can protect from heavy queries, which select too big number of raw samples. Thanks to @jiangxinlingdu for [the initial pull request](https://github.com/VictoriaMetrics/VictoriaMetrics/pull/1478).
* FEATURE: improve performance for queries that process big number of time series and/or samples on systems with big number of CPU cores. * FEATURE: improve performance for queries that process big number of time series and/or samples on systems with big number of CPU cores.

2
go.mod
View file

@ -9,7 +9,7 @@ require (
// like https://github.com/valyala/fasthttp/commit/996610f021ff45fdc98c2ce7884d5fa4e7f9199b // like https://github.com/valyala/fasthttp/commit/996610f021ff45fdc98c2ce7884d5fa4e7f9199b
github.com/VictoriaMetrics/fasthttp v1.0.16 github.com/VictoriaMetrics/fasthttp v1.0.16
github.com/VictoriaMetrics/metrics v1.17.3 github.com/VictoriaMetrics/metrics v1.17.3
github.com/VictoriaMetrics/metricsql v0.16.0 github.com/VictoriaMetrics/metricsql v0.17.0
github.com/VividCortex/ewma v1.2.0 // indirect github.com/VividCortex/ewma v1.2.0 // indirect
github.com/aws/aws-sdk-go v1.40.7 github.com/aws/aws-sdk-go v1.40.7
github.com/cespare/xxhash/v2 v2.1.1 github.com/cespare/xxhash/v2 v2.1.1

4
go.sum
View file

@ -107,8 +107,8 @@ github.com/VictoriaMetrics/fasthttp v1.0.16/go.mod h1:s9o5H4T58Kt4CTrdyJp4RorBKC
github.com/VictoriaMetrics/metrics v1.12.2/go.mod h1:Z1tSfPfngDn12bTfZSCqArT3OPY3u88J12hSoOhuiRE= github.com/VictoriaMetrics/metrics v1.12.2/go.mod h1:Z1tSfPfngDn12bTfZSCqArT3OPY3u88J12hSoOhuiRE=
github.com/VictoriaMetrics/metrics v1.17.3 h1:QPUakR6JRy8BhL2C2kOgYKLuoPDwtJQ+7iKIZSjt1A4= github.com/VictoriaMetrics/metrics v1.17.3 h1:QPUakR6JRy8BhL2C2kOgYKLuoPDwtJQ+7iKIZSjt1A4=
github.com/VictoriaMetrics/metrics v1.17.3/go.mod h1:Z1tSfPfngDn12bTfZSCqArT3OPY3u88J12hSoOhuiRE= github.com/VictoriaMetrics/metrics v1.17.3/go.mod h1:Z1tSfPfngDn12bTfZSCqArT3OPY3u88J12hSoOhuiRE=
github.com/VictoriaMetrics/metricsql v0.16.0 h1:YzrMnGUs6Y6f5LxsH8eSAoik98aEzlc1TiYgOONgr3Q= github.com/VictoriaMetrics/metricsql v0.17.0 h1:OdOkx5GK2p1+EnHn/+zpLWW6ze96L1AmMV5X1HOzyfY=
github.com/VictoriaMetrics/metricsql v0.16.0/go.mod h1:ylO7YITho/Iw6P71oEaGyHbO94bGoGtzWfLGqFhMIg8= github.com/VictoriaMetrics/metricsql v0.17.0/go.mod h1:ylO7YITho/Iw6P71oEaGyHbO94bGoGtzWfLGqFhMIg8=
github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA= github.com/VividCortex/ewma v1.1.1/go.mod h1:2Tkkvm3sRDVXaiyucHiACn4cqf7DpdyLvmxzcbUokwA=
github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow= github.com/VividCortex/ewma v1.2.0 h1:f58SaIzcDXrSy3kWaHNvuJgJ3Nmz59Zji6XoJR/q1ow=
github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4= github.com/VividCortex/ewma v1.2.0/go.mod h1:nz4BbCtbLyFDeC9SUHbtcT5644juEuWfUAUnGx7j5l4=

View file

@ -27,6 +27,7 @@ var rollupFuncs = map[string]bool{
"stddev_over_time": true, "stddev_over_time": true,
"stdvar_over_time": true, "stdvar_over_time": true,
"absent_over_time": true, "absent_over_time": true,
"present_over_time": true,
// Additional rollup funcs. // Additional rollup funcs.
"default_rollup": true, "default_rollup": true,

2
vendor/modules.txt vendored
View file

@ -21,7 +21,7 @@ github.com/VictoriaMetrics/fasthttp/stackless
# github.com/VictoriaMetrics/metrics v1.17.3 # github.com/VictoriaMetrics/metrics v1.17.3
## explicit ## explicit
github.com/VictoriaMetrics/metrics github.com/VictoriaMetrics/metrics
# github.com/VictoriaMetrics/metricsql v0.16.0 # github.com/VictoriaMetrics/metricsql v0.17.0
## explicit ## explicit
github.com/VictoriaMetrics/metricsql github.com/VictoriaMetrics/metricsql
github.com/VictoriaMetrics/metricsql/binaryop github.com/VictoriaMetrics/metricsql/binaryop