mirror of
https://github.com/containers/podman.git
synced 2025-06-22 18:08:11 +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
|
||||
```
|
||||
|
||||
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
|
||||
**[podman(1)](podman.1.md)**
|
||||
|
||||
|
@ -834,21 +834,25 @@ func (r *Runtime) teardownNetNS(ctr *Container) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func getContainerNetNS(ctr *Container) (string, error) {
|
||||
func getContainerNetNS(ctr *Container) (string, *Container, error) {
|
||||
if ctr.state.NetNS != nil {
|
||||
return ctr.state.NetNS.Path(), nil
|
||||
return ctr.state.NetNS.Path(), nil, nil
|
||||
}
|
||||
if ctr.config.NetNsCtr != "" {
|
||||
c, err := ctr.runtime.GetContainer(ctr.config.NetNsCtr)
|
||||
if err != nil {
|
||||
return "", err
|
||||
return "", nil, err
|
||||
}
|
||||
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.
|
||||
@ -919,12 +923,8 @@ func (r *Runtime) reloadContainerNetwork(ctr *Container) (map[string]types.Statu
|
||||
|
||||
func getContainerNetIO(ctr *Container) (*netlink.LinkStatistics, error) {
|
||||
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
|
||||
if rootless.IsRootless() || ctr.config.NetMode.IsSlirp4netns() {
|
||||
return netStats, nil
|
||||
}
|
||||
netNSPath, netPathErr := getContainerNetNS(ctr)
|
||||
|
||||
netNSPath, otherCtr, netPathErr := getContainerNetNS(ctr)
|
||||
if netPathErr != nil {
|
||||
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
|
||||
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 {
|
||||
// FIXME get the interface from the container netstatus
|
||||
link, err := netlink.LinkByName("eth0")
|
||||
link, err := netlink.LinkByName(dev)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
@ -185,6 +185,19 @@ var _ = Describe("Podman stats", func() {
|
||||
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
|
||||
It("podman stats with custom memory limits", func() {
|
||||
// Run three containers. One with a memory limit. Make sure
|
||||
|
Reference in New Issue
Block a user