#!/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 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()