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 }