xref: /aosp_15_r20/external/webrtc/rtc_tools/metrics_plotter.py (revision d9f758449e529ab9291ac668be2861e7a55c2422)
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