summaryrefslogtreecommitdiffstats
path: root/third_party/libwebrtc/rtc_tools/metrics_plotter.py
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/libwebrtc/rtc_tools/metrics_plotter.py')
-rw-r--r--third_party/libwebrtc/rtc_tools/metrics_plotter.py98
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()