| package daemon // import "github.com/docker/docker/daemon" |
| |
| import ( |
| "context" |
| |
| "github.com/docker/docker/api/types" |
| "github.com/docker/docker/container" |
| "github.com/docker/docker/errdefs" |
| "github.com/docker/docker/pkg/platform" |
| ) |
| |
| func (daemon *Daemon) stats(c *container.Container) (*types.StatsJSON, error) { |
| c.Lock() |
| task, err := c.GetRunningTask() |
| c.Unlock() |
| if err != nil { |
| return nil, err |
| } |
| |
| // Obtain the stats from HCS via libcontainerd |
| stats, err := task.Stats(context.Background()) |
| if err != nil { |
| if errdefs.IsNotFound(err) { |
| return nil, containerNotFound(c.ID) |
| } |
| return nil, err |
| } |
| |
| // Start with an empty structure |
| s := &types.StatsJSON{} |
| s.Stats.Read = stats.Read |
| s.Stats.NumProcs = platform.NumProcs() |
| |
| if stats.HCSStats != nil { |
| hcss := stats.HCSStats |
| // Populate the CPU/processor statistics |
| s.CPUStats = types.CPUStats{ |
| CPUUsage: types.CPUUsage{ |
| TotalUsage: hcss.Processor.TotalRuntime100ns, |
| UsageInKernelmode: hcss.Processor.RuntimeKernel100ns, |
| UsageInUsermode: hcss.Processor.RuntimeUser100ns, |
| }, |
| } |
| |
| // Populate the memory statistics |
| s.MemoryStats = types.MemoryStats{ |
| Commit: hcss.Memory.UsageCommitBytes, |
| CommitPeak: hcss.Memory.UsageCommitPeakBytes, |
| PrivateWorkingSet: hcss.Memory.UsagePrivateWorkingSetBytes, |
| } |
| |
| // Populate the storage statistics |
| s.StorageStats = types.StorageStats{ |
| ReadCountNormalized: hcss.Storage.ReadCountNormalized, |
| ReadSizeBytes: hcss.Storage.ReadSizeBytes, |
| WriteCountNormalized: hcss.Storage.WriteCountNormalized, |
| WriteSizeBytes: hcss.Storage.WriteSizeBytes, |
| } |
| |
| // Populate the network statistics |
| s.Networks = make(map[string]types.NetworkStats) |
| for _, nstats := range hcss.Network { |
| s.Networks[nstats.EndpointId] = types.NetworkStats{ |
| RxBytes: nstats.BytesReceived, |
| RxPackets: nstats.PacketsReceived, |
| RxDropped: nstats.DroppedPacketsIncoming, |
| TxBytes: nstats.BytesSent, |
| TxPackets: nstats.PacketsSent, |
| TxDropped: nstats.DroppedPacketsOutgoing, |
| } |
| } |
| } |
| return s, nil |
| } |
| |
| // Windows network stats are obtained directly through HCS, hence this is a no-op. |
| func (daemon *Daemon) getNetworkStats(c *container.Container) (map[string]types.NetworkStats, error) { |
| return make(map[string]types.NetworkStats), nil |
| } |
| |
| // getSystemCPUUsage returns the host system's cpu usage in |
| // nanoseconds and number of online CPUs. An error is returned |
| // if the format of the underlying file does not match. |
| // This is a no-op on Windows. |
| func getSystemCPUUsage() (uint64, uint32, error) { |
| return 0, 0, nil |
| } |