Merge lp:~therve/txstatsd/network-usage into lp:txstatsd

Proposed by Thomas Herve
Status: Merged
Approved by: Sidnei da Silva
Approved revision: 19
Merged at revision: 19
Proposed branch: lp:~therve/txstatsd/network-usage
Merge into: lp:txstatsd
Diff against target: 106 lines (+52/-3)
2 files modified
txstatsd/process.py (+25/-2)
txstatsd/tests/test_process.py (+27/-1)
To merge this branch: bzr merge lp:~therve/txstatsd/network-usage
Reviewer Review Type Date Requested Status
Sidnei da Silva Approve
Review via email: mp+70708@code.launchpad.net

Description of the change

A farly straightforward change, it reports network usage using /proc/net/dev and create a bunch of keys for the important available values.

To post a comment you must log in.
Revision history for this message
Robert Collins (lifeless) wrote :

Perhaps this should go into twisted core, and get reused here?

Revision history for this message
Thomas Herve (therve) wrote :

I don't think this is meaningful inside twisted code.

Revision history for this message
Sidnei da Silva (sidnei) wrote :

Looks good to me. +1!

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'txstatsd/process.py'
2--- txstatsd/process.py 2011-07-27 17:10:57 +0000
3+++ txstatsd/process.py 2011-08-08 09:34:27 +0000
4@@ -71,6 +71,30 @@
5 [float(x) for x in data.split()[:3]]))
6
7
8+def parse_netdev(data, prefix="sys.net"):
9+ """Parse data from /proc/net/dev."""
10+ lines = data.splitlines()
11+ # Parse out the column headers as keys.
12+ _, receive_columns, transmit_columns = lines[1].split("|")
13+ columns = ["recv_%s" % column for column in receive_columns.split()]
14+ columns.extend(["send_%s" % column for column in transmit_columns.split()])
15+
16+ # Parse out the network devices.
17+ result = {}
18+ for line in lines[2:]:
19+ if not ":" in line:
20+ continue
21+ device, data = line.split(":")
22+ device = device.strip()
23+ data = dict(zip(columns, map(int, data.split())))
24+ result.update({
25+ "%s.%s.bytes.received" % (prefix, device): data["recv_bytes"],
26+ "%s.%s.bytes.sent" % (prefix, device): data["send_bytes"],
27+ "%s.%s.packets.received" % (prefix, device): data["recv_packets"],
28+ "%s.%s.packets.sent" % (prefix, device): data["send_packets"]})
29+ return result
30+
31+
32 class ProcessReport(object):
33
34 def __init__(self, process=None):
35@@ -97,7 +121,6 @@
36 result[prefix + ".threads"] = self.process.get_num_threads()
37 return result
38
39-
40 def get_io_counters(self, prefix="proc.io"):
41 """Report IO statistics for C{process}."""
42 result = {}
43@@ -111,7 +134,6 @@
44 prefix + ".write.bytes": write_bytes})
45 return result
46
47-
48 def get_net_stats(self, prefix="proc.net"):
49 """Report active connection statistics for C{process}."""
50 result = {}
51@@ -180,4 +202,5 @@
52
53 SYSTEM_STATS = (report_file_stats("/proc/meminfo", parse_meminfo),
54 report_file_stats("/proc/loadavg", parse_loadavg),
55+ report_file_stats("/proc/net/dev", parse_netdev),
56 report_system_stats)
57
58=== modified file 'txstatsd/tests/test_process.py'
59--- txstatsd/tests/test_process.py 2011-07-27 17:10:57 +0000
60+++ txstatsd/tests/test_process.py 2011-08-08 09:34:27 +0000
61@@ -7,7 +7,7 @@
62 from twisted.trial.unittest import TestCase
63
64 from txstatsd.process import (
65- ProcessReport, load_file, parse_meminfo, parse_loadavg,
66+ ProcessReport, load_file, parse_meminfo, parse_loadavg, parse_netdev,
67 report_system_stats, report_reactor_stats, report_threadpool_stats)
68
69
70@@ -55,6 +55,13 @@
71 DirectMap2M: 415744 kB"""
72
73
74+netdev = """Inter-| Receive | Transmit
75+ face |bytes packets errs drop fifo frame compressed multicast|bytes packets errs drop fifo colls carrier compressed
76+lo: 635698677 2126380 0 0 0 0 0 0 635698677 2126380 0 0 0 0 0 0
77+eth0: 206594440 189319 0 0 0 0 0 0 23357088 165086 0 0 0 0 0 0
78+tun0: 5138313 24837 0 0 0 0 0 0 5226635 26986 0 0 0 0 0 0"""
79+
80+
81 class TestSystemPerformance(TestCase, MockerTestCase):
82 """Test system performance monitoring."""
83
84@@ -278,3 +285,22 @@
85 self.assertEqual(6, result["threadpool.threads"])
86 self.assertEqual(2, result["threadpool.waiters"])
87 self.assertEqual(4, result["threadpool.working"])
88+
89+ def test_netdev(self):
90+ """
91+ C{parse_netdev} returns a stat for sent/received bytes and packets for
92+ each network interfaces.
93+ """
94+ self.assertEqual(parse_netdev(netdev), {
95+ "sys.net.lo.bytes.received": 635698677,
96+ "sys.net.lo.bytes.sent": 635698677,
97+ "sys.net.lo.packets.received": 2126380,
98+ "sys.net.lo.packets.sent": 2126380,
99+ "sys.net.eth0.bytes.received": 206594440,
100+ "sys.net.eth0.bytes.sent": 23357088,
101+ "sys.net.eth0.packets.received": 189319,
102+ "sys.net.eth0.packets.sent": 165086,
103+ "sys.net.tun0.bytes.received": 5138313,
104+ "sys.net.tun0.bytes.sent": 5226635,
105+ "sys.net.tun0.packets.received": 24837,
106+ "sys.net.tun0.packets.sent": 26986})

Subscribers

People subscribed via source and target branches