github.com/toplink-cn/moby@v0.0.0-20240305205811-460b4aebdf81/daemon/stats_windows.go (about)

     1  package daemon // import "github.com/docker/docker/daemon"
     2  
     3  import (
     4  	"context"
     5  
     6  	"github.com/docker/docker/api/types"
     7  	"github.com/docker/docker/container"
     8  	"github.com/docker/docker/errdefs"
     9  	"github.com/docker/docker/pkg/platform"
    10  )
    11  
    12  func (daemon *Daemon) stats(c *container.Container) (*types.StatsJSON, error) {
    13  	c.Lock()
    14  	task, err := c.GetRunningTask()
    15  	c.Unlock()
    16  	if err != nil {
    17  		return nil, err
    18  	}
    19  
    20  	// Obtain the stats from HCS via libcontainerd
    21  	stats, err := task.Stats(context.Background())
    22  	if err != nil {
    23  		if errdefs.IsNotFound(err) {
    24  			return nil, containerNotFound(c.ID)
    25  		}
    26  		return nil, err
    27  	}
    28  
    29  	// Start with an empty structure
    30  	s := &types.StatsJSON{}
    31  	s.Stats.Read = stats.Read
    32  	s.Stats.NumProcs = platform.NumProcs()
    33  
    34  	if stats.HCSStats != nil {
    35  		hcss := stats.HCSStats
    36  		// Populate the CPU/processor statistics
    37  		s.CPUStats = types.CPUStats{
    38  			CPUUsage: types.CPUUsage{
    39  				TotalUsage:        hcss.Processor.TotalRuntime100ns,
    40  				UsageInKernelmode: hcss.Processor.RuntimeKernel100ns,
    41  				UsageInUsermode:   hcss.Processor.RuntimeUser100ns,
    42  			},
    43  		}
    44  
    45  		// Populate the memory statistics
    46  		s.MemoryStats = types.MemoryStats{
    47  			Commit:            hcss.Memory.UsageCommitBytes,
    48  			CommitPeak:        hcss.Memory.UsageCommitPeakBytes,
    49  			PrivateWorkingSet: hcss.Memory.UsagePrivateWorkingSetBytes,
    50  		}
    51  
    52  		// Populate the storage statistics
    53  		s.StorageStats = types.StorageStats{
    54  			ReadCountNormalized:  hcss.Storage.ReadCountNormalized,
    55  			ReadSizeBytes:        hcss.Storage.ReadSizeBytes,
    56  			WriteCountNormalized: hcss.Storage.WriteCountNormalized,
    57  			WriteSizeBytes:       hcss.Storage.WriteSizeBytes,
    58  		}
    59  
    60  		// Populate the network statistics
    61  		s.Networks = make(map[string]types.NetworkStats)
    62  		for _, nstats := range hcss.Network {
    63  			s.Networks[nstats.EndpointId] = types.NetworkStats{
    64  				RxBytes:   nstats.BytesReceived,
    65  				RxPackets: nstats.PacketsReceived,
    66  				RxDropped: nstats.DroppedPacketsIncoming,
    67  				TxBytes:   nstats.BytesSent,
    68  				TxPackets: nstats.PacketsSent,
    69  				TxDropped: nstats.DroppedPacketsOutgoing,
    70  			}
    71  		}
    72  	}
    73  	return s, nil
    74  }
    75  
    76  // Windows network stats are obtained directly through HCS, hence this is a no-op.
    77  func (daemon *Daemon) getNetworkStats(c *container.Container) (map[string]types.NetworkStats, error) {
    78  	return make(map[string]types.NetworkStats), nil
    79  }
    80  
    81  // getSystemCPUUsage returns the host system's cpu usage in
    82  // nanoseconds and number of online CPUs. An error is returned
    83  // if the format of the underlying file does not match.
    84  // This is a no-op on Windows.
    85  func getSystemCPUUsage() (uint64, uint32, error) {
    86  	return 0, 0, nil
    87  }