diff options
Diffstat (limited to '')
-rw-r--r-- | third_party/libwebrtc/rtc_tools/metrics_plotter.py | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/third_party/libwebrtc/rtc_tools/metrics_plotter.py b/third_party/libwebrtc/rtc_tools/metrics_plotter.py new file mode 100644 index 0000000000..804bc8fd71 --- /dev/null +++ b/third_party/libwebrtc/rtc_tools/metrics_plotter.py @@ -0,0 +1,98 @@ +#!/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() |