1*d9f75844SAndroid Build Coastguard Worker#!/usr/bin/env python 2*d9f75844SAndroid Build Coastguard Worker# Copyright (c) 2019 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker# 4*d9f75844SAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker# that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker# tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker# in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker# be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker"""Plots metrics from stdin. 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard WorkerExpected format: 12*d9f75844SAndroid Build Coastguard WorkerPLOTTABLE_DATA: <json data> 13*d9f75844SAndroid Build Coastguard WorkerWhere json data has the following format: 14*d9f75844SAndroid Build Coastguard Worker{ 15*d9f75844SAndroid Build Coastguard Worker "graph_name": "<graph name>", 16*d9f75844SAndroid Build Coastguard Worker "trace_name": "<test suite name>", 17*d9f75844SAndroid Build Coastguard Worker "units": "<units>", 18*d9f75844SAndroid Build Coastguard Worker "mean": <mean value>, 19*d9f75844SAndroid Build Coastguard Worker "std": <standard deviation value>, 20*d9f75844SAndroid Build Coastguard Worker "samples": [ 21*d9f75844SAndroid Build Coastguard Worker { "time": <sample time in us>, "value": <sample value> }, 22*d9f75844SAndroid Build Coastguard Worker ... 23*d9f75844SAndroid Build Coastguard Worker ] 24*d9f75844SAndroid Build Coastguard Worker} 25*d9f75844SAndroid Build Coastguard Worker""" 26*d9f75844SAndroid Build Coastguard Worker 27*d9f75844SAndroid Build Coastguard Workerimport argparse 28*d9f75844SAndroid Build Coastguard Workerimport fileinput 29*d9f75844SAndroid Build Coastguard Workerimport json 30*d9f75844SAndroid Build Coastguard Workerimport matplotlib.pyplot as plt 31*d9f75844SAndroid Build Coastguard Worker 32*d9f75844SAndroid Build Coastguard WorkerLINE_PREFIX = 'PLOTTABLE_DATA: ' 33*d9f75844SAndroid Build Coastguard Worker 34*d9f75844SAndroid Build Coastguard WorkerGRAPH_NAME = 'graph_name' 35*d9f75844SAndroid Build Coastguard WorkerTRACE_NAME = 'trace_name' 36*d9f75844SAndroid Build Coastguard WorkerUNITS = 'units' 37*d9f75844SAndroid Build Coastguard Worker 38*d9f75844SAndroid Build Coastguard WorkerMICROSECONDS_IN_SECOND = 1e6 39*d9f75844SAndroid Build Coastguard Worker 40*d9f75844SAndroid Build Coastguard Worker 41*d9f75844SAndroid Build Coastguard Workerdef main(): 42*d9f75844SAndroid Build Coastguard Worker parser = argparse.ArgumentParser( 43*d9f75844SAndroid Build Coastguard Worker description='Plots metrics exported from WebRTC perf tests') 44*d9f75844SAndroid Build Coastguard Worker parser.add_argument( 45*d9f75844SAndroid Build Coastguard Worker '-m', 46*d9f75844SAndroid Build Coastguard Worker '--metrics', 47*d9f75844SAndroid Build Coastguard Worker type=str, 48*d9f75844SAndroid Build Coastguard Worker nargs='*', 49*d9f75844SAndroid Build Coastguard Worker help= 50*d9f75844SAndroid Build Coastguard Worker 'Metrics to plot. If nothing specified then will plot all available') 51*d9f75844SAndroid Build Coastguard Worker args = parser.parse_args() 52*d9f75844SAndroid Build Coastguard Worker 53*d9f75844SAndroid Build Coastguard Worker metrics_to_plot = set() 54*d9f75844SAndroid Build Coastguard Worker if args.metrics: 55*d9f75844SAndroid Build Coastguard Worker for metric in args.metrics: 56*d9f75844SAndroid Build Coastguard Worker metrics_to_plot.add(metric) 57*d9f75844SAndroid Build Coastguard Worker 58*d9f75844SAndroid Build Coastguard Worker metrics = [] 59*d9f75844SAndroid Build Coastguard Worker for line in fileinput.input('-'): 60*d9f75844SAndroid Build Coastguard Worker line = line.strip() 61*d9f75844SAndroid Build Coastguard Worker if line.startswith(LINE_PREFIX): 62*d9f75844SAndroid Build Coastguard Worker line = line.replace(LINE_PREFIX, '') 63*d9f75844SAndroid Build Coastguard Worker metrics.append(json.loads(line)) 64*d9f75844SAndroid Build Coastguard Worker else: 65*d9f75844SAndroid Build Coastguard Worker print line 66*d9f75844SAndroid Build Coastguard Worker 67*d9f75844SAndroid Build Coastguard Worker for metric in metrics: 68*d9f75844SAndroid Build Coastguard Worker if len(metrics_to_plot 69*d9f75844SAndroid Build Coastguard Worker ) > 0 and metric[GRAPH_NAME] not in metrics_to_plot: 70*d9f75844SAndroid Build Coastguard Worker continue 71*d9f75844SAndroid Build Coastguard Worker 72*d9f75844SAndroid Build Coastguard Worker figure = plt.figure() 73*d9f75844SAndroid Build Coastguard Worker figure.canvas.set_window_title(metric[TRACE_NAME]) 74*d9f75844SAndroid Build Coastguard Worker 75*d9f75844SAndroid Build Coastguard Worker x_values = [] 76*d9f75844SAndroid Build Coastguard Worker y_values = [] 77*d9f75844SAndroid Build Coastguard Worker start_x = None 78*d9f75844SAndroid Build Coastguard Worker samples = metric['samples'] 79*d9f75844SAndroid Build Coastguard Worker samples.sort(key=lambda x: x['time']) 80*d9f75844SAndroid Build Coastguard Worker for sample in samples: 81*d9f75844SAndroid Build Coastguard Worker if start_x is None: 82*d9f75844SAndroid Build Coastguard Worker start_x = sample['time'] 83*d9f75844SAndroid Build Coastguard Worker # Time is us, we want to show it in seconds. 84*d9f75844SAndroid Build Coastguard Worker x_values.append( 85*d9f75844SAndroid Build Coastguard Worker (sample['time'] - start_x) / MICROSECONDS_IN_SECOND) 86*d9f75844SAndroid Build Coastguard Worker y_values.append(sample['value']) 87*d9f75844SAndroid Build Coastguard Worker 88*d9f75844SAndroid Build Coastguard Worker plt.ylabel('%s (%s)' % (metric[GRAPH_NAME], metric[UNITS])) 89*d9f75844SAndroid Build Coastguard Worker plt.xlabel('time (s)') 90*d9f75844SAndroid Build Coastguard Worker plt.title(metric[GRAPH_NAME]) 91*d9f75844SAndroid Build Coastguard Worker plt.plot(x_values, y_values, marker='x', markersize=3, 92*d9f75844SAndroid Build Coastguard Worker markeredgecolor='red') 93*d9f75844SAndroid Build Coastguard Worker 94*d9f75844SAndroid Build Coastguard Worker plt.show() 95*d9f75844SAndroid Build Coastguard Worker 96*d9f75844SAndroid Build Coastguard Worker 97*d9f75844SAndroid Build Coastguard Workerif __name__ == '__main__': 98*d9f75844SAndroid Build Coastguard Worker main() 99