stats_unix.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. // +build !windows
  2. package daemon
  3. import (
  4. "fmt"
  5. "github.com/docker/docker/api/types"
  6. "github.com/docker/docker/container"
  7. )
  8. // Resolve Network SandboxID in case the container reuse another container's network stack
  9. func (daemon *Daemon) getNetworkSandboxID(c *container.Container) (string, error) {
  10. curr := c
  11. for curr.HostConfig.NetworkMode.IsContainer() {
  12. containerID := curr.HostConfig.NetworkMode.ConnectedContainer()
  13. connected, err := daemon.GetContainer(containerID)
  14. if err != nil {
  15. return "", fmt.Errorf("Could not get container for %s", containerID)
  16. }
  17. curr = connected
  18. }
  19. return curr.NetworkSettings.SandboxID, nil
  20. }
  21. func (daemon *Daemon) getNetworkStats(c *container.Container) (map[string]types.NetworkStats, error) {
  22. sandboxID, err := daemon.getNetworkSandboxID(c)
  23. if err != nil {
  24. return nil, err
  25. }
  26. sb, err := daemon.netController.SandboxByID(sandboxID)
  27. if err != nil {
  28. return nil, err
  29. }
  30. lnstats, err := sb.Statistics()
  31. if err != nil {
  32. return nil, err
  33. }
  34. stats := make(map[string]types.NetworkStats)
  35. // Convert libnetwork nw stats into api stats
  36. for ifName, ifStats := range lnstats {
  37. stats[ifName] = types.NetworkStats{
  38. RxBytes: ifStats.RxBytes,
  39. RxPackets: ifStats.RxPackets,
  40. RxErrors: ifStats.RxErrors,
  41. RxDropped: ifStats.RxDropped,
  42. TxBytes: ifStats.TxBytes,
  43. TxPackets: ifStats.TxPackets,
  44. TxErrors: ifStats.TxErrors,
  45. TxDropped: ifStats.TxDropped,
  46. }
  47. }
  48. return stats, nil
  49. }