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++ count++
} }
dst.Values[i] = float64(count) v := float64(count)
if count == 0 {
v = nan
}
dst.Values[i] = v
} }
return tss[:1] return tss[:1]
} }

View file

@ -348,7 +348,12 @@ func mergeAggrCount(dst, src *incrementalAggrContext) {
} }
func finalizeAggrCount(iac *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) { 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.Run("count", func(t *testing.T) {
t.Parallel() t.Parallel()
valuesExpected := []float64{6, 0, 5, 5} valuesExpected := []float64{6, nan, 5, 5}
f("count", valuesExpected) f("count", valuesExpected)
}) })
t.Run("sum2", func(t *testing.T) { 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.Run(`count(multi-vector)`, func(t *testing.T) {
t.Parallel() 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{ r := netstorage.Result{
MetricName: metricNameExpected, MetricName: metricNameExpected,
Values: []float64{2, 2, 2, 1, 1, 1}, Values: []float64{2, 2, 2, 1, nan, nan},
Timestamps: timestampsExpected, Timestamps: timestampsExpected,
} }
resultExpected := []netstorage.Result{r} resultExpected := []netstorage.Result{r}