mirror of
https://github.com/containers/podman.git
synced 2025-06-22 01:48:54 +08:00
Merge pull request #14421 from Luap99/stats
podman stats: work with network connect/disconnect
This commit is contained in:
@ -930,6 +930,8 @@ func (r *Runtime) reloadContainerNetwork(ctr *Container) (map[string]types.Statu
|
||||
return r.configureNetNS(ctr, ctr.state.NetNS)
|
||||
}
|
||||
|
||||
// TODO (5.0): return the statistics per network interface
|
||||
// This would allow better compat with docker.
|
||||
func getContainerNetIO(ctr *Container) (*netlink.LinkStatistics, error) {
|
||||
var netStats *netlink.LinkStatistics
|
||||
|
||||
@ -943,21 +945,39 @@ func getContainerNetIO(ctr *Container) (*netlink.LinkStatistics, error) {
|
||||
return nil, nil
|
||||
}
|
||||
|
||||
// FIXME get the interface from the container netstatus
|
||||
dev := "eth0"
|
||||
netMode := ctr.config.NetMode
|
||||
netStatus := ctr.getNetworkStatus()
|
||||
if otherCtr != nil {
|
||||
netMode = otherCtr.config.NetMode
|
||||
netStatus = otherCtr.getNetworkStatus()
|
||||
}
|
||||
if netMode.IsSlirp4netns() {
|
||||
dev = "tap0"
|
||||
// create a fake status with correct interface name for the logic below
|
||||
netStatus = map[string]types.StatusBlock{
|
||||
"slirp4netns": {
|
||||
Interfaces: map[string]types.NetInterface{"tap0": {}},
|
||||
},
|
||||
}
|
||||
}
|
||||
err := ns.WithNetNSPath(netNSPath, func(_ ns.NetNS) error {
|
||||
link, err := netlink.LinkByName(dev)
|
||||
if err != nil {
|
||||
return err
|
||||
for _, status := range netStatus {
|
||||
for dev := range status.Interfaces {
|
||||
link, err := netlink.LinkByName(dev)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if netStats == nil {
|
||||
netStats = link.Attrs().Statistics
|
||||
continue
|
||||
}
|
||||
// Currently only Tx/RxBytes are used.
|
||||
// In the future we should return all stats per interface so that
|
||||
// api users have a better options.
|
||||
stats := link.Attrs().Statistics
|
||||
netStats.TxBytes += stats.TxBytes
|
||||
netStats.RxBytes += stats.RxBytes
|
||||
}
|
||||
}
|
||||
netStats = link.Attrs().Statistics
|
||||
return nil
|
||||
})
|
||||
return netStats, err
|
||||
|
@ -114,6 +114,11 @@ var _ = Describe("Podman network connect and disconnect", func() {
|
||||
exec3.WaitWithDefaultTimeout()
|
||||
Expect(exec3).Should(Exit(0))
|
||||
Expect(strings.Contains(exec3.OutputToString(), ns)).To(BeFalse())
|
||||
|
||||
// make sure stats still works https://github.com/containers/podman/issues/13824
|
||||
stats := podmanTest.Podman([]string{"stats", "test", "--no-stream"})
|
||||
stats.WaitWithDefaultTimeout()
|
||||
Expect(stats).Should(Exit(0))
|
||||
})
|
||||
|
||||
It("bad network name in connect should result in error", func() {
|
||||
@ -237,6 +242,11 @@ var _ = Describe("Podman network connect and disconnect", func() {
|
||||
Expect(exec3).Should(Exit(0))
|
||||
Expect(strings.Contains(exec3.OutputToString(), ns)).To(BeTrue())
|
||||
|
||||
// make sure stats works https://github.com/containers/podman/issues/13824
|
||||
stats := podmanTest.Podman([]string{"stats", "test", "--no-stream"})
|
||||
stats.WaitWithDefaultTimeout()
|
||||
Expect(stats).Should(Exit(0))
|
||||
|
||||
// make sure no logrus errors are shown https://github.com/containers/podman/issues/9602
|
||||
rm := podmanTest.Podman([]string{"rm", "--time=0", "-f", "test"})
|
||||
rm.WaitWithDefaultTimeout()
|
||||
|
Reference in New Issue
Block a user