Skip to content

Commit

Permalink
Merge pull request kubernetes#113 from monnand/zero-means-zero
Browse files Browse the repository at this point in the history
Retrieve 0 stats/samples when user asked for zero stats/samples
  • Loading branch information
vmarmol committed Jul 24, 2014
2 parents 6213f8b + 9401d35 commit ebfdf83
Show file tree
Hide file tree
Showing 10 changed files with 101 additions and 31 deletions.
5 changes: 5 additions & 0 deletions api/handler.go
Expand Up @@ -71,6 +71,11 @@ func HandleRequest(m manager.Manager, w http.ResponseWriter, r *http.Request) er
log.Printf("Api - Container(%s)", containerName)

var query info.ContainerInfoRequest

// If a user does not specify number of stats/samples he wants,
// it's 64 by default
query.NumStats = 64
query.NumSamples = 64
decoder := json.NewDecoder(r.Body)
err := decoder.Decode(&query)
if err != nil && err != io.EOF {
Expand Down
2 changes: 1 addition & 1 deletion client/client_test.go
Expand Up @@ -96,7 +96,7 @@ func TestGetContainerInfo(t *testing.T) {
NumStats: 3,
NumSamples: 2,
CpuUsagePercentiles: []int{10, 50, 90},
MemoryUsagePercentages: []int{10, 80, 90},
MemoryUsagePercentiles: []int{10, 80, 90},
}
containerName := "/some/container"
cinfo := itest.GenerateRandomContainerInfo(containerName, 4, query, 1*time.Second)
Expand Down
22 changes: 1 addition & 21 deletions info/container.go
Expand Up @@ -69,27 +69,7 @@ type ContainerInfoRequest struct {
// Different percentiles of CPU usage within a period. The values must be within [0, 100]
CpuUsagePercentiles []int `json:"cpu_usage_percentiles,omitempty"`
// Different percentiles of memory usage within a period. The values must be within [0, 100]
MemoryUsagePercentages []int `json:"memory_usage_percentiles,omitempty"`
}

func (self *ContainerInfoRequest) FillDefaults() *ContainerInfoRequest {
ret := self
if ret == nil {
ret = new(ContainerInfoRequest)
}
if ret.NumStats <= 0 {
ret.NumStats = 1024
}
if ret.NumSamples <= 0 {
ret.NumSamples = 1024
}
if len(ret.CpuUsagePercentiles) == 0 {
ret.CpuUsagePercentiles = []int{50, 80, 90, 99}
}
if len(ret.MemoryUsagePercentages) == 0 {
ret.MemoryUsagePercentages = []int{50, 80, 90, 99}
}
return ret
MemoryUsagePercentiles []int `json:"memory_usage_percentiles,omitempty"`
}

type ContainerInfo struct {
Expand Down
4 changes: 2 additions & 2 deletions info/test/datagen.go
Expand Up @@ -83,8 +83,8 @@ func GenerateRandomContainerInfo(containerName string, numCores int, query *info
percentile := info.Percentile{p, uint64(rand.Int63n(1000))}
cpuPercentiles = append(cpuPercentiles, percentile)
}
memPercentiles := make([]info.Percentile, 0, len(query.MemoryUsagePercentages))
for _, p := range query.MemoryUsagePercentages {
memPercentiles := make([]info.Percentile, 0, len(query.MemoryUsagePercentiles))
for _, p := range query.MemoryUsagePercentiles {
percentile := info.Percentile{p, uint64(rand.Int63n(1000))}
memPercentiles = append(memPercentiles, percentile)
}
Expand Down
3 changes: 1 addition & 2 deletions manager/manager.go
Expand Up @@ -130,11 +130,10 @@ func (m *manager) GetContainerInfo(containerName string, query *info.ContainerIn
var percentiles *info.ContainerStatsPercentiles
var samples []*info.ContainerStatsSample
var stats []*info.ContainerStats
query = query.FillDefaults()
percentiles, err = m.storageDriver.Percentiles(
cinfo.Name,
query.CpuUsagePercentiles,
query.MemoryUsagePercentages,
query.MemoryUsagePercentiles,
)
if err != nil {
return nil, err
Expand Down
14 changes: 9 additions & 5 deletions manager/manager_test.go
Expand Up @@ -81,7 +81,7 @@ func TestGetContainerInfo(t *testing.T) {
NumStats: 256,
NumSamples: 128,
CpuUsagePercentiles: []int{10, 50, 90},
MemoryUsagePercentages: []int{10, 80, 90},
MemoryUsagePercentiles: []int{10, 80, 90},
}

infosMap := make(map[string]*info.ContainerInfo, len(containers))
Expand All @@ -105,7 +105,7 @@ func TestGetContainerInfo(t *testing.T) {
"Percentiles",
h.Name,
query.CpuUsagePercentiles,
query.MemoryUsagePercentages,
query.MemoryUsagePercentiles,
).Return(
percentiles,
nil,
Expand Down Expand Up @@ -169,8 +169,12 @@ func TestGetContainerInfoWithDefaultValue(t *testing.T) {
"/c2",
}

var query *info.ContainerInfoRequest
query = query.FillDefaults()
query := &info.ContainerInfoRequest{
NumStats: 64,
NumSamples: 64,
CpuUsagePercentiles: []int{50, 80, 90},
MemoryUsagePercentiles: []int{50, 80, 90},
}

infosMap := make(map[string]*info.ContainerInfo, len(containers))
handlerMap := make(map[string]*container.MockContainerHandler, len(containers))
Expand All @@ -193,7 +197,7 @@ func TestGetContainerInfoWithDefaultValue(t *testing.T) {
"Percentiles",
h.Name,
query.CpuUsagePercentiles,
query.MemoryUsagePercentages,
query.MemoryUsagePercentiles,
).Return(
percentiles,
nil,
Expand Down
6 changes: 6 additions & 0 deletions storage/influxdb/influxdb.go
Expand Up @@ -320,6 +320,9 @@ func (self *influxdbStorage) AddStats(ref info.ContainerReference, stats *info.C
}

func (self *influxdbStorage) RecentStats(containerName string, numStats int) ([]*info.ContainerStats, error) {
if numStats == 0 {
return nil, nil
}
// TODO(dengnan): select only columns that we need
// TODO(dengnan): escape names
query := fmt.Sprintf("select * from %v where %v='%v' and %v='%v'", self.tableName, colContainerName, containerName, colMachineName, self.machineName)
Expand Down Expand Up @@ -352,6 +355,9 @@ func (self *influxdbStorage) RecentStats(containerName string, numStats int) ([]
}

func (self *influxdbStorage) Samples(containerName string, numSamples int) ([]*info.ContainerStatsSample, error) {
if numSamples == 0 {
return nil, nil
}
// TODO(dengnan): select only columns that we need
// TODO(dengnan): escape names
query := fmt.Sprintf("select * from %v where %v='%v' and %v='%v'", self.tableName, colContainerName, containerName, colMachineName, self.machineName)
Expand Down
10 changes: 10 additions & 0 deletions storage/influxdb/influxdb_test.go
Expand Up @@ -146,3 +146,13 @@ func TestPercentilesWithoutStats(t *testing.T) {
t.SkipNow()
runStorageTest(test.StorageDriverTestPercentilesWithoutStats, t)
}

func TestRetrieveZeroStats(t *testing.T) {
t.SkipNow()
runStorageTest(test.StorageDriverTestRetrieveZeroRecentStats, t)
}

func TestRetrieveZeroSamples(t *testing.T) {
t.SkipNow()
runStorageTest(test.StorageDriverTestRetrieveZeroSamples, t)
}
8 changes: 8 additions & 0 deletions storage/memory/memory_test.go
Expand Up @@ -73,3 +73,11 @@ func TestNoSamples(t *testing.T) {
func TestPercentilesWithoutStats(t *testing.T) {
runStorageTest(test.StorageDriverTestPercentilesWithoutStats, t)
}

func TestRetrieveZeroStats(t *testing.T) {
runStorageTest(test.StorageDriverTestRetrieveZeroRecentStats, t)
}

func TestRetrieveZeroSamples(t *testing.T) {
runStorageTest(test.StorageDriverTestRetrieveZeroSamples, t)
}
58 changes: 58 additions & 0 deletions storage/test/storagetests.go
Expand Up @@ -482,3 +482,61 @@ func StorageDriverTestPercentilesWithoutStats(driver storage.StorageDriver, t *t
}
}
}

func StorageDriverTestRetrieveZeroRecentStats(driver storage.StorageDriver, t *testing.T) {
defer driver.Close()
N := 100
memTrace := make([]uint64, N)
cpuTrace := make([]uint64, N)
for i := 0; i < N; i++ {
memTrace[i] = uint64(i + 1)
cpuTrace[i] = uint64(1)
}

ref := info.ContainerReference{
Name: "container",
}

trace := buildTrace(cpuTrace, memTrace, 1*time.Second)

for _, stats := range trace {
driver.AddStats(ref, stats)
}

recentStats, err := driver.RecentStats(ref.Name, 0)
if err != nil {
t.Fatal(err)
}
if len(recentStats) > 0 {
t.Errorf("RecentStats() returns %v stats when requests for 0 stats", len(recentStats))
}
}

func StorageDriverTestRetrieveZeroSamples(driver storage.StorageDriver, t *testing.T) {
defer driver.Close()
N := 100
memTrace := make([]uint64, N)
cpuTrace := make([]uint64, N)
for i := 0; i < N; i++ {
memTrace[i] = uint64(i + 1)
cpuTrace[i] = uint64(1)
}

ref := info.ContainerReference{
Name: "container",
}

trace := buildTrace(cpuTrace, memTrace, 1*time.Second)

for _, stats := range trace {
driver.AddStats(ref, stats)
}

samples, err := driver.Samples(ref.Name, 0)
if err != nil {
t.Fatal(err)
}
if len(samples) > 0 {
t.Errorf("RecentStats() returns %v stats when requests for 0 stats", len(samples))
}
}

0 comments on commit ebfdf83

Please sign in to comment.