stats_linux.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package daemon
  2. import (
  3. "github.com/docker/engine-api/types"
  4. "github.com/opencontainers/runc/libcontainer"
  5. "github.com/opencontainers/runc/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.StatsJSON {
  10. s := &types.StatsJSON{}
  11. if ls.Interfaces != nil {
  12. s.Networks = make(map[string]types.NetworkStats)
  13. for _, iface := range ls.Interfaces {
  14. // For API Version >= 1.21, the original data of network will
  15. // be returned.
  16. s.Networks[iface.Name] = types.NetworkStats{
  17. RxBytes: iface.RxBytes,
  18. RxPackets: iface.RxPackets,
  19. RxErrors: iface.RxErrors,
  20. RxDropped: iface.RxDropped,
  21. TxBytes: iface.TxBytes,
  22. TxPackets: iface.TxPackets,
  23. TxErrors: iface.TxErrors,
  24. TxDropped: iface.TxDropped,
  25. }
  26. }
  27. }
  28. cs := ls.CgroupStats
  29. if cs != nil {
  30. s.BlkioStats = types.BlkioStats{
  31. IoServiceBytesRecursive: copyBlkioEntry(cs.BlkioStats.IoServiceBytesRecursive),
  32. IoServicedRecursive: copyBlkioEntry(cs.BlkioStats.IoServicedRecursive),
  33. IoQueuedRecursive: copyBlkioEntry(cs.BlkioStats.IoQueuedRecursive),
  34. IoServiceTimeRecursive: copyBlkioEntry(cs.BlkioStats.IoServiceTimeRecursive),
  35. IoWaitTimeRecursive: copyBlkioEntry(cs.BlkioStats.IoWaitTimeRecursive),
  36. IoMergedRecursive: copyBlkioEntry(cs.BlkioStats.IoMergedRecursive),
  37. IoTimeRecursive: copyBlkioEntry(cs.BlkioStats.IoTimeRecursive),
  38. SectorsRecursive: copyBlkioEntry(cs.BlkioStats.SectorsRecursive),
  39. }
  40. cpu := cs.CpuStats
  41. s.CPUStats = types.CPUStats{
  42. CPUUsage: types.CPUUsage{
  43. TotalUsage: cpu.CpuUsage.TotalUsage,
  44. PercpuUsage: cpu.CpuUsage.PercpuUsage,
  45. UsageInKernelmode: cpu.CpuUsage.UsageInKernelmode,
  46. UsageInUsermode: cpu.CpuUsage.UsageInUsermode,
  47. },
  48. ThrottlingData: types.ThrottlingData{
  49. Periods: cpu.ThrottlingData.Periods,
  50. ThrottledPeriods: cpu.ThrottlingData.ThrottledPeriods,
  51. ThrottledTime: cpu.ThrottlingData.ThrottledTime,
  52. },
  53. }
  54. mem := cs.MemoryStats
  55. s.MemoryStats = types.MemoryStats{
  56. Usage: mem.Usage.Usage,
  57. MaxUsage: mem.Usage.MaxUsage,
  58. Stats: mem.Stats,
  59. Failcnt: mem.Usage.Failcnt,
  60. }
  61. pids := cs.PidsStats
  62. s.PidsStats = types.PidsStats{
  63. Current: pids.Current,
  64. }
  65. }
  66. return s
  67. }
  68. func copyBlkioEntry(entries []cgroups.BlkioStatEntry) []types.BlkioStatEntry {
  69. out := make([]types.BlkioStatEntry, len(entries))
  70. for i, re := range entries {
  71. out[i] = types.BlkioStatEntry{
  72. Major: re.Major,
  73. Minor: re.Minor,
  74. Op: re.Op,
  75. Value: re.Value,
  76. }
  77. }
  78. return out
  79. }