[lxc-devel] [lxd/master] networks: Fix packet stats logic for containers

stgraber on Github lxc-bot at linuxcontainers.org
Mon Jul 30 18:53:15 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 681 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180730/db111ec4/attachment.bin>
-------------- next part --------------
From 48b8b97c4a330b2de7ad2434f2dd8ddf998de042 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 30 Jul 2018 14:49:47 -0400
Subject: [PATCH] networks: Fix packet stats logic for containers
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

The new logic introduced in 3.3 was both slower due to having to do
multiple file operations and also wrong as forknet doesn't actually have
the container's /sys view.

The result was the expected list of interfaces and addresses but
statistics coming from the host's device, if a matching one existed.

Closes #4851

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/networks_utils.go | 48 ++++++++++++++++++++++++++++++++++++++++--------
 1 file changed, 40 insertions(+), 8 deletions(-)

diff --git a/lxd/networks_utils.go b/lxd/networks_utils.go
index 4169ff74e..7ee6cfd83 100644
--- a/lxd/networks_utils.go
+++ b/lxd/networks_utils.go
@@ -1031,6 +1031,7 @@ func networkGetState(netIf net.Interface) api.NetworkState {
 		Type:      netType,
 	}
 
+	// Get address information
 	addrs, err := netIf.Addrs()
 	if err == nil {
 		for _, addr := range addrs {
@@ -1071,17 +1072,48 @@ func networkGetState(netIf net.Interface) api.NetworkState {
 		}
 	}
 
-	network.Counters.BytesSent, _ = shared.ParseNumberFromFile(
-		fmt.Sprintf("/sys/class/net/%s/statistics/tx_bytes", netIf.Name))
+	// Get counters
+	content, err := ioutil.ReadFile("/proc/net/dev")
+	if err == nil {
+		for _, line := range strings.Split(string(content), "\n") {
+			fields := strings.Fields(line)
+
+			if len(fields) != 17 {
+				continue
+			}
+
+			intName := strings.TrimSuffix(fields[0], ":")
+			if intName != netIf.Name {
+				continue
+			}
+
+			rxBytes, err := strconv.ParseInt(fields[1], 10, 64)
+			if err != nil {
+				continue
+			}
+
+			rxPackets, err := strconv.ParseInt(fields[2], 10, 64)
+			if err != nil {
+				continue
+			}
 
-	network.Counters.BytesReceived, _ = shared.ParseNumberFromFile(
-		fmt.Sprintf("/sys/class/net/%s/statistics/rx_bytes", netIf.Name))
+			txBytes, err := strconv.ParseInt(fields[9], 10, 64)
+			if err != nil {
+				continue
+			}
 
-	network.Counters.PacketsSent, _ = shared.ParseNumberFromFile(
-		fmt.Sprintf("/sys/class/net/%s/statistics/tx_packets", netIf.Name))
+			txPackets, err := strconv.ParseInt(fields[10], 10, 64)
+			if err != nil {
+				continue
+			}
 
-	network.Counters.PacketsReceived, _ = shared.ParseNumberFromFile(
-		fmt.Sprintf("/sys/class/net/%s/statistics/rx_packets", netIf.Name))
+			network.Counters.BytesSent = txBytes
+			network.Counters.BytesReceived = rxBytes
+			network.Counters.PacketsSent = txPackets
+			network.Counters.PacketsReceived = rxPackets
+			break
+		}
+	}
 
 	return network
 }


More information about the lxc-devel mailing list