stats_windows.go 2.5 KB

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