mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-12-11 14:53:49 +00:00
vmalert: fix replay step param (#3428)
The recent change in modifying default value of `datasource.queryStep` flag resulted in situation where replay mode was always running queries with step=`datasource.queryStep`. When it should always use rule's evaluation interval. The fix is related not to replay mode only, but for all Range requests. Now step param is set individually for each mode. Signed-off-by: hagen1778 <roman@victoriametrics.com> Signed-off-by: hagen1778 <roman@victoriametrics.com>
This commit is contained in:
parent
8df45575b5
commit
b1c6117a51
3 changed files with 21 additions and 11 deletions
|
@ -149,6 +149,16 @@ func (s *VMStorage) setPrometheusInstantReqParams(r *http.Request, query string,
|
||||||
timestamp = timestamp.Truncate(s.evaluationInterval)
|
timestamp = timestamp.Truncate(s.evaluationInterval)
|
||||||
}
|
}
|
||||||
q.Set("time", fmt.Sprintf("%d", timestamp.Unix()))
|
q.Set("time", fmt.Sprintf("%d", timestamp.Unix()))
|
||||||
|
if s.evaluationInterval > 0 { // set step as evaluationInterval by default
|
||||||
|
// always convert to seconds to keep compatibility with older
|
||||||
|
// Prometheus versions. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1943
|
||||||
|
q.Set("step", fmt.Sprintf("%ds", int(s.evaluationInterval.Seconds())))
|
||||||
|
}
|
||||||
|
if s.queryStep > 0 { // override step with user-specified value
|
||||||
|
// always convert to seconds to keep compatibility with older
|
||||||
|
// Prometheus versions. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1943
|
||||||
|
q.Set("step", fmt.Sprintf("%ds", int(s.queryStep.Seconds())))
|
||||||
|
}
|
||||||
r.URL.RawQuery = q.Encode()
|
r.URL.RawQuery = q.Encode()
|
||||||
s.setPrometheusReqParams(r, query)
|
s.setPrometheusReqParams(r, query)
|
||||||
}
|
}
|
||||||
|
@ -163,6 +173,11 @@ func (s *VMStorage) setPrometheusRangeReqParams(r *http.Request, query string, s
|
||||||
q := r.URL.Query()
|
q := r.URL.Query()
|
||||||
q.Add("start", fmt.Sprintf("%d", start.Unix()))
|
q.Add("start", fmt.Sprintf("%d", start.Unix()))
|
||||||
q.Add("end", fmt.Sprintf("%d", end.Unix()))
|
q.Add("end", fmt.Sprintf("%d", end.Unix()))
|
||||||
|
if s.evaluationInterval > 0 { // set step as evaluationInterval by default
|
||||||
|
// always convert to seconds to keep compatibility with older
|
||||||
|
// Prometheus versions. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1943
|
||||||
|
q.Set("step", fmt.Sprintf("%ds", int(s.evaluationInterval.Seconds())))
|
||||||
|
}
|
||||||
r.URL.RawQuery = q.Encode()
|
r.URL.RawQuery = q.Encode()
|
||||||
s.setPrometheusReqParams(r, query)
|
s.setPrometheusReqParams(r, query)
|
||||||
}
|
}
|
||||||
|
@ -178,15 +193,5 @@ func (s *VMStorage) setPrometheusReqParams(r *http.Request, query string) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
q.Set("query", query)
|
q.Set("query", query)
|
||||||
if s.evaluationInterval > 0 { // set step as evaluationInterval by default
|
|
||||||
// always convert to seconds to keep compatibility with older
|
|
||||||
// Prometheus versions. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1943
|
|
||||||
q.Set("step", fmt.Sprintf("%ds", int(s.evaluationInterval.Seconds())))
|
|
||||||
}
|
|
||||||
if s.queryStep > 0 { // override step with user-specified value
|
|
||||||
// always convert to seconds to keep compatibility with older
|
|
||||||
// Prometheus versions. See https://github.com/VictoriaMetrics/VictoriaMetrics/issues/1943
|
|
||||||
q.Set("step", fmt.Sprintf("%ds", int(s.queryStep.Seconds())))
|
|
||||||
}
|
|
||||||
r.URL.RawQuery = q.Encode()
|
r.URL.RawQuery = q.Encode()
|
||||||
}
|
}
|
||||||
|
|
|
@ -197,6 +197,10 @@ func TestVMRangeQuery(t *testing.T) {
|
||||||
if _, err := strconv.ParseInt(endTS, 10, 64); err != nil {
|
if _, err := strconv.ParseInt(endTS, 10, 64); err != nil {
|
||||||
t.Errorf("failed to parse 'end' query param: %s", err)
|
t.Errorf("failed to parse 'end' query param: %s", err)
|
||||||
}
|
}
|
||||||
|
step := r.URL.Query().Get("step")
|
||||||
|
if step != "15s" {
|
||||||
|
t.Errorf("expected 'step' query param to be 15s; got %q instead", step)
|
||||||
|
}
|
||||||
switch c {
|
switch c {
|
||||||
case 0:
|
case 0:
|
||||||
w.Write([]byte(`{"status":"success","data":{"resultType":"matrix","result":[{"metric":{"__name__":"vm_rows"},"values":[[1583786142,"13763"]]}]}}`))
|
w.Write([]byte(`{"status":"success","data":{"resultType":"matrix","result":[{"metric":{"__name__":"vm_rows"},"values":[[1583786142,"13763"]]}]}}`))
|
||||||
|
@ -210,7 +214,7 @@ func TestVMRangeQuery(t *testing.T) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("unexpected: %s", err)
|
t.Fatalf("unexpected: %s", err)
|
||||||
}
|
}
|
||||||
s := NewVMStorage(srv.URL, authCfg, time.Minute, 0, false, srv.Client())
|
s := NewVMStorage(srv.URL, authCfg, time.Minute, *queryStep, false, srv.Client())
|
||||||
|
|
||||||
p := NewPrometheusType()
|
p := NewPrometheusType()
|
||||||
pq := s.BuildWithParams(QuerierParams{DataSourceType: &p, EvaluationInterval: 15 * time.Second})
|
pq := s.BuildWithParams(QuerierParams{DataSourceType: &p, EvaluationInterval: 15 * time.Second})
|
||||||
|
|
|
@ -15,6 +15,7 @@ The following tip changes can be tested by building VictoriaMetrics components f
|
||||||
|
|
||||||
## v1.79.x long-time support release (LTS)
|
## v1.79.x long-time support release (LTS)
|
||||||
|
|
||||||
|
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): properly specify rule evaluation step during the [replay mode](https://docs.victoriametrics.com/vmalert.html#rules-backfilling). The `step` value was previously overriden by `datasource.queryStep` flag.
|
||||||
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): properly return the error message from remote-write failures. Before, error was ignored and only `vmalert_remotewrite_errors_total` was incremented.
|
* BUGFIX: [vmalert](https://docs.victoriametrics.com/vmalert.html): properly return the error message from remote-write failures. Before, error was ignored and only `vmalert_remotewrite_errors_total` was incremented.
|
||||||
* BUGFIX: [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html): properly return an empty result from [limit_offset](https://docs.victoriametrics.com/MetricsQL.html#limit_offset) if the `offset` arg exceeds the number of inner time series. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3312).
|
* BUGFIX: [MetricsQL](https://docs.victoriametrics.com/MetricsQL.html): properly return an empty result from [limit_offset](https://docs.victoriametrics.com/MetricsQL.html#limit_offset) if the `offset` arg exceeds the number of inner time series. See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3312).
|
||||||
* BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): properly discover GCE zones when `filter` option is set at [gce_sd_configs](https://docs.victoriametrics.com/sd_configs.html#gce_sd_configs). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3202).
|
* BUGFIX: [vmagent](https://docs.victoriametrics.com/vmagent.html): properly discover GCE zones when `filter` option is set at [gce_sd_configs](https://docs.victoriametrics.com/sd_configs.html#gce_sd_configs). See [this issue](https://github.com/VictoriaMetrics/VictoriaMetrics/issues/3202).
|
||||||
|
|
Loading…
Reference in a new issue