mirror of
https://github.com/VictoriaMetrics/VictoriaMetrics.git
synced 2024-11-21 14:44:00 +00:00
app/vmselect: do not return empty time series in /api/v1/query
result
This commit is contained in:
parent
c7034fc51b
commit
b9166a60ff
3 changed files with 21 additions and 6 deletions
|
@ -426,7 +426,7 @@ func QueryHandler(w http.ResponseWriter, r *http.Request) error {
|
||||||
Step: step,
|
Step: step,
|
||||||
Deadline: deadline,
|
Deadline: deadline,
|
||||||
}
|
}
|
||||||
result, err := promql.Exec(&ec, query)
|
result, err := promql.Exec(&ec, query, true)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot execute %q: %s", query, err)
|
return fmt.Errorf("cannot execute %q: %s", query, err)
|
||||||
}
|
}
|
||||||
|
@ -484,7 +484,7 @@ func QueryRangeHandler(w http.ResponseWriter, r *http.Request) error {
|
||||||
Deadline: deadline,
|
Deadline: deadline,
|
||||||
MayCache: mayCache,
|
MayCache: mayCache,
|
||||||
}
|
}
|
||||||
result, err := promql.Exec(&ec, query)
|
result, err := promql.Exec(&ec, query, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("cannot execute %q: %s", query, err)
|
return fmt.Errorf("cannot execute %q: %s", query, err)
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,8 +27,8 @@ func ExpandWithExprs(q string) (string, error) {
|
||||||
return string(buf), nil
|
return string(buf), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Exec executes q for the given ec until the deadline.
|
// Exec executes q for the given ec.
|
||||||
func Exec(ec *EvalConfig, q string) ([]netstorage.Result, error) {
|
func Exec(ec *EvalConfig, q string, isFirstPointOnly bool) ([]netstorage.Result, error) {
|
||||||
if *logSlowQueryDuration > 0 {
|
if *logSlowQueryDuration > 0 {
|
||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
defer func() {
|
defer func() {
|
||||||
|
@ -65,6 +65,14 @@ func Exec(ec *EvalConfig, q string) ([]netstorage.Result, error) {
|
||||||
}
|
}
|
||||||
ec.End -= ec.Step
|
ec.End -= ec.Step
|
||||||
|
|
||||||
|
if isFirstPointOnly {
|
||||||
|
// Remove all the points except the first one from every time series.
|
||||||
|
for _, ts := range rv {
|
||||||
|
ts.Values = ts.Values[:1]
|
||||||
|
ts.Timestamps = ts.Timestamps[:1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
maySort := maySortResults(e, rv)
|
maySort := maySortResults(e, rv)
|
||||||
result, err := timeseriesToResult(rv, maySort)
|
result, err := timeseriesToResult(rv, maySort)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -62,7 +62,7 @@ func TestExecSuccess(t *testing.T) {
|
||||||
Deadline: netstorage.NewDeadline(time.Minute),
|
Deadline: netstorage.NewDeadline(time.Minute),
|
||||||
}
|
}
|
||||||
for i := 0; i < 5; i++ {
|
for i := 0; i < 5; i++ {
|
||||||
result, err := Exec(ec, q)
|
result, err := Exec(ec, q, false)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf(`unexpected error when executing %q: %s`, q, err)
|
t.Fatalf(`unexpected error when executing %q: %s`, q, err)
|
||||||
}
|
}
|
||||||
|
@ -3665,7 +3665,14 @@ func TestExecError(t *testing.T) {
|
||||||
Deadline: netstorage.NewDeadline(time.Minute),
|
Deadline: netstorage.NewDeadline(time.Minute),
|
||||||
}
|
}
|
||||||
for i := 0; i < 4; i++ {
|
for i := 0; i < 4; i++ {
|
||||||
rv, err := Exec(ec, q)
|
rv, err := Exec(ec, q, false)
|
||||||
|
if err == nil {
|
||||||
|
t.Fatalf(`expecting non-nil error on %q`, q)
|
||||||
|
}
|
||||||
|
if rv != nil {
|
||||||
|
t.Fatalf(`expecting nil rv`)
|
||||||
|
}
|
||||||
|
rv, err = Exec(ec, q, true)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
t.Fatalf(`expecting non-nil error on %q`, q)
|
t.Fatalf(`expecting non-nil error on %q`, q)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue