56 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			56 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
| // Helper functions copied from
 | |
| // https://github.com/docker/cli/blob/master/cli/command/container/stats_helpers.go
 | |
| package docker
 | |
| 
 | |
| import "github.com/docker/docker/api/types"
 | |
| 
 | |
| func CalculateCPUPercentUnix(previousCPU, previousSystem uint64, v *types.StatsJSON) float64 {
 | |
| 	var (
 | |
| 		cpuPercent = 0.0
 | |
| 		// calculate the change for the cpu usage of the container in between readings
 | |
| 		cpuDelta = float64(v.CPUStats.CPUUsage.TotalUsage) - float64(previousCPU)
 | |
| 		// calculate the change for the entire system between readings
 | |
| 		systemDelta = float64(v.CPUStats.SystemUsage) - float64(previousSystem)
 | |
| 		onlineCPUs  = float64(v.CPUStats.OnlineCPUs)
 | |
| 	)
 | |
| 
 | |
| 	if onlineCPUs == 0.0 {
 | |
| 		onlineCPUs = float64(len(v.CPUStats.CPUUsage.PercpuUsage))
 | |
| 	}
 | |
| 	if systemDelta > 0.0 && cpuDelta > 0.0 {
 | |
| 		cpuPercent = (cpuDelta / systemDelta) * onlineCPUs * 100.0
 | |
| 	}
 | |
| 	return cpuPercent
 | |
| }
 | |
| 
 | |
| func calculateCPUPercentWindows(v *types.StatsJSON) float64 {
 | |
| 	// Max number of 100ns intervals between the previous time read and now
 | |
| 	possIntervals := uint64(v.Read.Sub(v.PreRead).Nanoseconds()) // Start with number of ns intervals
 | |
| 	possIntervals /= 100                                         // Convert to number of 100ns intervals
 | |
| 	possIntervals *= uint64(v.NumProcs)                          // Multiple by the number of processors
 | |
| 
 | |
| 	// Intervals used
 | |
| 	intervalsUsed := v.CPUStats.CPUUsage.TotalUsage - v.PreCPUStats.CPUUsage.TotalUsage
 | |
| 
 | |
| 	// Percentage avoiding divide-by-zero
 | |
| 	if possIntervals > 0 {
 | |
| 		return float64(intervalsUsed) / float64(possIntervals) * 100.0
 | |
| 	}
 | |
| 	return 0.00
 | |
| }
 | |
| 
 | |
| // CalculateMemUsageUnixNoCache calculate memory usage of the container.
 | |
| // Page cache is intentionally excluded to avoid misinterpretation of the output.
 | |
| func CalculateMemUsageUnixNoCache(mem types.MemoryStats) float64 {
 | |
| 	return float64(mem.Usage - mem.Stats["cache"])
 | |
| }
 | |
| 
 | |
| func CalculateMemPercentUnixNoCache(limit float64, usedNoCache float64) float64 {
 | |
| 	// MemoryStats.Limit will never be 0 unless the container is not running and we haven't
 | |
| 	// got any data from cgroup
 | |
| 	if limit != 0 {
 | |
| 		return usedNoCache / limit * 100.0
 | |
| 	}
 | |
| 	return 0
 | |
| }
 |