소스 검색

Zero out stats values in the cli

Based on some feedback, when you have a container via the cli that you
are monitoring for stats, if you stop the container it will stay in the
display but report the last datapoint that was received.

This PR changes the display to zero out the values for containers where
an update has not been received within a specified duration, i.e. 2
seconds.  This signals the user that the container has stopped as it
reports cpu and memory usage of 0.

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
Michael Crosby 10 년 전
부모
커밋
bbc38497b6
1개의 변경된 파일43개의 추가작업 그리고 23개의 파일을 삭제
  1. 43 23
      api/client/commands.go

+ 43 - 23
api/client/commands.go

@@ -2641,34 +2641,54 @@ func (s *containerStats) Collect(stream io.ReadCloser) {
 		previousSystem uint64
 		start          = true
 		dec            = json.NewDecoder(stream)
+		u              = make(chan error, 1)
 	)
+	go func() {
+		for {
+			var v *stats.Stats
+			if err := dec.Decode(&v); err != nil {
+				u <- err
+				return
+			}
+			var (
+				memPercent = float64(v.MemoryStats.Usage) / float64(v.MemoryStats.Limit) * 100.0
+				cpuPercent = 0.0
+			)
+			if !start {
+				cpuPercent = calcuateCpuPercent(previousCpu, previousSystem, v)
+			}
+			start = false
+			s.mu.Lock()
+			s.CpuPercentage = cpuPercent
+			s.Memory = float64(v.MemoryStats.Usage)
+			s.MemoryLimit = float64(v.MemoryStats.Limit)
+			s.MemoryPercentage = memPercent
+			s.NetworkRx = float64(v.Network.RxBytes)
+			s.NetworkTx = float64(v.Network.TxBytes)
+			s.mu.Unlock()
+			previousCpu = v.CpuStats.CpuUsage.TotalUsage
+			previousSystem = v.CpuStats.SystemUsage
+			u <- nil
+		}
+	}()
 	for {
-		var v *stats.Stats
-		if err := dec.Decode(&v); err != nil {
+		select {
+		case <-time.After(2 * time.Second):
+			// zero out the values if we have not received an update within
+			// the specified duration.
 			s.mu.Lock()
-			s.err = err
+			s.CpuPercentage = 0
+			s.Memory = 0
+			s.MemoryPercentage = 0
 			s.mu.Unlock()
-			return
+		case err := <-u:
+			if err != nil {
+				s.mu.Lock()
+				s.err = err
+				s.mu.Unlock()
+				return
+			}
 		}
-		var (
-			memPercent = float64(v.MemoryStats.Usage) / float64(v.MemoryStats.Limit) * 100.0
-			cpuPercent = 0.0
-		)
-		if !start {
-			cpuPercent = calcuateCpuPercent(previousCpu, previousSystem, v)
-		}
-		start = false
-		s.mu.Lock()
-		s.CpuPercentage = cpuPercent
-		s.Memory = float64(v.MemoryStats.Usage)
-		s.MemoryLimit = float64(v.MemoryStats.Limit)
-		s.MemoryPercentage = memPercent
-		s.NetworkRx = float64(v.Network.RxBytes)
-		s.NetworkTx = float64(v.Network.TxBytes)
-		s.mu.Unlock()
-
-		previousCpu = v.CpuStats.CpuUsage.TotalUsage
-		previousSystem = v.CpuStats.SystemUsage
 	}
 }