sensors correction, postprocessing
diff --git a/scripts/postprocessing/bottleneck.py b/scripts/postprocessing/bottleneck.py
new file mode 100644
index 0000000..8b94f2f
--- /dev/null
+++ b/scripts/postprocessing/bottleneck.py
@@ -0,0 +1,111 @@
+""" Analize test results for finding bottlenecks """
+
+import sys
+import argparse
+
+import texttable as TT
+
+from collections import namedtuple
+
+
+Record = namedtuple("Record", ['name', 'max_value'])
+
+critical_values = [
+ Record("io_queue", 1),
+ Record("procs_blocked", 1),
+ Record("mem_usage_percent", 0.8)
+ ]
+
+def load_results(begin_time, end_time, rfile):
+ """ Read raw results from dir and return
+ data from provided period"""
+ results = {}
+
+ with open(rfile, "r") as f:
+ for line in f:
+
+ if len(line) <= 1:
+ continue
+ ttime, _, raw_data = line.partition(" : ")
+ raw_data = raw_data.strip('"\n\r')
+ itime = float(ttime)
+ if itime >= begin_time and itime <= end_time:
+ addr, data = eval(raw_data)
+ sid = data.pop("source_id")
+ data.pop("time")
+ serv = "{0}({1})".format(addr[0], sid)
+ serv_data = results.setdefault(serv, {})
+ for key, value in data.items():
+ # select device and metric names
+ dev, _, metric = key.partition(".")
+ # create dict for metric
+ metric_dict = serv_data.setdefault(metric, {})
+ # set value for metric on dev
+ cur_val = metric_dict.setdefault(dev, [])
+ cur_val.append(value)
+ print results
+ return results
+
+
+
+def print_bottlenecks(data, params):
+ """ Print bottlenecks in table format,
+ search in data by fields in params"""
+ tab = TT.Texttable()
+ tab.set_deco(tab.VLINES)
+
+ header = ["Server, device", "Critical value"]
+ tab.add_row(header)
+ tab.header = header
+
+ rows = []
+ val_format = "{0}: {1}, {2} times it was >= {3}"
+ for node, metrics in data.items():
+ node_rows = []
+ for metric, max_value in params:
+ if metric in metrics:
+ item = metrics[metric]
+ # find max val for dev
+ # count times it was > max_value
+ for dev, vals in item.items():
+ num_l = 0
+ max_v = -1
+ for val in vals:
+ if val >= max_value:
+ num_l += 1
+ if max_v < val:
+ max_v = val
+ if num_l > 0:
+ c_val = val_format.format(metric, max_v,
+ num_l, max_value)
+ node_rows.append([dev, c_val])
+ if len(node_rows) > 0:
+ rows.append([node, ""])
+ rows.extend(node_rows)
+
+ for row in rows:
+ tab.add_row(row)
+
+ print tab.draw()
+
+
+
+def parse_args(args):
+ parser = argparse.ArgumentParser()
+ parser.add_argument('-t', '--time_period', nargs=2,
+ type=float,
+ help="Begin and end time for tests")
+ parser.add_argument('sensors_result', type=str,
+ default=None, nargs='?')
+ return parser.parse_args(args[1:])
+
+
+def main(argv):
+ opts = parse_args(argv)
+
+ results = load_results(opts.time_period[0], opts.time_period[1], opts.sensors_result)
+
+ print_bottlenecks(results, critical_values)
+
+if __name__ == "__main__":
+ exit(main(sys.argv))