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()