From aea95cb8b1eef994fb714bb4f00c214347e53452 Mon Sep 17 00:00:00 2001 From: "wu.zhihui" Date: Sat, 11 Mar 2017 00:29:41 +0800 Subject: parse benchmark result from logfile - Put all the regex rules in regex.yaml. - According to benchmark name, we can find related regexes. Change-Id: Ic15bd1c77b525be3751011fa94d582da077b0345 Signed-off-by: wu.zhihui (cherry picked from commit dc92e5ae19dd026bf6a14c1e0d2b9c50497845d5) --- qtip/collector/calculator.py | 38 ++++++++++++++++++ qtip/collector/parser/grep.py | 74 +++++++++++++++++++++++++++++++++- qtip/collector/parser/regex.yaml | 85 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 195 insertions(+), 2 deletions(-) create mode 100644 qtip/collector/calculator.py create mode 100644 qtip/collector/parser/regex.yaml diff --git a/qtip/collector/calculator.py b/qtip/collector/calculator.py new file mode 100644 index 00000000..c3d961b3 --- /dev/null +++ b/qtip/collector/calculator.py @@ -0,0 +1,38 @@ +############################################################################## +# Copyright (c) 2017 ZTE Corp and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +from operator import add + +from qtip.util.logger import QtipLogger + +logger = QtipLogger('calculator').get + + +def dpi_calculator(samples): + try: + float_pps = map(lambda x: float(x), samples['pps']) + float_bps = map(lambda x: float(x), samples['bps']) + sum_dpi_pps = reduce(add, + map(lambda x: x / 1000 if x > 100 else x, float_pps)) + sum_dpi_bps = reduce(add, + map(lambda x: x / 1000 if x > 100 else x, float_bps)) + + return {'pps': round(sum_dpi_pps / 10, 3), 'bps': round(sum_dpi_bps / 10, 3)} + except Exception as error: + logger.error(error) + return {'pps': None, 'bps': None} + + +def calculate_cpu_usage(cpu_idle): + try: + cpu_usage = round((100.0 - float(cpu_idle)), 3) + return '{0}%'.format(str(cpu_usage)) + except Exception, error: + logger.error(error) + return None diff --git a/qtip/collector/parser/grep.py b/qtip/collector/parser/grep.py index f74ce403..44edb5a1 100644 --- a/qtip/collector/parser/grep.py +++ b/qtip/collector/parser/grep.py @@ -7,12 +7,20 @@ # http://www.apache.org/licenses/LICENSE-2.0 ############################################################################## - +from collections import defaultdict +from os import path import re +import yaml -from qtip.base.constant import BaseProp from qtip.base import BaseActor +from qtip.base.constant import BaseProp +from qtip.collector import calculator +from qtip.util.logger import QtipLogger + +logger = QtipLogger('grep').get + +REGEX_FILE = path.join(path.dirname(__file__), 'regex.yaml') class GrepProp(BaseProp): @@ -32,3 +40,65 @@ def grep_in_file(filename, regex): with open(filename, 'r') as f: return filter(lambda x: x is not None, re.finditer(regex, f.read(), re.MULTILINE)) + + +def _parse_logfile(config, paths): + captured = {} + for regex_rules_by_file in config: + filename = \ + '{0}/{1}'.format(paths, regex_rules_by_file[GrepProp.FILENAME]) + for regex in regex_rules_by_file['grep']: + matches = grep_in_file(filename, regex) + for item in matches: + print item.groupdict() + if len(matches) > 1: + temp_dict = defaultdict(list) + for item in [match.groupdict() for match in matches]: + for key in item: + temp_dict[key].append(item[key]) + captured.update(temp_dict) + elif len(matches) == 1: + captured.update(matches[0].groupdict()) + else: + logger.error("Nothing is matched from {0}".format(filename)) + return captured + + +# TODO: Hardcord in Danube, it will be removed in the future. +def parse_sysinfo(config, result_dir): + sysinfo = _parse_logfile(config, result_dir) + if "cpu_idle" in sysinfo: + sysinfo['cpu_usage'] = \ + calculator.calculate_cpu_usage(sysinfo['cpu_idle']) + sysinfo.pop('cpu_idle') + return sysinfo + + +# TODO: Hardcord in Danube, it will be removed in the future. +def parse_test_result(benchmark, config, result_dir): + test_result = _parse_logfile(config, result_dir) + if benchmark == 'dpi': + return calculator.dpi_calculator(test_result) + if benchmark == 'dhrystone' or benchmark == 'whetstone': + return {'total_cpus': test_result['total_cpus'], + 'single_cpu': {'num': test_result['single_cpu'], + 'score': test_result['score'][0]}, + 'multi_cpus': {'num': test_result['multi_cpus'], + 'score': test_result['score'][1]}} + return test_result + + +# TODO: Hardcord in Danube, it will be removed in the future. +def parse_benchmark_result(result_dir): + regex_config = yaml.safe_load(file(REGEX_FILE)) + benchmark = result_dir.split('/')[-1] + result = {'name': benchmark} + + test_result = \ + parse_test_result(benchmark, regex_config[benchmark], result_dir) + result['results'] = test_result.copy() + + sysinfo = parse_sysinfo(regex_config['sysinfo'], result_dir) + result['sysinfo'] = sysinfo.copy() + + return result diff --git a/qtip/collector/parser/regex.yaml b/qtip/collector/parser/regex.yaml new file mode 100644 index 00000000..397f8973 --- /dev/null +++ b/qtip/collector/parser/regex.yaml @@ -0,0 +1,85 @@ +############################################################################## +# Copyright (c) 2017 ZTE Corporation and others. +# +# All rights reserved. This program and the accompanying materials +# are made available under the terms of the Apache License, Version 2.0 +# which accompanies this distribution, and is available at +# http://www.apache.org/licenses/LICENSE-2.0 +############################################################################## + +dhrystone: + - filename: dhrystone + grep: + - '^(?P\d+)\sCPUs in system; running 1 parallel copy of tests$' + - '.+\srunning (?P\d+) parallel copy of tests$' + - '.+\srunning (?P\d+) parallel copies of tests$' + - '^System Benchmarks Index Score \(Partial Only\)\s+(?P\d+\.\d)$' +whetstone: + - filename: whetstone + grep: + - '^(?P\d+)\sCPUs in system; running 1 parallel copy of tests$' + - '.+\srunning (?P\d+) parallel copy of tests$' + - '.+\srunning (?P\d+) parallel copies of tests$' + - '^System Benchmarks Index Score \(Partial Only\)\s+(?P\d+\.\d)$' +dpi: + - filename: dpi_dump.txt + grep: + - |- + ^\s+nDPI throughput:.+?(?P\d+.\d+)\sM\spps.+ + ?(?P\d+.\d+)\sGb\/sec +ramspeed: + - filename: Intmem + grep: + - '^INTEGER\s+BatchRun\s+Copy:\s+?(?P\d+\.\d+)\sMB/s$' + - '^INTEGER\s+BatchRun\s+Scale:\s+?(?P\d+\.\d+)\sMB/s$' + - '^INTEGER\s+BatchRun\s+Add:\s+?(?P\d+\.\d+)\sMB/s$' + - '^INTEGER\s+BatchRun\s+Triad:\s+?(?P\d+\.\d+)\sMB/s$' + - '^INTEGER\s+BatchRun\s+AVERAGE:\s+?(?P\d+\.\d+)\sMB/s$' + - filename: Floatmem + grep: + - '^FL-POINT\s+BatchRun\s+Copy:\s+?(?P\d+\.\d+)\sMB/s$' + - '^FL-POINT\s+BatchRun\s+Scale:\s+?(?P\d+\.\d+)\sMB/s$' + - '^FL-POINT\s+BatchRun\s+Add:\s+?(?P\d+\.\d+)\sMB/s$' + - '^FL-POINT\s+BatchRun\s+Triad:\s+?(?P\d+\.\d+)\sMB/s$' + - '^FL-POINT\s+BatchRun\s+AVERAGE:\s+?(?P\d+\.\d+)\sMB/s$' +ssl: + - filename: RSA_dump + grep: + - |- + ^rsa\s+512\sbits\s.+ + ?(?P\d+\.\d)\s+ + ?(?P\d+\.\d)$ + - |- + ^rsa\s+1024\sbits\s.+ + ?(?P\d+\.\d)\s+ + ?(?P\d+\.\d)$ + - |- + ^rsa\s+2048\sbits\s.+ + ?(?P\d+\.\d)\s+ + ?(?P\d+\.\d)$ + - |- + ^rsa\s+4096\sbits\s.+ + ?(?P\d+\.\d)\s+ + ?(?P\d+\.\d)$ + - filename: AES-128-CBC_dump + grep: + - |- + ^aes-128-cbc\s+ + ?(?P\d+\.\w+)\s+ + ?(?P\d+\.\w+)\s+ + ?(?P\d+\.\w+)\s+ + ?(?P\d+\.\w+)\s+ + ?(?P\d+\.\w+)$ +sysinfo: + - filename: top.log + grep: + - 'Cpu\(s\):.+?(?P\d+\.\d)\sid' + - filename: inxi.log + grep: + - '.+\s+Host:\s+(?P.+)\sKernel' + - '.+\sMemory:\s+(?P.+MB)\s' + - '^CPU\(s\):\s+(?P.+)' + - '.+\sDistro:\s+(?P.+)' + - '.+\sKernel:\s+(?P.+)\sConsole' + - '.+\s+HDD Total Size:\s+(?P.+)\s' + - '.+\sproduct:\s+(?P.+)\sv' \ No newline at end of file -- cgit 1.2.3-korg