Skip to content
This repository was archived by the owner on Aug 23, 2023. It is now read-only.

Commit f2fc7f5

Browse files
authored
Merge pull request #928 from bloomberg/feature_fixSummary
Fix summarize function
2 parents b8a7464 + 3af0860 commit f2fc7f5

File tree

3 files changed

+73
-4
lines changed

3 files changed

+73
-4
lines changed

expr/func_summarize.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77
"github.com/grafana/metrictank/api/models"
88
"github.com/grafana/metrictank/batch"
99
"github.com/grafana/metrictank/consolidation"
10-
"github.com/grafana/metrictank/util"
1110
"github.com/raintank/dur"
1211
"gopkg.in/raintank/schema.v1"
1312
)
@@ -87,7 +86,7 @@ func (s *FuncSummarize) Exec(cache map[Req][]models.Series) ([]models.Series, er
8786
func summarizeValues(serie models.Series, aggFunc batch.AggFunc, interval, start, end uint32) []schema.Point {
8887
out := pointSlicePool.Get().([]schema.Point)
8988

90-
numPoints := int(util.Min(uint32(len(serie.Datapoints)), (start-end)/interval))
89+
numPoints := len(serie.Datapoints)
9190

9291
for ts, i := start, 0; i < numPoints && ts < end; ts += interval {
9392
s := i

expr/func_summarize_test.go

+71-1
Original file line numberDiff line numberDiff line change
@@ -665,6 +665,76 @@ func TestSummarizeAlignToFrom(t *testing.T) {
665665
testSummarize("AlignToFrom", input, outputMax[1], "45s", "max", true, t)
666666
}
667667

668+
func TestSummarizeLargeIntervalTimestamps(t *testing.T) {
669+
670+
// This test is specifically testing the timestamp behavior, so we don't need real values.
671+
// However, we do need a lot of datapoints to trigger the bug we are regression testing against.
672+
inputInterval := uint32(10)
673+
numTimestamps := uint32(89*24*60*60) / inputInterval
674+
startTime := uint32(1464637518)
675+
endTime := startTime + numTimestamps*inputInterval
676+
677+
inputDps := make([]schema.Point, 0, numTimestamps)
678+
679+
for i := uint32(0); i < numTimestamps; i++ {
680+
inputDps = append(inputDps, schema.Point{Val: 0, Ts: startTime + i*inputInterval})
681+
}
682+
683+
outputInterval := uint32(30 * 24 * 60 * 60)
684+
685+
// alignToFrom = false - starting timestamp is a multiple of `outputInterval`
686+
unalignedStart := startTime - (startTime % outputInterval)
687+
var unalignedExpected = []schema.Point{
688+
{Val: 0, Ts: unalignedStart},
689+
{Val: 0, Ts: unalignedStart + outputInterval},
690+
{Val: 0, Ts: unalignedStart + 2*outputInterval},
691+
{Val: 0, Ts: unalignedStart + 3*outputInterval},
692+
}
693+
694+
// alignToFrom = true - starting timestamp is unchanged from input
695+
var alignedExpected = []schema.Point{
696+
{Val: 0, Ts: startTime},
697+
{Val: 0, Ts: startTime + outputInterval},
698+
{Val: 0, Ts: startTime + 2*outputInterval},
699+
}
700+
701+
input := []models.Series{
702+
{
703+
Target: "align",
704+
QueryPatt: "align",
705+
QueryFrom: startTime,
706+
QueryTo: endTime,
707+
Interval: inputInterval,
708+
Datapoints: getCopy(inputDps),
709+
},
710+
}
711+
outputSum := [][]models.Series{
712+
{
713+
{
714+
Target: "summarize(align, \"30d\", \"sum\")",
715+
QueryPatt: "summarize(align, \"30d\", \"sum\")",
716+
QueryFrom: startTime,
717+
QueryTo: endTime,
718+
Interval: outputInterval,
719+
Datapoints: getCopy(unalignedExpected),
720+
},
721+
},
722+
{
723+
{
724+
Target: "summarize(align, \"30d\", \"sum\", true)",
725+
QueryPatt: "summarize(align, \"30d\", \"sum\", true)",
726+
QueryFrom: startTime,
727+
QueryTo: endTime,
728+
Interval: outputInterval,
729+
Datapoints: getCopy(alignedExpected),
730+
},
731+
},
732+
}
733+
734+
testSummarize("LongIntervals", input, outputSum[0], "30d", "sum", false, t)
735+
testSummarize("LongIntervals", input, outputSum[1], "30d", "sum", true, t)
736+
}
737+
668738
func testSummarize(name string, in []models.Series, out []models.Series, intervalString, fn string, alignToFrom bool, t *testing.T) {
669739
f := NewSummarize()
670740

@@ -689,7 +759,7 @@ func testSummarize(name string, in []models.Series, out []models.Series, interva
689759
t.Fatalf("case %q (%q, %q, %t): expected target %q, got %q", name, intervalString, fn, alignToFrom, exp.Target, got.Target)
690760
}
691761
if len(got.Datapoints) != len(exp.Datapoints) {
692-
t.Fatalf("case %q (%q, %q, %t): len output expected %#v, got %#v", name, intervalString, fn, alignToFrom, (exp.Datapoints), (got.Datapoints))
762+
t.Fatalf("case %q (%q, %q, %t): len output expected %v, got %v", name, intervalString, fn, alignToFrom, (exp.Datapoints), (got.Datapoints))
693763
}
694764
for j, p := range exp.Datapoints {
695765
bothNaN := math.IsNaN(p.Val) && math.IsNaN(got.Datapoints[j].Val)

expr/funcs.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func init() {
7575
"stddevSeries": {NewAggregateConstructor("stddev", crossSeriesStddev), true},
7676
"sum": {NewAggregateConstructor("sum", crossSeriesSum), true},
7777
"sumSeries": {NewAggregateConstructor("sum", crossSeriesSum), true},
78-
"summarize": {NewSummarize, false},
78+
"summarize": {NewSummarize, true},
7979
"transformNull": {NewTransformNull, true},
8080
}
8181
}

0 commit comments

Comments
 (0)