github.com/ilhicas/nomad@v0.11.8/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  }