github.com/hernad/nomad@v1.6.112/drivers/docker/util/stats_windows.go (about)

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