Merge pull request #13101 from giuseppe/report-slirp4netns-stats

libpod: report slirp4netns network stats
This commit is contained in:
OpenShift Merge Robot
2022-02-01 14:05:34 -05:00
committed by GitHub
3 changed files with 40 additions and 14 deletions

View File

@ -98,6 +98,10 @@ ID NAME MEM USAGE / LIMIT
6eae9e25a564 clever_bassi 3.031MB / 16.7GB 6eae9e25a564 clever_bassi 3.031MB / 16.7GB
``` ```
Note: When using a slirp4netns network, the traffic send via the port forwarding will be accounted
to the `lo` device. Traffic accounted to `lo` is not accounted in the stats output.
## SEE ALSO ## SEE ALSO
**[podman(1)](podman.1.md)** **[podman(1)](podman.1.md)**

View File

@ -834,21 +834,25 @@ func (r *Runtime) teardownNetNS(ctr *Container) error {
return nil return nil
} }
func getContainerNetNS(ctr *Container) (string, error) { func getContainerNetNS(ctr *Container) (string, *Container, error) {
if ctr.state.NetNS != nil { if ctr.state.NetNS != nil {
return ctr.state.NetNS.Path(), nil return ctr.state.NetNS.Path(), nil, nil
} }
if ctr.config.NetNsCtr != "" { if ctr.config.NetNsCtr != "" {
c, err := ctr.runtime.GetContainer(ctr.config.NetNsCtr) c, err := ctr.runtime.GetContainer(ctr.config.NetNsCtr)
if err != nil { if err != nil {
return "", err return "", nil, err
} }
if err = c.syncContainer(); err != nil { if err = c.syncContainer(); err != nil {
return "", err return "", c, err
} }
return getContainerNetNS(c) netNs, c2, err := getContainerNetNS(c)
if c2 != nil {
c = c2
}
return netNs, c, err
} }
return "", nil return "", nil, nil
} }
// isBridgeNetMode checks if the given network mode is bridge. // isBridgeNetMode checks if the given network mode is bridge.
@ -919,12 +923,8 @@ func (r *Runtime) reloadContainerNetwork(ctr *Container) (map[string]types.Statu
func getContainerNetIO(ctr *Container) (*netlink.LinkStatistics, error) { func getContainerNetIO(ctr *Container) (*netlink.LinkStatistics, error) {
var netStats *netlink.LinkStatistics var netStats *netlink.LinkStatistics
// With slirp4netns, we can't collect statistics at present.
// For now, we allow stats to at least run by returning nil netNSPath, otherCtr, netPathErr := getContainerNetNS(ctr)
if rootless.IsRootless() || ctr.config.NetMode.IsSlirp4netns() {
return netStats, nil
}
netNSPath, netPathErr := getContainerNetNS(ctr)
if netPathErr != nil { if netPathErr != nil {
return nil, netPathErr return nil, netPathErr
} }
@ -933,9 +933,18 @@ func getContainerNetIO(ctr *Container) (*netlink.LinkStatistics, error) {
// this is a valid state and thus return no error, nor any statistics // this is a valid state and thus return no error, nor any statistics
return nil, nil return nil, nil
} }
// FIXME get the interface from the container netstatus
dev := "eth0"
netMode := ctr.config.NetMode
if otherCtr != nil {
netMode = otherCtr.config.NetMode
}
if netMode.IsSlirp4netns() {
dev = "tap0"
}
err := ns.WithNetNSPath(netNSPath, func(_ ns.NetNS) error { err := ns.WithNetNSPath(netNSPath, func(_ ns.NetNS) error {
// FIXME get the interface from the container netstatus link, err := netlink.LinkByName(dev)
link, err := netlink.LinkByName("eth0")
if err != nil { if err != nil {
return err return err
} }

View File

@ -185,6 +185,19 @@ var _ = Describe("Podman stats", func() {
Expect(session).Should(Exit(0)) Expect(session).Should(Exit(0))
}) })
It("podman reads slirp4netns network stats", func() {
session := podmanTest.Podman([]string{"run", "-d", "--network", "slirp4netns", ALPINE, "top"})
session.WaitWithDefaultTimeout()
Expect(session).Should(Exit(0))
cid := session.OutputToString()
stats := podmanTest.Podman([]string{"stats", "--format", "'{{.NetIO}}'", "--no-stream", cid})
stats.WaitWithDefaultTimeout()
Expect(stats).Should(Exit(0))
Expect(stats.OutputToString()).To(Not(ContainSubstring("-- / --")))
})
// Regression test for #8265 // Regression test for #8265
It("podman stats with custom memory limits", func() { It("podman stats with custom memory limits", func() {
// Run three containers. One with a memory limit. Make sure // Run three containers. One with a memory limit. Make sure