From e3e65524b6315a3fd4240dcebdc36d578db80ada Mon Sep 17 00:00:00 2001 From: Rohit Jnagal Date: Thu, 26 Feb 2015 23:57:24 +0000 Subject: [PATCH] Handle dynamic housekeeping in derived stats. Use timestamps instead of sample counts for generating summary. --- summary/summary.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/summary/summary.go b/summary/summary.go index 8a443b29..2adfbcb4 100644 --- a/summary/summary.go +++ b/summary/summary.go @@ -68,11 +68,21 @@ func (s *StatsSummary) AddSample(stat info.ContainerStats) error { s.secondSamples = append(s.secondSamples, &sample) s.updateLatestUsage() // TODO(jnagal): Use 'available' to avoid unnecessary computation. - if len(s.secondSamples) == 60 { - // Make a minute stat. + numSamples := len(s.secondSamples) + elapsed := time.Nanosecond + if numSamples > 1 { + start := s.secondSamples[0].Timestamp + end := s.secondSamples[numSamples-1].Timestamp + elapsed = end.Sub(start) + } + if elapsed > 60*time.Second { + // Make a minute sample. This works with dynamic housekeeping as long + // as we keep max dynamic houskeeping period close to a minute. minuteSample := GetMinutePercentiles(s.secondSamples) - // clear seconds samples. - s.secondSamples = s.secondSamples[:0] + // Clear seconds samples. Keep the latest sample for continuity. + // Copying and resizing helps avoid slice re-allocation. + s.secondSamples[0] = s.secondSamples[numSamples-1] + s.secondSamples = s.secondSamples[:1] s.minuteSamples.Add(minuteSample) err := s.updateDerivedStats() if err != nil {