1 ##############################################################################
2 # Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
14 LOG = logging.getLogger(__name__)
17 class RawDataProcess(object):
21 def process_vnstat(self, data):
22 buf = data.splitlines()
26 digits = re.compile(r"\d{1,}\.?\d*")
27 units = re.compile(r"(?:gib|mib|kib|kbit/s|gbit/s|mbit/s|p/s)", re.IGNORECASE | re.MULTILINE)
28 units_arr = units.findall(buf)
30 digits_arr = digits.findall(buf)
32 for i in range(len(digits_arr)):
33 digits_arr[i] = round(float(digits_arr[i]), 2)
35 LOG.info("-------------digit_arr------------------")
38 LOG.info("-----------------------------------------")
39 m['rxpck'], m['txpck'] = digits_arr[8], digits_arr[9]
40 m['time'] = digits_arr[-1]
41 digits_arr = digits_arr[:8] + digits_arr[10:-1]
43 for unit in units_arr:
46 digits_arr[index] *= 1024
48 digits_arr[index] /= 1024
49 elif unit == 'gbit/s':
50 digits_arr[index] *= 1000
51 elif unit == 'kbit/s':
52 digits_arr[index] /= 1000
57 for i in range(len(digits_arr)):
58 digits_arr[i] = round(digits_arr[i], 2)
60 m['rxmB'], m['txmB'] = digits_arr[0:2]
61 m['rxmB_max/s'], m['txmB_max/s'] = digits_arr[2:4]
62 m['rxmB/s'], m['txmB/s'] = digits_arr[4:6]
63 m['rxmB_min/s'], m['txmB_min/s'] = digits_arr[6:8]
64 m['rxpck_max/s'], m['txpck_max/s'] = digits_arr[8:10]
65 m['rxpck/s'], m['txpck/s'] = digits_arr[10:12]
66 m['rxpck_min/s'], m['txpck_min/s'] = digits_arr[12:14]
67 LOG.info("---------------vnstat data start-------------")
69 LOG.info("---------------vnstat data end---------------")
72 def process_sar_cpu(self, raw):
73 lines = raw.splitlines()
75 head = lines[2].split()[3:]
76 average = lines[-1].split()[2:]
78 for h, d in zip(head, average):
79 data[h.strip('%')] = float(d)
82 def process_qperf(self, raw):
83 buf = raw.splitlines()
84 data = buf[1].strip().split()
86 value = float(data[2])
88 return {key: value, 'unit': unit}
91 def process(cls, raw):
93 tool, data_type, data = raw['tool'], raw['type'], raw['raw_data']
95 if tool == 'vnstat' and data_type == 'nic':
96 m = self.process_vnstat(data)
97 if tool == 'sar' and data_type == 'cpu':
98 m = self.process_sar_cpu(data)
99 if raw.has_key('cpu_num'):
100 m['cpu_num'] = raw['cpu_num']
101 if raw.has_key('cpu_mhz'):
102 m['cpu_mhz'] = raw['cpu_mhz']
104 m = self.process_qperf(data)
108 if __name__ == '__main__':
109 logging.basicConfig(level=logging.DEBUG)
111 cmd = "vnstat -i eth0 -l"
112 child = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE)
115 from signal import SIGINT
118 os.kill(child.pid, SIGINT)
119 data = child.stdout.read()
121 print p.process_vnstat(data)
124 child = subprocess.Popen(cmd.split(), stdout=subprocess.PIPE, stderr=subprocess.PIPE)
127 from signal import SIGINT
130 os.kill(child.pid, SIGINT)
131 data = child.stdout.read()
133 print p.process_sar_cpu(data)