github.com/damirazo/docker@v1.9.0/daemon/stats_linux.go (about)

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