123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657 |
- // +build !windows
- package daemon
- import (
- "github.com/docker/docker/api/types"
- "github.com/docker/docker/container"
- "github.com/pkg/errors"
- )
- // 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 "", errors.Wrapf(err, "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)
- // Convert libnetwork nw stats into api stats
- 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
- }
|