daemon/stats_unix.go
340e5233
 // +build !windows
 
 package daemon
 
 import (
 	"github.com/docker/docker/api/types"
 	"github.com/docker/docker/container"
ebcb7d6b
 	"github.com/pkg/errors"
340e5233
 )
 
 // Resolve Network SandboxID in case the container reuse another container's network stack
 func (daemon *Daemon) getNetworkSandboxID(c *container.Container) (string, error) {
 	curr := c
 	for curr.HostConfig.NetworkMode.IsContainer() {
 		containerID := curr.HostConfig.NetworkMode.ConnectedContainer()
 		connected, err := daemon.GetContainer(containerID)
 		if err != nil {
ebcb7d6b
 			return "", errors.Wrapf(err, "Could not get container for %s", containerID)
340e5233
 		}
 		curr = connected
 	}
 	return curr.NetworkSettings.SandboxID, nil
 }
 
 func (daemon *Daemon) getNetworkStats(c *container.Container) (map[string]types.NetworkStats, error) {
 	sandboxID, err := daemon.getNetworkSandboxID(c)
 	if err != nil {
 		return nil, err
 	}
 
 	sb, err := daemon.netController.SandboxByID(sandboxID)
 	if err != nil {
 		return nil, err
 	}
 
 	lnstats, err := sb.Statistics()
 	if err != nil {
 		return nil, err
 	}
 
 	stats := make(map[string]types.NetworkStats)
45818d6f
 	// Convert libnetwork nw stats into api stats
340e5233
 	for ifName, ifStats := range lnstats {
 		stats[ifName] = types.NetworkStats{
 			RxBytes:   ifStats.RxBytes,
 			RxPackets: ifStats.RxPackets,
 			RxErrors:  ifStats.RxErrors,
 			RxDropped: ifStats.RxDropped,
 			TxBytes:   ifStats.TxBytes,
 			TxPackets: ifStats.TxPackets,
 			TxErrors:  ifStats.TxErrors,
 			TxDropped: ifStats.TxDropped,
 		}
 	}
 
 	return stats, nil
 }