stats_linux.go 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. package daemon
  2. import (
  3. "github.com/docker/docker/api/types"
  4. "github.com/docker/libcontainer"
  5. "github.com/docker/libcontainer/cgroups"
  6. )
  7. // convertStatsToAPITypes converts the libcontainer.Stats to the api specific
  8. // structs. This is done to preserve API compatibility and versioning.
  9. func convertStatsToAPITypes(ls *libcontainer.Stats) *types.Stats {
  10. s := &types.Stats{}
  11. if ls.Interfaces != nil {
  12. s.Network = types.Network{}
  13. for _, iface := range ls.Interfaces {
  14. s.Network.RxBytes += iface.RxBytes
  15. s.Network.RxPackets += iface.RxPackets
  16. s.Network.RxErrors += iface.RxErrors
  17. s.Network.RxDropped += iface.RxDropped
  18. s.Network.TxBytes += iface.TxBytes
  19. s.Network.TxPackets += iface.TxPackets
  20. s.Network.TxErrors += iface.TxErrors
  21. s.Network.TxDropped += iface.TxDropped
  22. }
  23. }
  24. cs := ls.CgroupStats
  25. if cs != nil {
  26. s.BlkioStats = types.BlkioStats{
  27. IoServiceBytesRecursive: copyBlkioEntry(cs.BlkioStats.IoServiceBytesRecursive),
  28. IoServicedRecursive: copyBlkioEntry(cs.BlkioStats.IoServicedRecursive),
  29. IoQueuedRecursive: copyBlkioEntry(cs.BlkioStats.IoQueuedRecursive),
  30. IoServiceTimeRecursive: copyBlkioEntry(cs.BlkioStats.IoServiceTimeRecursive),
  31. IoWaitTimeRecursive: copyBlkioEntry(cs.BlkioStats.IoWaitTimeRecursive),
  32. IoMergedRecursive: copyBlkioEntry(cs.BlkioStats.IoMergedRecursive),
  33. IoTimeRecursive: copyBlkioEntry(cs.BlkioStats.IoTimeRecursive),
  34. SectorsRecursive: copyBlkioEntry(cs.BlkioStats.SectorsRecursive),
  35. }
  36. cpu := cs.CpuStats
  37. s.CpuStats = types.CpuStats{
  38. CpuUsage: types.CpuUsage{
  39. TotalUsage: cpu.CpuUsage.TotalUsage,
  40. PercpuUsage: cpu.CpuUsage.PercpuUsage,
  41. UsageInKernelmode: cpu.CpuUsage.UsageInKernelmode,
  42. UsageInUsermode: cpu.CpuUsage.UsageInUsermode,
  43. },
  44. ThrottlingData: types.ThrottlingData{
  45. Periods: cpu.ThrottlingData.Periods,
  46. ThrottledPeriods: cpu.ThrottlingData.ThrottledPeriods,
  47. ThrottledTime: cpu.ThrottlingData.ThrottledTime,
  48. },
  49. }
  50. mem := cs.MemoryStats
  51. s.MemoryStats = types.MemoryStats{
  52. Usage: mem.Usage,
  53. MaxUsage: mem.MaxUsage,
  54. Stats: mem.Stats,
  55. Failcnt: mem.Failcnt,
  56. }
  57. }
  58. return s
  59. }
  60. func copyBlkioEntry(entries []cgroups.BlkioStatEntry) []types.BlkioStatEntry {
  61. out := make([]types.BlkioStatEntry, len(entries))
  62. for i, re := range entries {
  63. out[i] = types.BlkioStatEntry{
  64. Major: re.Major,
  65. Minor: re.Minor,
  66. Op: re.Op,
  67. Value: re.Value,
  68. }
  69. }
  70. return out
  71. }