2015-05-15 18:02:11 -04:00
|
|
|
package daemon
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/docker/docker/api/types"
|
2015-07-16 19:00:55 -04:00
|
|
|
"github.com/opencontainers/runc/libcontainer"
|
|
|
|
"github.com/opencontainers/runc/libcontainer/cgroups"
|
2015-05-15 18:02:11 -04:00
|
|
|
)
|
|
|
|
|
2015-06-12 11:27:39 -04:00
|
|
|
// convertStatsToAPITypes converts the libcontainer.Stats to the api specific
|
2015-05-15 18:02:11 -04:00
|
|
|
// structs. This is done to preserve API compatibility and versioning.
|
2015-06-12 11:27:39 -04:00
|
|
|
func convertStatsToAPITypes(ls *libcontainer.Stats) *types.Stats {
|
2015-05-15 18:02:11 -04:00
|
|
|
s := &types.Stats{}
|
|
|
|
if ls.Interfaces != nil {
|
2015-07-23 05:40:54 -04:00
|
|
|
s.Network = types.NetworkStats{}
|
2015-05-15 18:02:11 -04:00
|
|
|
for _, iface := range ls.Interfaces {
|
|
|
|
s.Network.RxBytes += iface.RxBytes
|
|
|
|
s.Network.RxPackets += iface.RxPackets
|
|
|
|
s.Network.RxErrors += iface.RxErrors
|
|
|
|
s.Network.RxDropped += iface.RxDropped
|
|
|
|
s.Network.TxBytes += iface.TxBytes
|
|
|
|
s.Network.TxPackets += iface.TxPackets
|
|
|
|
s.Network.TxErrors += iface.TxErrors
|
|
|
|
s.Network.TxDropped += iface.TxDropped
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
2015-07-23 05:40:54 -04:00
|
|
|
s.CPUStats = types.CPUStats{
|
|
|
|
CPUUsage: types.CPUUsage{
|
2015-05-15 18:02:11 -04:00
|
|
|
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{
|
2015-06-15 18:18:38 -04:00
|
|
|
Usage: mem.Usage.Usage,
|
|
|
|
MaxUsage: mem.Usage.MaxUsage,
|
2015-05-15 18:02:11 -04:00
|
|
|
Stats: mem.Stats,
|
2015-06-15 18:18:38 -04:00
|
|
|
Failcnt: mem.Usage.Failcnt,
|
2015-05-15 18:02:11 -04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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
|
|
|
|
}
|