diff --git a/rtc_tools/metrics_plotter.py b/rtc_tools/metrics_plotter.py new file mode 100644 index 0000000000..d045763b51 --- /dev/null +++ b/rtc_tools/metrics_plotter.py @@ -0,0 +1,73 @@ +#!/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: +Where json data has the following format: +{ + "graph_name": "", + "trace_name": "", + "units": "", + "mean": , + "std": , + "samples": [ + { "time": , "value": }, + ... + ] +} +""" + +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(): + 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: + figure = plt.figure() + figure.canvas.set_window_title(metric[TRACE_NAME]) + + x_values = [] + y_values = [] + start_x = None + for sample in metric['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 (ms)') + plt.title(metric[GRAPH_NAME]) + plt.plot(x_values, y_values) + + plt.show() + + +if __name__ == '__main__': + main()