mirror of
https://github.com/containers/podman.git
synced 2025-06-23 02:18:13 +08:00
Merge pull request #13101 from giuseppe/report-slirp4netns-stats
libpod: report slirp4netns network stats
This commit is contained in:
@ -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)**
|
||||||
|
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
Reference in New Issue
Block a user