mukan-consensus/scripts/qa/reporting/latency_plotter.py
Mukan Erkin Törük ef24c0b67e
Some checks are pending
docker-build-cometbft / vars (push) Waiting to run
docker-build-cometbft / build-images (amd64, ubuntu-24.04) (push) Blocked by required conditions
docker-build-cometbft / build-images (arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
docker-build-cometbft / merge-images (push) Blocked by required conditions
docker-build-e2e-node / vars (push) Waiting to run
docker-build-e2e-node / build-images (amd64, ubuntu-24.04) (push) Blocked by required conditions
docker-build-e2e-node / build-images (arm64, ubuntu-24.04-arm) (push) Blocked by required conditions
docker-build-e2e-node / merge-images (push) Blocked by required conditions
initial: sovereign Mukan Network fork
2026-05-11 03:18:27 +03:00

150 lines
5.2 KiB
Python

import sys
import os
from datetime import datetime
import pytz
import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
release = 'v0.38.0-alpha2'
#FIXME: figure out in which timezone prometheus was running to adjust to UTC.
tz = pytz.timezone('America/Sao_Paulo')
if len(sys.argv) != 2:
print('Pls provide the raw.csv file')
exit()
else:
csvpath = sys.argv[1]
if not os.path.exists(csvpath):
print('Pls provide a valid the raw.csv file')
exit()
print(csvpath)
path = os.path.join('imgs')
#Load the CSV
csv = pd.read_csv(csvpath)
#Transform ns to s in the latency/duration
csv['duration_ns'] = csv['duration_ns'].apply(lambda x: x/10**9)
csv['block_time'] = csv['block_time'].apply(lambda x: x/10**9)
#Group by experiment
groups = csv.groupby(['experiment_id'])
#number of rows and columns in the graph
ncols = 2 if groups.ngroups > 1 else 1
nrows = int( np.ceil(groups.ngroups / ncols)) if groups.ngroups > 1 else 1
fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=(6*ncols, 4*nrows), sharey=False)
fig.tight_layout(pad=5.0)
#Plot experiments as subplots
for (key,ax) in zip(groups.groups.keys(), [axes] if ncols == 1 else axes.flatten()):
group = groups.get_group(key)
ax.set_ylabel('latency (s)')
ax.set_xlabel('experiment time (s)')
ax.set_title(key)
ax.grid(True)
#Group by connection number and transaction rate
paramGroups = group.groupby(['connections','rate'])
for (subKey) in paramGroups.groups.keys():
subGroup = paramGroups.get_group(subKey)
startTime = subGroup.block_time.min()
endTime = subGroup.block_time.max()
localStartTime = tz.localize(datetime.fromtimestamp(startTime)).astimezone(pytz.utc)
localEndTime = tz.localize(datetime.fromtimestamp(endTime)).astimezone(pytz.utc)
subGroup.block_time.apply(lambda x: x - startTime )
mean = subGroup.duration_ns.mean()
print('exp', key ,'start', localEndTime.strftime("%Y-%m-%dT%H:%M:%SZ"), 'end', localStartTime.strftime("%Y-%m-%dT%H:%M:%SZ"), 'duration', endTime - startTime, "mean", mean)
(con,rate) = subKey
label = 'c='+str(con) + ' r='+ str(rate)
ax.axhline(y = mean, color = 'r', linestyle = '-', label="mean")
ax.scatter(subGroup.block_time, subGroup.duration_ns, label=label)
ax.legend()
#Save individual axes
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
fig.savefig(os.path.join(path,'e_'+key + '.png'), bbox_inches=extent.expanded(1.2, 1.3))
fig.suptitle('Vote Extensions Testnet - ' + release)
# Save the figure with subplots
fig.savefig(os.path.join(path,'all_experiments.png'))
#Group by configuration
groups = csv.groupby(['connections','rate'])
#number of rows and columns in the graph
ncols = 2 if groups.ngroups > 1 else 1
nrows = int( np.ceil(groups.ngroups / ncols)) if groups.ngroups > 1 else 1
fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=(6*ncols, 4*nrows), sharey=True)
fig.tight_layout(pad=5.0)
#Plot configurations as subplots
for (key,ax) in zip(groups.groups.keys(), [axes] if ncols == 1 else axes.flatten()):
group = groups.get_group(key)
ax.set_ylabel('latency (s)')
ax.set_xlabel('experiment time (s)')
ax.grid(True)
(con,rate) = key
label = 'c='+str(con) + ' r='+ str(rate)
ax.set_title(label)
#Group by experiment
paramGroups = group.groupby(['experiment_id'])
for (subKey) in paramGroups.groups.keys():
subGroup = paramGroups.get_group(subKey)
startTime = subGroup.block_time.min()
subGroupMod = subGroup.block_time.apply(lambda x: x - startTime)
ax.scatter(subGroupMod, subGroup.duration_ns, label=label)
#ax.legend()
#Save individual axes
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
fig.savefig(os.path.join(path,'c'+str(con) + 'r'+ str(rate) + '.png'), bbox_inches=extent.expanded(1.2, 1.3))
fig.suptitle('Vote Extensions Testnet - ' + release)
# Save the figure with subplots
fig.savefig(os.path.join(path,'all_configs.png'))
fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=(6*ncols, 4*nrows), sharey=True)
fig.tight_layout(pad=5.0)
#Plot configurations as subplots
for (key,ax) in zip(groups.groups.keys(), [axes] if ncols == 1 else axes.flatten()):
group = groups.get_group(key)
ax.set_ylabel('latency (s)')
ax.set_xlabel('experiment time (s)')
ax.grid(True)
(con,rate) = key
label = 'c='+str(con) + ' r='+ str(rate)
ax.set_title(label)
#Group by experiment, but merge them as a single experiment
paramGroups = group.groupby(['experiment_id'])
for (subKey) in paramGroups.groups.keys():
subGroup = paramGroups.get_group(subKey)
startTime = subGroup.block_time.min()
subGroupMod = subGroup.block_time.apply(lambda x: x - startTime)
ax.scatter(subGroupMod, subGroup.duration_ns, marker='o',c='#1f77b4')
#Save individual axes
extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
(con,rate) = key
fig.savefig(os.path.join(path,'c'+str(con) + 'r'+ str(rate) + '_merged.png'), bbox_inches=extent)
plt.show()