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
150 lines
5.2 KiB
Python
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()
|