daemon/stats_linux.go
48f1cb4e
 package daemon
 
 import (
907407d0
 	"github.com/docker/engine-api/types"
c86189d5
 	"github.com/opencontainers/runc/libcontainer"
 	"github.com/opencontainers/runc/libcontainer/cgroups"
48f1cb4e
 )
 
855a056a
 // convertStatsToAPITypes converts the libcontainer.Stats to the api specific
d3379946
 // structs. This is done to preserve API compatibility and versioning.
 func convertStatsToAPITypes(ls *libcontainer.Stats) *types.StatsJSON {
 	s := &types.StatsJSON{}
48f1cb4e
 	if ls.Interfaces != nil {
d3379946
 		s.Networks = make(map[string]types.NetworkStats)
48f1cb4e
 		for _, iface := range ls.Interfaces {
d3379946
 			// For API Version >= 1.21, the original data of network will
 			// be returned.
 			s.Networks[iface.Name] = types.NetworkStats{
 				RxBytes:   iface.RxBytes,
 				RxPackets: iface.RxPackets,
 				RxErrors:  iface.RxErrors,
 				RxDropped: iface.RxDropped,
 				TxBytes:   iface.TxBytes,
 				TxPackets: iface.TxPackets,
 				TxErrors:  iface.TxErrors,
 				TxDropped: iface.TxDropped,
 			}
48f1cb4e
 		}
 	}
 
 	cs := ls.CgroupStats
 	if cs != nil {
 		s.BlkioStats = types.BlkioStats{
 			IoServiceBytesRecursive: copyBlkioEntry(cs.BlkioStats.IoServiceBytesRecursive),
 			IoServicedRecursive:     copyBlkioEntry(cs.BlkioStats.IoServicedRecursive),
 			IoQueuedRecursive:       copyBlkioEntry(cs.BlkioStats.IoQueuedRecursive),
 			IoServiceTimeRecursive:  copyBlkioEntry(cs.BlkioStats.IoServiceTimeRecursive),
 			IoWaitTimeRecursive:     copyBlkioEntry(cs.BlkioStats.IoWaitTimeRecursive),
 			IoMergedRecursive:       copyBlkioEntry(cs.BlkioStats.IoMergedRecursive),
 			IoTimeRecursive:         copyBlkioEntry(cs.BlkioStats.IoTimeRecursive),
 			SectorsRecursive:        copyBlkioEntry(cs.BlkioStats.SectorsRecursive),
 		}
 		cpu := cs.CpuStats
3d6617ff
 		s.CPUStats = types.CPUStats{
 			CPUUsage: types.CPUUsage{
48f1cb4e
 				TotalUsage:        cpu.CpuUsage.TotalUsage,
 				PercpuUsage:       cpu.CpuUsage.PercpuUsage,
 				UsageInKernelmode: cpu.CpuUsage.UsageInKernelmode,
 				UsageInUsermode:   cpu.CpuUsage.UsageInUsermode,
 			},
 			ThrottlingData: types.ThrottlingData{
 				Periods:          cpu.ThrottlingData.Periods,
 				ThrottledPeriods: cpu.ThrottlingData.ThrottledPeriods,
 				ThrottledTime:    cpu.ThrottlingData.ThrottledTime,
 			},
 		}
 		mem := cs.MemoryStats
 		s.MemoryStats = types.MemoryStats{
6d022bda
 			Usage:    mem.Usage.Usage,
 			MaxUsage: mem.Usage.MaxUsage,
48f1cb4e
 			Stats:    mem.Stats,
6d022bda
 			Failcnt:  mem.Usage.Failcnt,
48f1cb4e
 		}
 	}
 
 	return s
 }
 
 func copyBlkioEntry(entries []cgroups.BlkioStatEntry) []types.BlkioStatEntry {
 	out := make([]types.BlkioStatEntry, len(entries))
 	for i, re := range entries {
 		out[i] = types.BlkioStatEntry{
 			Major: re.Major,
 			Minor: re.Minor,
 			Op:    re.Op,
 			Value: re.Value,
 		}
 	}
 	return out
 }