|
17 | 17 | package summary |
18 | 18 |
|
19 | 19 | import ( |
| 20 | + "fmt" |
20 | 21 | "math" |
21 | 22 | "sort" |
22 | 23 |
|
@@ -147,23 +148,31 @@ func getPercentComplete(stats []*secondSample) (percent int32) { |
147 | 148 | return |
148 | 149 | } |
149 | 150 |
|
| 151 | +// Calculate cpurate from two consecutive total cpu usage samples. |
| 152 | +func getCpuRate(latest, previous secondSample) (uint64, error) { |
| 153 | + var elapsed int64 |
| 154 | + elapsed = latest.Timestamp.Sub(previous.Timestamp).Nanoseconds() |
| 155 | + if elapsed < 10*milliSecondsToNanoSeconds { |
| 156 | + return 0, fmt.Errorf("elapsed time too small: %d ns: time now %s last %s", elapsed, latest.Timestamp.String(), previous.Timestamp.String()) |
| 157 | + } |
| 158 | + if latest.Cpu < previous.Cpu { |
| 159 | + return 0, fmt.Errorf("bad sample: cumulative cpu usage dropped from %d to %d", latest.Cpu, previous.Cpu) |
| 160 | + } |
| 161 | + // Cpurate is calculated in cpu-milliseconds per second. |
| 162 | + cpuRate := (latest.Cpu - previous.Cpu) * secondsToMilliSeconds / uint64(elapsed) |
| 163 | + return cpuRate, nil |
| 164 | +} |
| 165 | + |
150 | 166 | // Returns a percentile sample for a minute by aggregating seconds samples. |
151 | 167 | func GetMinutePercentiles(stats []*secondSample) info.Usage { |
152 | 168 | lastSample := secondSample{} |
153 | 169 | cpu := NewResource(len(stats)) |
154 | 170 | memory := NewResource(len(stats)) |
155 | 171 | for _, stat := range stats { |
156 | | - var elapsed int64 |
157 | 172 | if !lastSample.Timestamp.IsZero() { |
158 | | - elapsed = stat.Timestamp.Sub(lastSample.Timestamp).Nanoseconds() |
159 | | - if elapsed < 10*milliSecondsToNanoSeconds { |
160 | | - glog.Infof("Elapsed time too small: %d ns: time now %s last %s", elapsed, stat.Timestamp.String(), lastSample.Timestamp.String()) |
161 | | - continue |
162 | | - } |
163 | | - glog.V(2).Infof("Read sample: cpu %d, memory %d", stat.Cpu, memory) |
164 | | - cpuRate := (stat.Cpu - lastSample.Cpu) * secondsToMilliSeconds / uint64(elapsed) |
165 | | - if cpuRate < 0 { |
166 | | - glog.Infof("cpu rate too small: %f ns", cpuRate) |
| 173 | + cpuRate, err := getCpuRate(*stat, lastSample) |
| 174 | + if err != nil { |
| 175 | + glog.V(2).Infof("Skipping sample, %v", err) |
167 | 176 | continue |
168 | 177 | } |
169 | 178 | glog.V(2).Infof("Adding cpu rate sample : %d", cpuRate) |
|
0 commit comments