mirror of
https://github.com/amir20/dozzle.git
synced 2025-12-21 13:23:07 +01:00
64 lines
2.2 KiB
Go
64 lines
2.2 KiB
Go
package docker
|
|
|
|
import (
|
|
"github.com/docker/docker/api/types/container"
|
|
)
|
|
|
|
func calculateMemUsageUnixNoCache(mem container.MemoryStats) float64 {
|
|
// re implementation of the docker calculation
|
|
// https://github.com/docker/cli/blob/53f8ed4bec07084db4208f55987a2ea94b7f01d6/cli/command/container/stats_helpers.go#L227-L249
|
|
// cgroup v1
|
|
if v, isCGroup := mem.Stats["total_inactive_file"]; isCGroup && v < mem.Usage {
|
|
return float64(mem.Usage - v)
|
|
}
|
|
// cgroup v2
|
|
if v := mem.Stats["inactive_file"]; v < mem.Usage {
|
|
return float64(mem.Usage - v)
|
|
}
|
|
return float64(mem.Usage)
|
|
}
|
|
|
|
func calculateCPUPercentWindows(v *container.StatsResponse) 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
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
func calculateCPUPercentUnix(previousCPU, previousSystem uint64, v *container.StatsResponse) 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
|
|
}
|