github.com/badrootd/nibiru-cometbft@v0.37.5-0.20240307173500-2a75559eee9b/scripts/qa/reporting/latency_plotter.py (about) 1 import sys 2 import os 3 from datetime import datetime 4 import pytz 5 6 import matplotlib as mpl 7 import matplotlib.pyplot as plt 8 9 import numpy as np 10 import pandas as pd 11 12 release = 'v0.37.x-alpha3' 13 14 #FIXME: figure out in which timezone prometheus was running to adjust to UTC. 15 tz = pytz.timezone('America/Sao_Paulo') 16 17 if len(sys.argv) != 2: 18 print('Pls provide the raw.csv file') 19 exit() 20 else: 21 csvpath = sys.argv[1] 22 if not os.path.exists(csvpath): 23 print('Pls provide a valid the raw.csv file') 24 exit() 25 26 print(csvpath) 27 28 path = os.path.join('imgs') 29 30 #Load the CSV 31 csv = pd.read_csv(csvpath) 32 33 #Transform ns to s in the latency/duration 34 csv['duration_ns'] = csv['duration_ns'].apply(lambda x: x/10**9) 35 csv['block_time'] = csv['block_time'].apply(lambda x: x/10**9) 36 37 #Group by experiment 38 groups = csv.groupby(['experiment_id']) 39 40 #number of rows and columns in the graph 41 ncols = 2 if groups.ngroups > 1 else 1 42 nrows = int( np.ceil(groups.ngroups / ncols)) if groups.ngroups > 1 else 1 43 fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=(6*ncols, 4*nrows), sharey=False) 44 fig.tight_layout(pad=5.0) 45 46 47 #Plot experiments as subplots 48 for (key,ax) in zip(groups.groups.keys(), [axes] if ncols == 1 else axes.flatten()): 49 group = groups.get_group(key) 50 ax.set_ylabel('latency (s)') 51 ax.set_xlabel('experiment time (s)') 52 ax.set_title(key) 53 ax.grid(True) 54 55 #Group by connection number and transaction rate 56 paramGroups = group.groupby(['connections','rate']) 57 for (subKey) in paramGroups.groups.keys(): 58 subGroup = paramGroups.get_group(subKey) 59 startTime = subGroup['block_time'].min() 60 dt = tz.localize(datetime.fromtimestamp(startTime)).astimezone(pytz.utc) 61 print('exp ' + key + ' starts at ' + dt.strftime("%Y-%m-%dT%H:%M:%SZ")) 62 subGroupMod = subGroup['block_time'].apply(lambda x: x - startTime) 63 64 (con,rate) = subKey 65 label = 'c='+str(con) + ' r='+ str(rate) 66 ax.scatter(subGroupMod, subGroup.duration_ns, label=label) 67 ax.legend() 68 69 #Save individual axes 70 extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted()) 71 fig.savefig(os.path.join(path,'e_'+key + '.png'), bbox_inches=extent.expanded(1.2, 1.2)) 72 73 fig.suptitle('200-node testnet experiments - ' + release) 74 75 # Save the figure with subplots 76 fig.savefig(os.path.join(path,'all_experiments.png')) 77 78 79 80 #Group by configuration 81 groups = csv.groupby(['connections','rate']) 82 83 #number of rows and columns in the graph 84 ncols = 2 if groups.ngroups > 1 else 1 85 nrows = int( np.ceil(groups.ngroups / ncols)) if groups.ngroups > 1 else 1 86 fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=(6*ncols, 4*nrows), sharey=True) 87 fig.tight_layout(pad=5.0) 88 89 #Plot configurations as subplots 90 for (key,ax) in zip(groups.groups.keys(), [axes] if ncols == 1 else axes.flatten()): 91 group = groups.get_group(key) 92 ax.set_ylabel('latency (s)') 93 ax.set_xlabel('experiment time (s)') 94 ax.grid(True) 95 (con,rate) = key 96 label = 'c='+str(con) + ' r='+ str(rate) 97 ax.set_title(label) 98 99 #Group by experiment 100 paramGroups = group.groupby(['experiment_id']) 101 for (subKey) in paramGroups.groups.keys(): 102 subGroup = paramGroups.get_group(subKey) 103 startTime = subGroup['block_time'].min() 104 subGroupMod = subGroup['block_time'].apply(lambda x: x - startTime) 105 ax.scatter(subGroupMod, subGroup.duration_ns, label=label) 106 #ax.legend() 107 108 #Save individual axes 109 extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted()) 110 fig.savefig(os.path.join(path,'c'+str(con) + 'r'+ str(rate) + '.png'), bbox_inches=extent.expanded(1.2, 1.2)) 111 112 fig.suptitle('200-node testnet configurations - ' + release) 113 114 # Save the figure with subplots 115 fig.savefig(os.path.join(path,'all_configs.png')) 116 117 118 fig, axes = plt.subplots(nrows=nrows, ncols=ncols, figsize=(6*ncols, 4*nrows), sharey=True) 119 fig.tight_layout(pad=5.0) 120 121 #Plot configurations as subplots 122 for (key,ax) in zip(groups.groups.keys(), [axes] if ncols == 1 else axes.flatten()): 123 group = groups.get_group(key) 124 ax.set_ylabel('latency (s)') 125 ax.set_xlabel('experiment time (s)') 126 ax.grid(True) 127 (con,rate) = key 128 label = 'c='+str(con) + ' r='+ str(rate) 129 ax.set_title(label) 130 131 #Group by experiment, but merge them as a single experiment 132 paramGroups = group.groupby(['experiment_id']) 133 for (subKey) in paramGroups.groups.keys(): 134 subGroup = paramGroups.get_group(subKey) 135 startTime = subGroup['block_time'].min() 136 subGroupMod = subGroup['block_time'].apply(lambda x: x - startTime) 137 ax.scatter(subGroupMod, subGroup.duration_ns, marker='o',c='#1f77b4') 138 139 #Save individual axes 140 extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted()) 141 (con,rate) = key 142 fig.savefig(os.path.join(path,'c'+str(con) + 'r'+ str(rate) + '_merged.png'), bbox_inches=extent) 143 144 plt.show()