github.com/iqoqo/nomad@v0.11.3-0.20200911112621-d7021c74d101/drivers/docker/util/stats_windows.go (about) 1 package util 2 3 import ( 4 "runtime" 5 6 docker "github.com/fsouza/go-dockerclient" 7 cstructs "github.com/hashicorp/nomad/client/structs" 8 "github.com/hashicorp/nomad/helper/stats" 9 ) 10 11 var ( 12 // The statistics the Docker driver exposes 13 DockerMeasuredCPUStats = []string{"Throttled Periods", "Throttled Time", "Percent"} 14 DockerMeasuredMemStats = []string{"RSS", "Usage", "Max Usage"} 15 ) 16 17 func DockerStatsToTaskResourceUsage(s *docker.Stats) *cstructs.TaskResourceUsage { 18 ms := &cstructs.MemoryStats{ 19 RSS: s.MemoryStats.PrivateWorkingSet, 20 Usage: s.MemoryStats.Commit, 21 MaxUsage: s.MemoryStats.CommitPeak, 22 Measured: DockerMeasuredMemStats, 23 } 24 25 cpuPercent := 0.0 26 27 // https://github.com/moby/moby/blob/cbb885b07af59225eef12a8159e70d1485616d57/integration-cli/docker_api_stats_test.go#L47-L58 28 // Max number of 100ns intervals between the previous time read and now 29 possIntervals := uint64(s.Read.Sub(s.PreRead).Nanoseconds()) // Start with number of ns intervals 30 possIntervals /= 100 // Convert to number of 100ns intervals 31 possIntervals *= uint64(s.NumProcs) // Multiple by the number of processors 32 33 // Intervals used 34 intervalsUsed := s.CPUStats.CPUUsage.TotalUsage - s.PreCPUStats.CPUUsage.TotalUsage 35 36 // Percentage avoiding divide-by-zero 37 if possIntervals > 0 { 38 cpuPercent = float64(intervalsUsed) / float64(possIntervals) * 100.0 39 } 40 41 cs := &cstructs.CpuStats{ 42 ThrottledPeriods: s.CPUStats.ThrottlingData.ThrottledPeriods, 43 ThrottledTime: s.CPUStats.ThrottlingData.ThrottledTime, 44 Percent: cpuPercent, 45 TotalTicks: (cpuPercent / 100) * stats.TotalTicksAvailable() / float64(runtime.NumCPU()), 46 Measured: DockerMeasuredCPUStats, 47 } 48 49 return &cstructs.TaskResourceUsage{ 50 ResourceUsage: &cstructs.ResourceUsage{ 51 MemoryStats: ms, 52 CpuStats: cs, 53 }, 54 Timestamp: s.Read.UTC().UnixNano(), 55 } 56 }