| #!/usr/bin/env python | |
| # Copyright (c) 2019 The WebRTC project authors. All Rights Reserved. | |
| # | |
| # Use of this source code is governed by a BSD-style license | |
| # that can be found in the LICENSE file in the root of the source | |
| # tree. An additional intellectual property rights grant can be found | |
| # in the file PATENTS. All contributing project authors may | |
| # be found in the AUTHORS file in the root of the source tree. | |
| """Plots metrics from stdin. | |
| Expected format: | |
| PLOTTABLE_DATA: <json data> | |
| Where json data has the following format: | |
| { | |
| "graph_name": "<graph name>", | |
| "trace_name": "<test suite name>", | |
| "units": "<units>", | |
| "mean": <mean value>, | |
| "std": <standard deviation value>, | |
| "samples": [ | |
| { "time": <sample time in us>, "value": <sample value> }, | |
| ... | |
| ] | |
| } | |
| """ | |
| import argparse | |
| import fileinput | |
| import json | |
| import matplotlib.pyplot as plt | |
| LINE_PREFIX = 'PLOTTABLE_DATA: ' | |
| GRAPH_NAME = 'graph_name' | |
| TRACE_NAME = 'trace_name' | |
| UNITS = 'units' | |
| MICROSECONDS_IN_SECOND = 1e6 | |
| def main(): | |
| parser = argparse.ArgumentParser( | |
| description='Plots metrics exported from WebRTC perf tests') | |
| parser.add_argument( | |
| '-m', | |
| '--metrics', | |
| type=str, | |
| nargs='*', | |
| help= | |
| 'Metrics to plot. If nothing specified then will plot all available') | |
| args = parser.parse_args() | |
| metrics_to_plot = set() | |
| if args.metrics: | |
| for metric in args.metrics: | |
| metrics_to_plot.add(metric) | |
| metrics = [] | |
| for line in fileinput.input('-'): | |
| line = line.strip() | |
| if line.startswith(LINE_PREFIX): | |
| line = line.replace(LINE_PREFIX, '') | |
| metrics.append(json.loads(line)) | |
| else: | |
| print line | |
| for metric in metrics: | |
| if len(metrics_to_plot | |
| ) > 0 and metric[GRAPH_NAME] not in metrics_to_plot: | |
| continue | |
| figure = plt.figure() | |
| figure.canvas.set_window_title(metric[TRACE_NAME]) | |
| x_values = [] | |
| y_values = [] | |
| start_x = None | |
| samples = metric['samples'] | |
| samples.sort(key=lambda x: x['time']) | |
| for sample in samples: | |
| if start_x is None: | |
| start_x = sample['time'] | |
| # Time is us, we want to show it in seconds. | |
| x_values.append( | |
| (sample['time'] - start_x) / MICROSECONDS_IN_SECOND) | |
| y_values.append(sample['value']) | |
| plt.ylabel('%s (%s)' % (metric[GRAPH_NAME], metric[UNITS])) | |
| plt.xlabel('time (s)') | |
| plt.title(metric[GRAPH_NAME]) | |
| plt.plot(x_values, y_values, marker='x', markersize=3, | |
| markeredgecolor='red') | |
| plt.show() | |
| if __name__ == '__main__': | |
| main() |