dab749ebda87f823c24e3a51d0395902eca6bb19
[bottlenecks.git] / vstf / vstf / controller / sw_perf / raw_data.py
1 import subprocess
2 import re
3 import logging
4
5 LOG = logging.getLogger(__name__)
6
7
8 class RawDataProcess(object):
9     def __init__(self):
10         pass
11
12     def process_vnstat(self, data):
13         buf = data.splitlines()
14         buf = buf[9:]
15         buf = ' '.join(buf)
16         m = {}
17         digits = re.compile(r"\d{1,}\.?\d*")
18         units = re.compile(r"(?:gib|mib|kib|kbit/s|gbit/s|mbit/s|p/s)", re.IGNORECASE | re.MULTILINE)
19         units_arr = units.findall(buf)
20         LOG.debug(units_arr)
21         digits_arr = digits.findall(buf)
22
23         for i in range(len(digits_arr)):
24             digits_arr[i] = round(float(digits_arr[i]), 2)
25
26         LOG.info("-------------digit_arr------------------")
27         LOG.info(digits_arr)
28         LOG.info(units_arr)
29         LOG.info("-----------------------------------------")
30         m['rxpck'], m['txpck'] = digits_arr[8], digits_arr[9]
31         m['time'] = digits_arr[-1]
32         digits_arr = digits_arr[:8] + digits_arr[10:-1]
33         index = 0
34         for unit in units_arr:
35             unit = unit.lower()
36             if unit == 'gib':
37                 digits_arr[index] *= 1024
38             elif unit == 'kib':
39                 digits_arr[index] /= 1024
40             elif unit == 'gbit/s':
41                 digits_arr[index] *= 1000
42             elif unit == 'kbit/s':
43                 digits_arr[index] /= 1000
44             else:
45                 pass
46             index += 1
47
48         for i in range(len(digits_arr)):
49             digits_arr[i] = round(digits_arr[i], 2)
50
51         m['rxmB'], m['txmB'] = digits_arr[0:2]
52         m['rxmB_max/s'], m['txmB_max/s'] = digits_arr[2:4]
53         m['rxmB/s'], m['txmB/s'] = digits_arr[4:6]
54         m['rxmB_min/s'], m['txmB_min/s'] = digits_arr[6:8]
55         m['rxpck_max/s'], m['txpck_max/s'] = digits_arr[8:10]
56         m['rxpck/s'], m['txpck/s'] = digits_arr[10:12]
57         m['rxpck_min/s'], m['txpck_min/s'] = digits_arr[12:14]
58         LOG.info("---------------vnstat data start-------------")
59         LOG.info(m)
60         LOG.info("---------------vnstat data end---------------")
61         return m
62
63     def process_sar_cpu(self, raw):
64         lines = raw.splitlines()
65         # print lines
66         head = lines[2].split()[3:]
67         average = lines[-1].split()[2:]
68         data = {}
69         for h, d in zip(head, average):
70             data[h.strip('%')] = float(d)
71         return data
72
73     def process_qperf(self, raw):
74         buf = raw.splitlines()
75         data = buf[1].strip().split()
76         key = data[0]
77         value = float(data[2])
78         unit = data[3]
79         return {key: value, 'unit': unit}
80
81     @classmethod
82     def process(cls, raw):
83         self = cls()
84         tool, data_type, data = raw['tool'], raw['type'], raw['raw_data']
85         m = {}
86         if tool == 'vnstat' and data_type == 'nic':
87             m = self.process_vnstat(data)
88         if tool == 'sar' and data_type == 'cpu':
89             m = self.process_sar_cpu(data)
90             if raw.has_key('cpu_num'):
91                 m['cpu_num'] = raw['cpu_num']
92             if raw.has_key('cpu_mhz'):
93                 m['cpu_mhz'] = raw['cpu_mhz']
94         if tool == 'qperf':
95             m = self.process_qperf(data)
96         return m
97
98
99 if __name__ == '__main__':
100     logging.basicConfig(level=logging.DEBUG)
101     p = RawDataProcess()
102     cmd = "vnstat -i eth0 -l"
103     child = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
104     import time
105     import os
106     from signal import SIGINT
107
108     time.sleep(20)
109     os.kill(child.pid, SIGINT)
110     data = child.stdout.read()
111     print data
112     print p.process_vnstat(data)
113
114     cmd = "sar -u 2"
115     child = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
116     import time
117     import os
118     from signal import SIGINT
119
120     time.sleep(20)
121     os.kill(child.pid, SIGINT)
122     data = child.stdout.read()
123     print data
124     print p.process_sar_cpu(data)