2016-09-08 02:08:51 +03:00
|
|
|
// +build !windows
|
|
|
|
|
|
|
|
package daemon
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/docker/docker/api/types"
|
|
|
|
"github.com/docker/docker/container"
|
|
|
|
)
|
|
|
|
|
|
|
|
// 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 {
|
|
|
|
return "", fmt.Errorf("Could not get container for %s", containerID)
|
|
|
|
}
|
|
|
|
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)
|
2016-09-21 13:36:52 +03:00
|
|
|
// Convert libnetwork nw stats into api stats
|
2016-09-08 02:08:51 +03:00
|
|
|
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
|
|
|
|
}
|