76 lines
2.9 KiB
Python
Executable file
76 lines
2.9 KiB
Python
Executable file
#!/usr/bin/env python
|
|
# Copyright 2016 The Chromium Authors. All rights reserved.
|
|
# Use of this source code is governed by a BSD-style license that can be
|
|
# found in the LICENSE file.
|
|
|
|
import argparse
|
|
import codecs
|
|
import json
|
|
import os
|
|
import sys
|
|
|
|
sys.path.insert(1, os.path.join(os.path.dirname(__file__), '..'))
|
|
from tracing import results_renderer
|
|
from tracing.metrics import metric_runner
|
|
from tracing.metrics import discover
|
|
|
|
def Main(argv):
|
|
all_metrics = discover.DiscoverMetrics(
|
|
['/tracing/metrics/all_metrics.html'])
|
|
parser = argparse.ArgumentParser(
|
|
description='Runs metrics on local traces')
|
|
parser.add_argument('trace_file_or_dir',
|
|
help='A trace file, or a dir containing trace files')
|
|
parser.add_argument('metrics', nargs='+',
|
|
help=('Function names of registered metrics '
|
|
'(not filenames.) '
|
|
'Available metrics are: %s' %
|
|
', '.join(all_metrics)),
|
|
choices=all_metrics, metavar='metricName')
|
|
parser.add_argument('--filename', default='results', type=str,
|
|
help='Output file name (no extension)')
|
|
parser.add_argument('--reset', action='store_true',
|
|
help=('Whether to ignore existing results in HTML file '
|
|
'(if it exists'))
|
|
parser.add_argument('--also-output-json', action='store_true',
|
|
help=('Also output json file containing values. Note that'
|
|
'this only contains the results of current run'))
|
|
|
|
args = parser.parse_args(argv[1:])
|
|
trace_file_or_dir = os.path.abspath(args.trace_file_or_dir)
|
|
|
|
if os.path.isdir(trace_file_or_dir):
|
|
trace_dir = trace_file_or_dir
|
|
traces = [os.path.join(trace_dir, trace) for trace in os.listdir(trace_dir)]
|
|
else:
|
|
traces = [trace_file_or_dir]
|
|
|
|
results = {k: v.AsDict() for k, v in
|
|
metric_runner.RunMetricOnTraces(traces, args.metrics).iteritems()}
|
|
|
|
failures = []
|
|
values = []
|
|
for trace in traces:
|
|
failures.extend(results[trace]['pairs'].get('failures', []))
|
|
values.extend(results[trace]['pairs'].get('values', []))
|
|
if failures:
|
|
print 'Running metric failed:'
|
|
for failure in failures:
|
|
print failure['stack']
|
|
|
|
|
|
output_file = args.filename + '.html'
|
|
open(output_file, 'a').close() # Create file if it doesn't exist.
|
|
with codecs.open(output_file, mode='r+', encoding='utf-8') as output_stream:
|
|
results_renderer.RenderHTMLView(values, output_stream, args.reset)
|
|
print 'HTML result created in file://' + os.path.abspath(output_file)
|
|
|
|
if args.also_output_json:
|
|
output_file = args.filename + '.json'
|
|
with open(output_file, 'w') as f:
|
|
json.dump(values, f, indent=2, sort_keys=True, separators=(',', ': '))
|
|
print 'JSON result created in file://' + os.path.abspath(output_file)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
sys.exit(Main(sys.argv))
|