gst-plugins-rs/utils/tracers/scripts/queue_levels.py
Sebastian Dröge 2a54d57968 tracers: queue_levels.py: cycle colors
Fix crash when drawing more dataset than the number of colors.
2022-08-11 09:34:46 +00:00

158 lines
4.9 KiB
Python

import argparse
import csv
import re
import matplotlib
import matplotlib.pyplot as plt
import matplotlib.patches as mpatches
parser = argparse.ArgumentParser()
parser.add_argument("file", help="Input file with queue levels")
parser.add_argument("--include-filter", help="Regular expression for queue names that should be included")
parser.add_argument("--exclude-filter", help="Regular expression for queue names that should be excluded")
parser.add_argument("--bytes", help="include bytes levels", action="store_true")
parser.add_argument("--time", help="include time levels (default if none of the others are enabled)", action="store_true")
parser.add_argument("--buffers", help="include buffers levels", action="store_true")
parser.add_argument("--no-max", help="do not include max levels (enabled by default)", action="store_true")
args = parser.parse_args()
include_filter = None
if args.include_filter is not None:
include_filter = re.compile(args.include_filter)
exclude_filter = None
if args.exclude_filter is not None:
exclude_filter = re.compile(args.exclude_filter)
queues = {}
with open(args.file, mode='r', encoding='utf_8', newline='') as csvfile:
reader = csv.reader(csvfile, delimiter=',', quotechar='|')
for row in reader:
if len(row) != 9:
continue
if include_filter is not None and not include_filter.match(row[1]):
continue
if exclude_filter is not None and exclude_filter.match(row[1]):
continue
if not row[1] in queues:
queues[row[1]] = {
'cur-level-bytes': [],
'cur-level-time': [],
'cur-level-buffers': [],
'max-size-bytes': [],
'max-size-time': [],
'max-size-buffers': [],
}
wallclock = float(row[0]) / 1000000000.0
queues[row[1]]['cur-level-bytes'].append((wallclock, int(row[3])))
queues[row[1]]['cur-level-time'].append((wallclock, float(row[4]) / 1000000000.0))
queues[row[1]]['cur-level-buffers'].append((wallclock, int(row[5])))
queues[row[1]]['max-size-bytes'].append((wallclock, int(row[6])))
queues[row[1]]['max-size-time'].append((wallclock, float(row[7]) / 1000000000.0))
queues[row[1]]['max-size-buffers'].append((wallclock, int(row[8])))
matplotlib.rcParams['figure.dpi'] = 200
prop_cycle = plt.rcParams['axes.prop_cycle']
colors = prop_cycle.by_key()['color']
num_plots = 0
axes_names = []
if args.buffers:
num_plots += 1
axes_names.append("buffers")
if args.time:
num_plots += 1
axes_names.append("time (s)")
if args.bytes:
num_plots += 1
axes_names.append("bytes")
if num_plots == 0:
num_plots += 1
axes_names.append("time (s)")
fig, axes = plt.subplots(num_plots, sharex=True)
if num_plots == 1:
axes = [axes]
axes[0].set_xlabel("wallclock (s)")
axes[0].set_ylabel(axes_names[0])
axes[0].tick_params(axis='y')
if num_plots > 1:
axes[1].set_ylabel(axes_names[1])
if num_plots > 2:
axes[2].set_ylabel(axes_names[2])
patches = []
for (i, (queue, values)) in enumerate(queues.items()):
# cycle colors
i = i % len(colors)
axis = 0
if args.buffers:
axes[axis].plot(
[x[0] for x in values['cur-level-buffers']],
[x[1] for x in values['cur-level-buffers']],
'.', label = '{}: cur-level-buffers'.format(queue),
color = colors[i],
)
if not args.no_max:
axes[axis].plot(
[x[0] for x in values['max-size-buffers']],
[x[1] for x in values['max-size-buffers']],
'-', label = '{}: max-size-buffers'.format(queue),
color = colors[i],
)
axis += 1
if args.time:
axes[axis].plot(
[x[0] for x in values['cur-level-time']],
[x[1] for x in values['cur-level-time']],
'.', label = '{}: cur-level-time'.format(queue),
color = colors[i],
)
if not args.no_max:
axes[axis].plot(
[x[0] for x in values['max-size-time']],
[x[1] for x in values['max-size-time']],
'-', label = '{}: max-size-time'.format(queue),
color = colors[i],
)
axis += 1
if args.bytes:
axes[axis].plot(
[x[0] for x in values['cur-level-bytes']],
[x[1] for x in values['cur-level-bytes']],
'.', label = '{}: cur-level-bytes'.format(queue),
color = colors[i],
)
if not args.no_max:
axes[axis].plot(
[x[0] for x in values['max-size-bytes']],
[x[1] for x in values['max-size-bytes']],
'-', label = '{}: max-size-bytes'.format(queue),
color = colors[i],
)
axis += 1
patches.append(mpatches.Patch(color=colors[i], label=queue))
fig.tight_layout()
plt.legend(handles=patches, loc='best')
plt.show()