Browse Source

benchmark: return time series with missing periods filled in

Gyu-Ho Lee 9 years ago
parent
commit
2aab6ff2eb
2 changed files with 60 additions and 3 deletions
  1. 29 3
      tools/benchmark/cmd/timeseries.go
  2. 31 0
      tools/benchmark/cmd/timeseries_test.go

+ 29 - 3
tools/benchmark/cmd/timeseries.go

@@ -19,6 +19,7 @@ import (
 	"encoding/csv"
 	"encoding/csv"
 	"fmt"
 	"fmt"
 	"log"
 	"log"
+	"math"
 	"sort"
 	"sort"
 	"sync"
 	"sync"
 	"time"
 	"time"
@@ -68,16 +69,41 @@ func (sp *secondPoints) getTimeSeries() TimeSeries {
 	sp.mu.Lock()
 	sp.mu.Lock()
 	defer sp.mu.Unlock()
 	defer sp.mu.Unlock()
 
 
-	tslice := make(TimeSeries, len(sp.tm))
-	i := 0
+	var (
+		minTs int64 = math.MaxInt64
+		maxTs int64 = -1
+	)
+	for k := range sp.tm {
+		if minTs > k {
+			minTs = k
+		}
+		if maxTs < k {
+			maxTs = k
+		}
+	}
+	for ti := minTs; ti < maxTs; ti++ {
+		if _, ok := sp.tm[ti]; !ok { // fill-in empties
+			sp.tm[ti] = secondPoint{totalLatency: 0, count: 0}
+		}
+	}
+
+	var (
+		tslice = make(TimeSeries, len(sp.tm))
+		i      int
+	)
 	for k, v := range sp.tm {
 	for k, v := range sp.tm {
+		var lat time.Duration
+		if v.count > 0 {
+			lat = time.Duration(v.totalLatency) / time.Duration(v.count)
+		}
 		tslice[i] = timeSeries{
 		tslice[i] = timeSeries{
 			timestamp:  k,
 			timestamp:  k,
-			avgLatency: time.Duration(v.totalLatency) / time.Duration(v.count),
+			avgLatency: lat,
 			throughPut: v.count,
 			throughPut: v.count,
 		}
 		}
 		i++
 		i++
 	}
 	}
+
 	sort.Sort(tslice)
 	sort.Sort(tslice)
 	return tslice
 	return tslice
 }
 }

+ 31 - 0
tools/benchmark/cmd/timeseries_test.go

@@ -0,0 +1,31 @@
+// Copyright 2016 CoreOS, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package cmd
+
+import (
+	"testing"
+	"time"
+)
+
+func TestGetTimeseries(t *testing.T) {
+	sp := newSecondPoints()
+	now := time.Now()
+	sp.Add(now, time.Second)
+	sp.Add(now.Add(5*time.Second), time.Second)
+	n := sp.getTimeSeries().Len()
+	if n < 3 {
+		t.Fatalf("expected at 6 points of time series, got %s", sp.getTimeSeries())
+	}
+}