app/vmselect/promql: return NaN from count() over zero time series

This aligns `count` behavior with Prometheus.
This commit is contained in:
Aliaksandr Valialkin 2019-07-25 22:02:03 +03:00
parent 0e52357f35
commit aac482517f
4 changed files with 14 additions and 5 deletions

View file

@ -312,7 +312,11 @@ func aggrFuncCount(tss []*timeseries) []*timeseries {
}
count++
}
dst.Values[i] = float64(count)
v := float64(count)
if count == 0 {
v = nan
}
dst.Values[i] = v
}
return tss[:1]
}

View file

@ -348,7 +348,12 @@ func mergeAggrCount(dst, src *incrementalAggrContext) {
}
func finalizeAggrCount(iac *incrementalAggrContext) {
// Nothing to do
dstValues := iac.ts.Values
for i, v := range dstValues {
if v == 0 {
dstValues[i] = nan
}
}
}
func updateAggrSum2(iac *incrementalAggrContext, values []float64) {

View file

@ -81,7 +81,7 @@ func TestIncrementalAggr(t *testing.T) {
})
t.Run("count", func(t *testing.T) {
t.Parallel()
valuesExpected := []float64{6, 0, 5, 5}
valuesExpected := []float64{6, nan, 5, 5}
f("count", valuesExpected)
})
t.Run("sum2", func(t *testing.T) {

View file

@ -2353,10 +2353,10 @@ func TestExecSuccess(t *testing.T) {
})
t.Run(`count(multi-vector)`, func(t *testing.T) {
t.Parallel()
q := `count(label_set(10, "foo", "bar") or label_set((15-time()/100)^0.5, "baz", "sss"))`
q := `count(label_set(time()<1500, "foo", "bar") or label_set(time()<1800, "baz", "sss"))`
r := netstorage.Result{
MetricName: metricNameExpected,
Values: []float64{2, 2, 2, 1, 1, 1},
Values: []float64{2, 2, 2, 1, nan, nan},
Timestamps: timestampsExpected,
}
resultExpected := []netstorage.Result{r}