diff options
author | baude <bbaude@redhat.com> | 2018-02-28 10:02:54 -0600 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-02-28 16:46:29 +0000 |
commit | 7ffc89d71a65da32c74cf6ec3aeb99b0d547ebd1 (patch) | |
tree | 1593b5f562cab241a47d148e401f3c7c309883dd | |
parent | 2a59653bf3d5230a8be1a20ed9fcf53a185afba3 (diff) | |
download | podman-7ffc89d71a65da32c74cf6ec3aeb99b0d547ebd1.tar.gz podman-7ffc89d71a65da32c74cf6ec3aeb99b0d547ebd1.tar.bz2 podman-7ffc89d71a65da32c74cf6ec3aeb99b0d547ebd1.zip |
podman stats add networking
Add networking information to podman stats output. Also correct an issue filed
where memory constraints of the cgroup were not reflected in the stats output. And
finally, fix issue with PID count.
Resolves issue #364
Signed-off-by: baude <bbaude@redhat.com>
Closes: #417
Approved by: mheon
-rw-r--r-- | libpod/container.go | 2 | ||||
-rw-r--r-- | libpod/stats.go | 34 |
2 files changed, 24 insertions, 12 deletions
diff --git a/libpod/container.go b/libpod/container.go index 0e3b8b17f..42f13a992 100644 --- a/libpod/container.go +++ b/libpod/container.go @@ -632,7 +632,7 @@ func (c *Container) NamespacePath(ns LinuxNS) (string, error) { // CGroupPath returns a cgroups "path" for a given container. func (c *Container) CGroupPath() cgroups.Path { - return cgroups.StaticPath(filepath.Join(c.config.CgroupParent, fmt.Sprintf("libpod-conmon-%s", c.ID()))) + return cgroups.StaticPath(filepath.Join(c.config.CgroupParent, fmt.Sprintf("libpod-conmon-%s/%s", c.ID(), c.ID()))) } // RootFsSize returns the root FS size of the container diff --git a/libpod/stats.go b/libpod/stats.go index faccc2366..f4694923c 100644 --- a/libpod/stats.go +++ b/libpod/stats.go @@ -6,8 +6,10 @@ import ( "time" "github.com/containerd/cgroups" - "github.com/opencontainers/runc/libcontainer" + "github.com/containernetworking/plugins/pkg/ns" + "github.com/cri-o/ocicni/pkg/ocicni" "github.com/pkg/errors" + "github.com/vishvananda/netlink" ) // ContainerStats contains the statistics information for a running container @@ -55,6 +57,11 @@ func (c *Container) GetContainerStats(previousStats *ContainerStats) (*Container return stats, errors.Wrapf(err, "unable to determine container state") } + netStats, err := getContainerNetIO(c) + if err != nil { + return nil, err + } + previousCPU := previousStats.CPUNano previousSystem := previousStats.SystemNano stats.CPU = calculateCPUPercent(cgroupStats, previousCPU, previousSystem) @@ -63,13 +70,14 @@ func (c *Container) GetContainerStats(previousStats *ContainerStats) (*Container stats.MemPerc = (float64(stats.MemUsage) / float64(stats.MemLimit)) * 100 stats.PIDs = 0 if conState == ContainerStateRunning { - stats.PIDs = cgroupStats.Pids.Current - 1 + stats.PIDs = cgroupStats.Pids.Current } stats.BlockInput, stats.BlockOutput = calculateBlockIO(cgroupStats) stats.CPUNano = cgroupStats.CPU.Usage.Total stats.SystemNano = cgroupStats.CPU.Usage.Kernel - // TODO Figure out where to get the Netout stuff. - //stats.NetInput, stats.NetOutput = getContainerNetIO(cgroupStats) + stats.NetInput = netStats.TxBytes + stats.NetOutput = netStats.RxBytes + return stats, nil } @@ -90,13 +98,17 @@ func getMemLimit(cgroupLimit uint64) uint64 { return cgroupLimit } -// Returns the total number of bytes transmitted and received for the given container stats -func getContainerNetIO(stats *libcontainer.Stats) (received uint64, transmitted uint64) { //nolint - for _, iface := range stats.Interfaces { - received += iface.RxBytes - transmitted += iface.TxBytes - } - return +func getContainerNetIO(ctr *Container) (*netlink.LinkStatistics, error) { + var netStats *netlink.LinkStatistics + err := ns.WithNetNSPath(ctr.state.NetNS.Path(), func(_ ns.NetNS) error { + link, err := netlink.LinkByName(ocicni.DefaultInterfaceName) + if err != nil { + return err + } + netStats = link.Attrs().Statistics + return nil + }) + return netStats, err } func calculateCPUPercent(stats *cgroups.Metrics, previousCPU, previousSystem uint64) float64 { |