diff --git a/README.md b/README.md index 3ace5755d..ef1c954be 100644 --- a/README.md +++ b/README.md @@ -562,14 +562,17 @@ in front of VictoriaMetrics. [Contact us](mailto:sales@victoriametrics.com) if y VictoriaMetrics accepts relative times in `time`, `start` and `end` query args additionally to unix timestamps and [RFC3339](https://www.ietf.org/rfc/rfc3339.txt). For example, the following query would return data for the last 30 minutes: `/api/v1/query_range?start=-30m&query=...`. +VictoriaMetrics accepts `round_digits` query arg for `/api/v1/query` and `/api/v1/query_range` handlers. It can be used for rounding response values to the given number of digits after the decimal point. For example, `/api/v1/query?query=avg_over_time(temperature[1h])&round_digits=2` would round response values to up to two digits after the decimal point. + By default, VictoriaMetrics returns time series for the last 5 minutes from `/api/v1/series`, while the Prometheus API defaults to all time. Use `start` and `end` to select a different time range. VictoriaMetrics accepts additional args for `/api/v1/labels` and `/api/v1/label/.../values` handlers. -See [this feature request](https://github.com/prometheus/prometheus/issues/6178) for details: * Any number [time series selectors](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors) via `match[]` query arg. * Optional `start` and `end` query args for limiting the time range for the selected labels or label values. +See [this feature request](https://github.com/prometheus/prometheus/issues/6178) for details. + Additionally VictoriaMetrics provides the following handlers: * `/api/v1/series/count` - returns the total number of time series in the database. Some notes: diff --git a/app/vmselect/prometheus/prometheus.go b/app/vmselect/prometheus/prometheus.go index 93f5f3a8c..e9e374333 100644 --- a/app/vmselect/prometheus/prometheus.go +++ b/app/vmselect/prometheus/prometheus.go @@ -1022,6 +1022,7 @@ func QueryHandler(startTime time.Time, w http.ResponseWriter, r *http.Request) e QuotedRemoteAddr: httpserver.GetQuotedRemoteAddr(r), Deadline: deadline, LookbackDelta: lookbackDelta, + RoundDigits: getRoundDigits(r), EnforcedTagFilters: etf, } result, err := promql.Exec(&ec, query, true) @@ -1126,6 +1127,7 @@ func queryRangeHandler(startTime time.Time, w http.ResponseWriter, query string, Deadline: deadline, MayCache: mayCache, LookbackDelta: lookbackDelta, + RoundDigits: getRoundDigits(r), EnforcedTagFilters: etf, } result, err := promql.Exec(&ec, query, false) @@ -1302,6 +1304,18 @@ func getMatchesFromRequest(r *http.Request) []string { return matches } +func getRoundDigits(r *http.Request) int { + s := r.FormValue("round_digits") + if len(s) == 0 { + return 100 + } + n, err := strconv.Atoi(s) + if err != nil { + return 100 + } + return n +} + func getLatencyOffsetMilliseconds() int64 { d := latencyOffset.Milliseconds() if d <= 1000 { diff --git a/app/vmselect/promql/eval.go b/app/vmselect/promql/eval.go index c02b18284..2db1a2f43 100644 --- a/app/vmselect/promql/eval.go +++ b/app/vmselect/promql/eval.go @@ -98,11 +98,14 @@ type EvalConfig struct { // LookbackDelta is analog to `-query.lookback-delta` from Prometheus. LookbackDelta int64 - timestamps []int64 - timestampsOnce sync.Once + // How many decimal digits after the point to leave in response. + RoundDigits int // EnforcedTagFilters used for apply additional label filters to query. EnforcedTagFilters []storage.TagFilter + + timestamps []int64 + timestampsOnce sync.Once } // newEvalConfig returns new EvalConfig copy from src. @@ -114,6 +117,7 @@ func newEvalConfig(src *EvalConfig) *EvalConfig { ec.Deadline = src.Deadline ec.MayCache = src.MayCache ec.LookbackDelta = src.LookbackDelta + ec.RoundDigits = src.RoundDigits ec.EnforcedTagFilters = src.EnforcedTagFilters // do not copy src.timestamps - they must be generated again. diff --git a/app/vmselect/promql/exec.go b/app/vmselect/promql/exec.go index 151f2dbde..25e9953d9 100644 --- a/app/vmselect/promql/exec.go +++ b/app/vmselect/promql/exec.go @@ -12,6 +12,7 @@ import ( "github.com/VictoriaMetrics/VictoriaMetrics/app/vmselect/netstorage" "github.com/VictoriaMetrics/VictoriaMetrics/app/vmselect/querystats" + "github.com/VictoriaMetrics/VictoriaMetrics/lib/decimal" "github.com/VictoriaMetrics/VictoriaMetrics/lib/logger" "github.com/VictoriaMetrics/metrics" "github.com/VictoriaMetrics/metricsql" @@ -72,6 +73,14 @@ func Exec(ec *EvalConfig, q string, isFirstPointOnly bool) ([]netstorage.Result, if err != nil { return nil, err } + if n := ec.RoundDigits; n < 100 { + for i := range result { + values := result[i].Values + for j, v := range values { + values[j] = decimal.RoundToDecimalDigits(v, n) + } + } + } return result, err } diff --git a/docs/CHANGELOG.md b/docs/CHANGELOG.md index 4442b209b..3b0439047 100644 --- a/docs/CHANGELOG.md +++ b/docs/CHANGELOG.md @@ -12,6 +12,7 @@ * FATURE: vmagent: accept `scrape_offset` option at `scrape_config`. This option may be useful when scrapes must start at the specified offset of every scrape interval. See [these docs](https://victoriametrics.github.io/vmagent.html#troubleshooting) for details. * FEATURE: vmagent: support `proxy_tls_config`, `proxy_basic_auth`, `proxy_bearer_token` and `proxy_bearer_token_file` options at `scrape_config` section for configuring proxies specified via `proxy_url`. See [these docs](https://victoriametrics.github.io/vmagent.html#scraping-targets-via-a-proxy). * FEATURE: vmauth: allow using regexp paths in `url_map`. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1112) for details. +* FEATURE: accept `round_digits` query arg at `/api/v1/query` and `/api/v1/query_range` handlers. This option can be set at Prometheus datasource in Grafana for limiting the number of digits after the decimal point in response values. * BUGFIX: vmagent: prevent from high CPU usage bug during failing scrapes with small `scrape_timeout` (less than a few seconds). * BUGFIX: vmagent: reduce memory usage when Kubernetes service discovery is used in big number of distinct scrape config jobs by sharing Kubernetes object cache. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1113 diff --git a/docs/Single-server-VictoriaMetrics.md b/docs/Single-server-VictoriaMetrics.md index 3ace5755d..ef1c954be 100644 --- a/docs/Single-server-VictoriaMetrics.md +++ b/docs/Single-server-VictoriaMetrics.md @@ -562,14 +562,17 @@ in front of VictoriaMetrics. [Contact us](mailto:sales@victoriametrics.com) if y VictoriaMetrics accepts relative times in `time`, `start` and `end` query args additionally to unix timestamps and [RFC3339](https://www.ietf.org/rfc/rfc3339.txt). For example, the following query would return data for the last 30 minutes: `/api/v1/query_range?start=-30m&query=...`. +VictoriaMetrics accepts `round_digits` query arg for `/api/v1/query` and `/api/v1/query_range` handlers. It can be used for rounding response values to the given number of digits after the decimal point. For example, `/api/v1/query?query=avg_over_time(temperature[1h])&round_digits=2` would round response values to up to two digits after the decimal point. + By default, VictoriaMetrics returns time series for the last 5 minutes from `/api/v1/series`, while the Prometheus API defaults to all time. Use `start` and `end` to select a different time range. VictoriaMetrics accepts additional args for `/api/v1/labels` and `/api/v1/label/.../values` handlers. -See [this feature request](https://github.com/prometheus/prometheus/issues/6178) for details: * Any number [time series selectors](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-series-selectors) via `match[]` query arg. * Optional `start` and `end` query args for limiting the time range for the selected labels or label values. +See [this feature request](https://github.com/prometheus/prometheus/issues/6178) for details. + Additionally VictoriaMetrics provides the following handlers: * `/api/v1/series/count` - returns the total number of time series in the database. Some notes: