mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
app/vmselect/promql: add tfirst_over_time(m[d])
and tlast_over_time(m[d])
MetricsQL functions for returning timestamps for the first and the last samples in m
over d
This commit is contained in:
parent
f5d52b51f1
commit
1837f2f7d3
8 changed files with 46 additions and 22 deletions
|
@ -60,6 +60,8 @@ var rollupFuncs = map[string]newRollupFunc{
|
||||||
"scrape_interval": newRollupFuncOneArg(rollupScrapeInterval),
|
"scrape_interval": newRollupFuncOneArg(rollupScrapeInterval),
|
||||||
"tmin_over_time": newRollupFuncOneArg(rollupTmin),
|
"tmin_over_time": newRollupFuncOneArg(rollupTmin),
|
||||||
"tmax_over_time": newRollupFuncOneArg(rollupTmax),
|
"tmax_over_time": newRollupFuncOneArg(rollupTmax),
|
||||||
|
"tfirst_over_time": newRollupFuncOneArg(rollupTfirst),
|
||||||
|
"tlast_over_time": newRollupFuncOneArg(rollupTlast),
|
||||||
"share_le_over_time": newRollupShareLE,
|
"share_le_over_time": newRollupShareLE,
|
||||||
"share_gt_over_time": newRollupShareGT,
|
"share_gt_over_time": newRollupShareGT,
|
||||||
"count_le_over_time": newRollupCountLE,
|
"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
|
// `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.
|
// in order to properly handle offset and timestamps unaligned to the current step.
|
||||||
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/415 for details.
|
// See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/415 for details.
|
||||||
"timestamp": newRollupFuncOneArg(rollupTimestamp),
|
"timestamp": newRollupFuncOneArg(rollupTlast),
|
||||||
|
|
||||||
// See https://en.wikipedia.org/wiki/Mode_(statistics)
|
// See https://en.wikipedia.org/wiki/Mode_(statistics)
|
||||||
"mode_over_time": newRollupFuncOneArg(rollupModeOverTime),
|
"mode_over_time": newRollupFuncOneArg(rollupModeOverTime),
|
||||||
|
@ -128,10 +130,12 @@ var rollupAggrFuncs = map[string]rollupFunc{
|
||||||
"scrape_interval": rollupScrapeInterval,
|
"scrape_interval": rollupScrapeInterval,
|
||||||
"tmin_over_time": rollupTmin,
|
"tmin_over_time": rollupTmin,
|
||||||
"tmax_over_time": rollupTmax,
|
"tmax_over_time": rollupTmax,
|
||||||
|
"tfirst_over_time": rollupTfirst,
|
||||||
|
"tlast_over_time": rollupTlast,
|
||||||
"ascent_over_time": rollupAscentOverTime,
|
"ascent_over_time": rollupAscentOverTime,
|
||||||
"descent_over_time": rollupDescentOverTime,
|
"descent_over_time": rollupDescentOverTime,
|
||||||
"zscore_over_time": rollupZScoreOverTime,
|
"zscore_over_time": rollupZScoreOverTime,
|
||||||
"timestamp": rollupTimestamp,
|
"timestamp": rollupTlast,
|
||||||
"mode_over_time": rollupModeOverTime,
|
"mode_over_time": rollupModeOverTime,
|
||||||
"rate_over_sum": rollupRateOverSum,
|
"rate_over_sum": rollupRateOverSum,
|
||||||
}
|
}
|
||||||
|
@ -1167,6 +1171,32 @@ func rollupTmax(rfa *rollupFuncArg) float64 {
|
||||||
return float64(maxTimestamp) / 1e3
|
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 {
|
func rollupSum(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.
|
||||||
|
@ -1662,19 +1692,6 @@ func rollupLow(rfa *rollupFuncArg) float64 {
|
||||||
return min
|
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 {
|
func rollupModeOverTime(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.
|
||||||
|
|
|
@ -461,6 +461,8 @@ func TestRollupNewRollupFuncSuccess(t *testing.T) {
|
||||||
f("max_over_time", 123)
|
f("max_over_time", 123)
|
||||||
f("tmin_over_time", 0.08)
|
f("tmin_over_time", 0.08)
|
||||||
f("tmax_over_time", 0.005)
|
f("tmax_over_time", 0.005)
|
||||||
|
f("tfirst_over_time", 0.005)
|
||||||
|
f("tlast_over_time", 0.13)
|
||||||
f("sum_over_time", 565)
|
f("sum_over_time", 565)
|
||||||
f("sum2_over_time", 37951)
|
f("sum2_over_time", 37951)
|
||||||
f("geomean_over_time", 39.33466603189148)
|
f("geomean_over_time", 39.33466603189148)
|
||||||
|
|
|
@ -2,15 +2,16 @@
|
||||||
|
|
||||||
# tip
|
# 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: 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 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 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: 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 .
|
* 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)
|
# [v1.51.0](https://github.com/VictoriaMetrics/VictoriaMetrics/releases/tag/v1.51.0)
|
||||||
|
|
||||||
|
|
|
@ -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`.
|
- `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.
|
- `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.
|
- `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_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])`
|
`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]`.
|
would calculate `min_over_time`, `max_over_time` and `rate` for `m[d]`.
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -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.11
|
github.com/VictoriaMetrics/fasthttp v1.0.11
|
||||||
github.com/VictoriaMetrics/metrics v1.12.3
|
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/aws/aws-sdk-go v1.36.23
|
||||||
github.com/cespare/xxhash/v2 v2.1.1
|
github.com/cespare/xxhash/v2 v2.1.1
|
||||||
github.com/golang/snappy v0.0.2
|
github.com/golang/snappy v0.0.2
|
||||||
|
|
4
go.sum
4
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.2/go.mod h1:Z1tSfPfngDn12bTfZSCqArT3OPY3u88J12hSoOhuiRE=
|
||||||
github.com/VictoriaMetrics/metrics v1.12.3 h1:Fe6JHC6MSEKa+BtLhPN8WIvS+HKPzMc2evEpNeCGy7I=
|
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/metrics v1.12.3/go.mod h1:Z1tSfPfngDn12bTfZSCqArT3OPY3u88J12hSoOhuiRE=
|
||||||
github.com/VictoriaMetrics/metricsql v0.9.1 h1:CVl9fSW4pGhv7r9Q54zBPVVIGmwpAWvfo0QybVv+TV8=
|
github.com/VictoriaMetrics/metricsql v0.9.2 h1:16emP9IXVUrY6aai3P+AFakGJ92rCDomD7uCy1fToo0=
|
||||||
github.com/VictoriaMetrics/metricsql v0.9.1/go.mod h1:ylO7YITho/Iw6P71oEaGyHbO94bGoGtzWfLGqFhMIg8=
|
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 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8=
|
||||||
github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM=
|
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=
|
github.com/andybalholm/brotli v1.0.0/go.mod h1:loMXtMfwqflxFJPmdbJO0a3KNoPuLBgiu3qAvBg8x/Y=
|
||||||
|
|
2
vendor/github.com/VictoriaMetrics/metricsql/rollup.go
generated
vendored
2
vendor/github.com/VictoriaMetrics/metricsql/rollup.go
generated
vendored
|
@ -45,6 +45,8 @@ var rollupFuncs = map[string]bool{
|
||||||
"scrape_interval": true,
|
"scrape_interval": true,
|
||||||
"tmin_over_time": true,
|
"tmin_over_time": true,
|
||||||
"tmax_over_time": true,
|
"tmax_over_time": true,
|
||||||
|
"tfirst_over_time": true,
|
||||||
|
"tlast_over_time": true,
|
||||||
"share_le_over_time": true,
|
"share_le_over_time": true,
|
||||||
"share_gt_over_time": true,
|
"share_gt_over_time": true,
|
||||||
"count_le_over_time": true,
|
"count_le_over_time": true,
|
||||||
|
|
2
vendor/modules.txt
vendored
2
vendor/modules.txt
vendored
|
@ -16,7 +16,7 @@ github.com/VictoriaMetrics/fasthttp/fasthttputil
|
||||||
github.com/VictoriaMetrics/fasthttp/stackless
|
github.com/VictoriaMetrics/fasthttp/stackless
|
||||||
# github.com/VictoriaMetrics/metrics v1.12.3
|
# github.com/VictoriaMetrics/metrics v1.12.3
|
||||||
github.com/VictoriaMetrics/metrics
|
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
|
||||||
github.com/VictoriaMetrics/metricsql/binaryop
|
github.com/VictoriaMetrics/metricsql/binaryop
|
||||||
# github.com/aws/aws-sdk-go v1.36.23
|
# github.com/aws/aws-sdk-go v1.36.23
|
||||||
|
|
Loading…
Reference in a new issue