diff --git a/app/vmselect/promql/rollup.go b/app/vmselect/promql/rollup.go index cedcf1958..41cf242fa 100644 --- a/app/vmselect/promql/rollup.go +++ b/app/vmselect/promql/rollup.go @@ -60,6 +60,8 @@ var rollupFuncs = map[string]newRollupFunc{ "scrape_interval": newRollupFuncOneArg(rollupScrapeInterval), "tmin_over_time": newRollupFuncOneArg(rollupTmin), "tmax_over_time": newRollupFuncOneArg(rollupTmax), + "tfirst_over_time": newRollupFuncOneArg(rollupTfirst), + "tlast_over_time": newRollupFuncOneArg(rollupTlast), "share_le_over_time": newRollupShareLE, "share_gt_over_time": newRollupShareGT, "count_le_over_time": newRollupCountLE, @@ -83,7 +85,7 @@ var rollupFuncs = map[string]newRollupFunc{ // `timestamp` function must return timestamp for the last datapoint on the current window // in order to properly handle offset and timestamps unaligned to the current step. // See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/415 for details. - "timestamp": newRollupFuncOneArg(rollupTimestamp), + "timestamp": newRollupFuncOneArg(rollupTlast), // See https://en.wikipedia.org/wiki/Mode_(statistics) "mode_over_time": newRollupFuncOneArg(rollupModeOverTime), @@ -128,10 +130,12 @@ var rollupAggrFuncs = map[string]rollupFunc{ "scrape_interval": rollupScrapeInterval, "tmin_over_time": rollupTmin, "tmax_over_time": rollupTmax, + "tfirst_over_time": rollupTfirst, + "tlast_over_time": rollupTlast, "ascent_over_time": rollupAscentOverTime, "descent_over_time": rollupDescentOverTime, "zscore_over_time": rollupZScoreOverTime, - "timestamp": rollupTimestamp, + "timestamp": rollupTlast, "mode_over_time": rollupModeOverTime, "rate_over_sum": rollupRateOverSum, } @@ -1167,6 +1171,32 @@ func rollupTmax(rfa *rollupFuncArg) float64 { return float64(maxTimestamp) / 1e3 } +func rollupTfirst(rfa *rollupFuncArg) float64 { + // There is no need in handling NaNs here, since they must be cleaned up + // before calling rollup funcs. + timestamps := rfa.timestamps + if len(timestamps) == 0 { + // Do not take into account rfa.prevTimestamp, since it may lead + // to inconsistent results comparing to Prometheus on broken time series + // with irregular data points. + return nan + } + return float64(timestamps[0]) / 1e3 +} + +func rollupTlast(rfa *rollupFuncArg) float64 { + // There is no need in handling NaNs here, since they must be cleaned up + // before calling rollup funcs. + timestamps := rfa.timestamps + if len(timestamps) == 0 { + // Do not take into account rfa.prevTimestamp, since it may lead + // to inconsistent results comparing to Prometheus on broken time series + // with irregular data points. + return nan + } + return float64(timestamps[len(timestamps)-1]) / 1e3 +} + func rollupSum(rfa *rollupFuncArg) float64 { // There is no need in handling NaNs here, since they must be cleaned up // before calling rollup funcs. @@ -1662,19 +1692,6 @@ func rollupLow(rfa *rollupFuncArg) float64 { return min } -func rollupTimestamp(rfa *rollupFuncArg) float64 { - // There is no need in handling NaNs here, since they must be cleaned up - // before calling rollup funcs. - timestamps := rfa.timestamps - if len(timestamps) == 0 { - // Do not take into account rfa.prevTimestamp, since it may lead - // to inconsistent results comparing to Prometheus on broken time series - // with irregular data points. - return nan - } - return float64(timestamps[len(timestamps)-1]) / 1e3 -} - func rollupModeOverTime(rfa *rollupFuncArg) float64 { // There is no need in handling NaNs here, since they must be cleaned up // before calling rollup funcs. diff --git a/app/vmselect/promql/rollup_test.go b/app/vmselect/promql/rollup_test.go index b736d6259..2820b5b7f 100644 --- a/app/vmselect/promql/rollup_test.go +++ b/app/vmselect/promql/rollup_test.go @@ -461,6 +461,8 @@ func TestRollupNewRollupFuncSuccess(t *testing.T) { f("max_over_time", 123) f("tmin_over_time", 0.08) f("tmax_over_time", 0.005) + f("tfirst_over_time", 0.005) + f("tlast_over_time", 0.13) f("sum_over_time", 565) f("sum2_over_time", 37951) f("geomean_over_time", 39.33466603189148) diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index e0b1eab8c..c48ec09c0 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -2,15 +2,16 @@ # tip +* FEATURE: provide a sample list of alerting rules for VictoriaMetrics components. It is available [here](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/deployment/docker/alerts.yml). +* FEATURE: disable final merge for data for the previous month at the beginning of new month, since it may result in high disk IO and CPU usage. Final merge can be enabled by setting `-finalMergeDelay` command-line flag to positive duration. +* FEATURE: add `tfirst_over_time(m[d])` and `tlast_over_time(m[d])` functions to [MetricsQL](https://victoriametrics.github.io/MetricsQL.html) for returning timestamps for the first and the last data point in `m` over `d` duration. + * BUGFIX: vmagent: prevent from `dialing to the given TCP address time out` error when scraping big number of unavailable targets. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/987 * BUGFIX: vmagent: properly show scrape duration on `/targets` page. Previously it was incorrectly shown as 0.000s. * BUGFIX: vmagent: properly log errors when `-promscrape.streamParse` command-line flag is set. See https://github.com/VictoriaMetrics/VictoriaMetrics/pull/1009 * BUGFIX: vmagent: properly suppress errors when both `-promscrape.suppressScrapeErrors` and `-promscrape.streamParse` command-line flags are set. See https://github.com/VictoriaMetrics/VictoriaMetrics/pull/1009 . * BUGFIX: vmalert: return non-empty result in template func `query` stub to pass validation. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/989 . -* FEATURE: provide a sample list of alerting rules for VictoriaMetrics components. It is available [here](https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/deployment/docker/alerts.yml). -* FEATURE: disable final merge for data for the previous month at the beginning of new month, since it may result in high disk IO and CPU usage. Final merge can be enabled by setting `-finalMergeDelay` command-line flag to positive duration. - # [v1.51.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.51.0) diff --git a/docs/MetricsQL.md b/docs/MetricsQL.md index 8aff6a92f..b26c5f4f9 100644 --- a/docs/MetricsQL.md +++ b/docs/MetricsQL.md @@ -127,6 +127,8 @@ This functionality can be tried at [an editable Grafana dashboard](http://play-g - `count_ne_over_time(m[d], N)` - returns the number of raw samples for `m` over `d` with values not equal to `N`. - `tmin_over_time(m[d])` - returns timestamp for the minimum value for `m` over `d` time range. - `tmax_over_time(m[d])` - returns timestamp for the maximum value for `m` over `d` time range. +- `tfirst_over_time(m[d])` - returns timestamp for the first sample for `m` over `d` time range. +- `tlast_over_time(m[d])` - returns timestamp for the last sample for `m` over `d` time range. - `aggr_over_time(("aggr_func1", "aggr_func2", ...), m[d])` - simultaneously calculates all the listed `aggr_func*` for `m` over `d` time range. `aggr_func*` can contain any functions that accept range vector. For instance, `aggr_over_time(("min_over_time", "max_over_time", "rate"), m[d])` would calculate `min_over_time`, `max_over_time` and `rate` for `m[d]`. diff --git a/go.mod b/go.mod index 6a1f20561..52c92b999 100644 --- a/go.mod +++ b/go.mod @@ -9,7 +9,7 @@ require ( // like https://github.com/valyala/fasthttp/commit/996610f021ff45fdc98c2ce7884d5fa4e7f9199b github.com/VictoriaMetrics/fasthttp v1.0.11 github.com/VictoriaMetrics/metrics v1.12.3 - github.com/VictoriaMetrics/metricsql v0.9.1 + github.com/VictoriaMetrics/metricsql v0.9.2 github.com/aws/aws-sdk-go v1.36.23 github.com/cespare/xxhash/v2 v2.1.1 github.com/golang/snappy v0.0.2 diff --git a/go.sum b/go.sum index 1d48c9e86..0c736ca10 100644 --- a/go.sum +++ b/go.sum @@ -46,8 +46,8 @@ github.com/VictoriaMetrics/fasthttp v1.0.11/go.mod h1:3SeUL4zwB/p/a9aEeRc6gdlbrt github.com/VictoriaMetrics/metrics v1.12.2/go.mod h1:Z1tSfPfngDn12bTfZSCqArT3OPY3u88J12hSoOhuiRE= github.com/VictoriaMetrics/metrics v1.12.3 h1:Fe6JHC6MSEKa+BtLhPN8WIvS+HKPzMc2evEpNeCGy7I= github.com/VictoriaMetrics/metrics v1.12.3/go.mod h1:Z1tSfPfngDn12bTfZSCqArT3OPY3u88J12hSoOhuiRE= -github.com/VictoriaMetrics/metricsql v0.9.1 h1:CVl9fSW4pGhv7r9Q54zBPVVIGmwpAWvfo0QybVv+TV8= -github.com/VictoriaMetrics/metricsql v0.9.1/go.mod h1:ylO7YITho/Iw6P71oEaGyHbO94bGoGtzWfLGqFhMIg8= +github.com/VictoriaMetrics/metricsql v0.9.2 h1:16emP9IXVUrY6aai3P+AFakGJ92rCDomD7uCy1fToo0= +github.com/VictoriaMetrics/metricsql v0.9.2/go.mod h1:ylO7YITho/Iw6P71oEaGyHbO94bGoGtzWfLGqFhMIg8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y= diff --git a/vendor/github.com/VictoriaMetrics/metricsql/rollup.go b/vendor/github.com/VictoriaMetrics/metricsql/rollup.go index 33b0827f3..80cfe58f9 100644 --- a/vendor/github.com/VictoriaMetrics/metricsql/rollup.go +++ b/vendor/github.com/VictoriaMetrics/metricsql/rollup.go @@ -45,6 +45,8 @@ var rollupFuncs = map[string]bool{ "scrape_interval": true, "tmin_over_time": true, "tmax_over_time": true, + "tfirst_over_time": true, + "tlast_over_time": true, "share_le_over_time": true, "share_gt_over_time": true, "count_le_over_time": true, diff --git a/vendor/modules.txt b/vendor/modules.txt index 4c80dec6f..af5f5b173 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -16,7 +16,7 @@ github.com/VictoriaMetrics/fasthttp/fasthttputil github.com/VictoriaMetrics/fasthttp/stackless # github.com/VictoriaMetrics/metrics v1.12.3 github.com/VictoriaMetrics/metrics -# github.com/VictoriaMetrics/metricsql v0.9.1 +# github.com/VictoriaMetrics/metricsql v0.9.2 github.com/VictoriaMetrics/metricsql github.com/VictoriaMetrics/metricsql/binaryop # github.com/aws/aws-sdk-go v1.36.23