github.com/aakash4dev/cometbft@v0.38.2/scripts/qa/reporting/prometheus_plotter.py (about)

     1  # pip install numpy pandas matplotlib requests 
     2  
     3  import sys
     4  import os
     5  
     6  import matplotlib as mpl
     7  import matplotlib.pyplot as plt
     8  import matplotlib.dates as md
     9  
    10  import numpy as np 
    11  import pandas as pd 
    12  
    13  import requests 
    14  from urllib.parse import urljoin
    15  
    16  from prometheus_pandas import query
    17  
    18  #release = 'v0.37.0-alpha.2'
    19  release = 'v0.38.0-alpha.2'
    20  path = os.path.join('imgs')
    21  prometheus = query.Prometheus('http://localhost:9090')
    22  
    23  # Time window
    24  #window_size = dict(seconds=150) #CMT 0.37.x-alpha3
    25  #window_size = dict(seconds=126) #TM v0.37 (200 nodes) baseline
    26  #window_size = dict(hours=1, minutes=28, seconds=25) #TM v0.37.0-alpha.2 (rotating)
    27  #window_size = dict(seconds=130) #homogeneous
    28  #window_size = dict(seconds=127) #baseline
    29  #window_size = dict(seconds=115) #CMT v0.38.0-alpha.2 (200 nodes)
    30  #window_size = dict(hours=1, minutes=46) #CMT v0.38.0-alpha.2 (rotating)
    31  window_size = dict(seconds=150) #CMT v0.38.0-alpha.2 (ve baseline)
    32  
    33  ext_window_size = dict(seconds=200)
    34  
    35  # Use the time provided by latency_plotter for the selected experiment.
    36  #left_end = '2023-02-08T13:12:20Z' #cmt2 tm1
    37  #left_end = '2023-02-08T10:31:50Z' #cmt1 tm2
    38  #left_end = '2023-02-14T15:18:00Z' #cmt1 tm1
    39  #left_end = '2023-02-07T18:07:00Z' #homogeneous
    40  #left_end = '2022-10-13T19:41:23Z' #baseline
    41  #left_end = '2023-02-22T18:56:29Z' #CMT v0.37.x-alpha3
    42  #left_end = '2022-10-13T15:57:50Z' #TM v0.37 (200 nodes) baseline
    43  #left_end = '2023-03-20T19:45:35Z' #feature/abci++vef merged with main (7d8c9d426)
    44  #left_end = '2023-05-22T09:39:20Z' #CMT v0.38.0-alpha.2 - 200 nodes
    45  #left_end = '2022-10-10T15:47:15Z' #TM v0.37.0-alpha.2 - rotating
    46  #left_end = '2023-05-23T08:09:50Z' #CMT v0.38.0-alpha.2 - rotating
    47  
    48  #left_end = '2023-05-25T18:18:04Z' #CMT v0.38.0-alpha.2 - ve baseline
    49  #left_end = '2023-05-30T19:05:32Z' #CMT v0.38.0-alpha.2 - ve 2k
    50  left_end = '2023-05-30T20:44:46Z' #CMT v0.38.0-alpha.2 - ve 4k
    51  #left_end = '2023-05-25T19:42:08Z' #CMT v0.38.0-alpha.2 - ve 8k
    52  #left_end = '2023-05-26T00:28:12Z' #CMT v0.38.0-alpha.2 - ve 16k
    53  #left_end = '2023-05-26T02:12:27Z' #CMT v0.38.0-alpha.2 - ve 32k
    54  
    55  useManualrightEnd = False
    56  if useManualrightEnd: 
    57     #right_end = '2023-05-25T18:54:04Z' #CMT v0.38.0-alpha.2 - ve baseline
    58     #right_end = '2023-05-30T19:40:41Z' #CMT v0.38.0-alpha.2 - ve 2k
    59     right_end = '2023-05-30T21:15:37Z' #CMT v0.38.0-alpha.2 - ve 4k
    60     #right_end = '2023-05-25T20:16:00Z' #CMT v0.38.0-alpha.2 - ve 8k
    61     #right_end = '2023-05-26T01:01:57Z' #CMT v0.38.0-alpha.2 - ve 16k 
    62     #right_end = '2023-05-26T02:46:19Z' #CMT v0.38.0-alpha.2 - ve 32k 
    63     time_window = (left_end, right_end)
    64  else:
    65     right_end = pd.to_datetime(left_end) + pd.Timedelta(**window_size)
    66     time_window = (left_end, right_end.strftime('%Y-%m-%dT%H:%M:%SZ'))
    67  
    68  ext_right_end = pd.to_datetime(left_end) + pd.Timedelta(**ext_window_size)
    69  ext_time_window = (left_end, ext_right_end.strftime('%Y-%m-%dT%H:%M:%SZ'))
    70  
    71  
    72  fork='cometbft'
    73  #fork='tendermint'
    74  
    75  # Do prometheus queries, depending on the test case
    76  queries200Nodes = [
    77      (( fork + '_mempool_size',                     time_window[0], time_window[1], '1s'), 'mempool_size',              dict(ylabel='TXs',               xlabel='time (s)', title='Mempool Size',                   legend=False, figsize=(10,6), grid=True, kind='area',stacked=True), False),
    78      (( fork + '_p2p_peers',                        time_window[0], time_window[1], '1s'), 'peers',                     dict(ylabel='# Peers',           xlabel='time (s)', title='Peers',                          legend=False, figsize=(10,6), grid=True), True),
    79      (( 'avg(' + fork + '_mempool_size)',                time_window[0], time_window[1], '1s'), 'avg_mempool_size',          dict(ylabel='TXs',               xlabel='time (s)', title='Average Mempool Size',           legend=False, figsize=(10,6), grid=True), False),
    80      #(( 'cometbft_consensus_height',                 time_window[0], time_window[1], '1s'), 'blocks_regular',           dict(ylabel='# Blocks',          xlabel='time (s)', title='Blocks in time',                 legend=False, figsize=(10,6), grid=True), False), 
    81      (( fork + '_consensus_rounds',                 time_window[0], time_window[1], '1s'), 'rounds',                    dict(ylabel='# Rounds',          xlabel='time (s)', title='Rounds per block',               legend=False, figsize=(10,6), grid=True), False),
    82      (( 'rate(' + fork + '_consensus_height[20s])*60',    time_window[0], time_window[1], '1s'), 'block_rate_regular',        dict(ylabel='Blocks/min',        xlabel='time (s)', title='Rate of block creation',         legend=False, figsize=(10,6), grid=True), True),
    83      #(( 'avg(rate(cometbft_consensus_height[20s])*60)',    time_window[0], time_window[1], '1s'), 'block_rate_avg_reg',   dict(ylabel='Blocks/min',        xlabel='time (s)', title='Rate of block creation',         legend=False, figsize=(10,6), grid=True), False),
    84      #(( 'cometbft_consensus_total_txs',              time_window[0], time_window[1], '1s'), 'total_txs_regular',        dict(ylabel='# TXs',             xlabel='time (s)', title='Transactions in time',           legend=False, figsize=(10,6), grid=True), False),
    85      (( 'rate(' + fork + '_consensus_total_txs[20s])*60', time_window[0], time_window[1], '1s'), 'total_txs_rate_regular',    dict(ylabel='TXs/min',           xlabel='time (s)', title='Rate of transaction processing', legend=False, figsize=(10,6), grid=True), True),
    86      #(( 'avg(rate(cometbft_consensus_total_txs[20s])*60)', time_window[0], time_window[1], '1s'), 'total_txs_rate_avg_reg',   dict(ylabel='TXs/min',       xlabel='time (s)', title='Rate of transaction processing', legend=False, figsize=(10,6), grid=True), False),
    87      (( 'process_resident_memory_bytes',             time_window[0], time_window[1], '1s'), 'memory',                    dict(ylabel='Memory (bytes)',    xlabel='time (s)', title='Memory usage',                   legend=False, figsize=(10,6), grid=True), False),
    88      (( 'avg(process_resident_memory_bytes)',        time_window[0], time_window[1], '1s'), 'avg_memory',                dict(ylabel='Memory (bytes)',    xlabel='time (s)', title='Average Memory usage',           legend=False, figsize=(10,6), grid=True), False),
    89      (( 'node_load1',                                time_window[0], time_window[1], '1s'), 'cpu',                       dict(ylabel='Load',              xlabel='time (s)', title='Node load',                      legend=False, figsize=(10,6), grid=True), False), 
    90      (( 'avg(node_load1)',                           time_window[0], time_window[1], '1s'), 'avg_cpu',                   dict(ylabel='Load',              xlabel='time (s)', title='Average Node load',              legend=False, figsize=(10,6), grid=True), False),
    91      #extended window metrics
    92      (( fork + '_consensus_height',                 ext_time_window[0], ext_time_window[1], '1s'), 'blocks',            dict(ylabel='# Blocks',          xlabel='time (s)', title='Blocks in time',                 legend=False, figsize=(10,6), grid=True), False), 
    93      (( 'rate(' + fork + '_consensus_height[20s])*60',    ext_time_window[0], ext_time_window[1], '1s'), 'block_rate',        dict(ylabel='Blocks/min',        xlabel='time (s)', title='Rate of block creation',         legend=False, figsize=(10,6), grid=True), True),
    94      (( fork + '_consensus_total_txs',              ext_time_window[0], ext_time_window[1], '1s'), 'total_txs',         dict(ylabel='# TXs',             xlabel='time (s)', title='Transactions in time',           legend=False, figsize=(10,6), grid=True), False),
    95      (( 'rate(' + fork + '_consensus_total_txs[20s])*60', ext_time_window[0], ext_time_window[1], '1s'), 'total_txs_rate',    dict(ylabel='TXs/min',           xlabel='time (s)', title='Rate of transaction processing', legend=False, figsize=(10,6), grid=True), True),
    96  ]
    97  
    98  queriesRotating = [
    99      (( 'rate(' + fork + '_consensus_height[20s])*60',    time_window[0], time_window[1], '1s'), 'rotating_block_rate',    dict(ylabel='blocks/min',     xlabel='time', title='Rate of Block Creation',         legend=False, figsize=(10,6), grid=True), False),
   100      (( 'rate(' + fork + '_consensus_total_txs[20s])*60', time_window[0], time_window[1], '1s'), 'rotating_txs_rate',      dict(ylabel='TXs/min',        xlabel='time', title='Rate of Transaction processing', legend=False, figsize=(10,6), grid=True), False),
   101      (( fork + '_consensus_height{job=~"ephemeral.*"} or ' + fork + '_blocksync_latest_block_height{job=~"ephemeral.*"}',
   102                                                           time_window[0], time_window[1], '1s'), 'rotating_eph_heights',   dict(ylabel='height',         xlabel='time', title='Heights of Ephemeral Nodes',     legend=False, figsize=(10,6), grid=True), False),
   103      (( fork + '_p2p_peers',                              time_window[0], time_window[1], '1s'), 'rotating_peers',         dict(ylabel='# peers',        xlabel='time', title='Peers',                          legend=False, figsize=(10,6), grid=True), False),
   104      (( 'avg(process_resident_memory_bytes)',             time_window[0], time_window[1], '1s'), 'rotating_avg_memory',    dict(ylabel='memory (bytes)', xlabel='time', title='Average Memory Usage',           legend=False, figsize=(10,6), grid=True), False),
   105      (( 'node_load1',                                     time_window[0], time_window[1], '1s'), 'rotating_cpu',           dict(ylabel='load',           xlabel='time', title='Node Load',                      legend=False, figsize=(10,6), grid=True), False),
   106  ]
   107  
   108  queriesVExtension= [
   109      (( fork + '_mempool_size',                     time_window[0], time_window[1], '1s'), 'mempool_size',              dict(ylabel='TXs',               xlabel='time (s)', title='Mempool Size',                   legend=False, figsize=(10,6), grid=True, kind='area',stacked=True), False),
   110      (( fork + '_mempool_size',                     time_window[0], time_window[1], '1s'), 'mempool_size_not_stacked',              dict(ylabel='TXs',               xlabel='time (s)', title='Mempool Size',                   legend=False, figsize=(10,6), grid=True, stacked=False), False),
   111      (( fork + '_p2p_peers',                        time_window[0], time_window[1], '1s'), 'peers',                     dict(ylabel='# Peers',           xlabel='time (s)', title='Peers',                          legend=False, figsize=(10,6), grid=True), True),
   112      (( 'avg(' + fork + '_mempool_size)',                time_window[0], time_window[1], '1s'), 'avg_mempool_size',          dict(ylabel='TXs',               xlabel='time (s)', title='Average Mempool Size',           legend=False, figsize=(10,6), grid=True), False),
   113      (( fork + '_consensus_rounds',                 time_window[0], time_window[1], '1s'), 'rounds',                    dict(ylabel='# Rounds',          xlabel='time (s)', title='Rounds per block',               legend=False, figsize=(10,6), grid=True), False),
   114      (( 'process_resident_memory_bytes',             time_window[0], time_window[1], '1s'), 'memory',                    dict(ylabel='Memory (bytes)',    xlabel='time (s)', title='Memory usage',                   legend=False, figsize=(10,6), grid=True), False),
   115      (( 'avg(process_resident_memory_bytes)',        time_window[0], time_window[1], '1s'), 'avg_memory',                dict(ylabel='Memory (bytes)',    xlabel='time (s)', title='Average Memory usage',           legend=False, figsize=(10,6), grid=True), False),
   116      (( 'node_load1',                                time_window[0], time_window[1], '1s'), 'cpu',                       dict(ylabel='Load',              xlabel='time (s)', title='Node load',                      legend=False, figsize=(10,6), grid=True), False), 
   117      (( 'avg(node_load1)',                           time_window[0], time_window[1], '1s'), 'avg_cpu',                   dict(ylabel='Load',              xlabel='time (s)', title='Average Node load',              legend=False, figsize=(10,6), grid=True), False),
   118      (( fork + '_consensus_height',                 time_window[0], time_window[1], '1s'), 'blocks',            dict(ylabel='# Blocks',          xlabel='time (s)', title='Blocks in time',                 legend=False, figsize=(10,6), grid=True), False), 
   119      (( 'rate(' + fork + '_consensus_height[20s])*60',    time_window[0], time_window[1], '1s'), 'block_rate',        dict(ylabel='Blocks/min',        xlabel='time (s)', title='Rate of block creation',         legend=False, figsize=(10,6), grid=True), True),
   120      (( fork + '_consensus_total_txs',              time_window[0], time_window[1], '1s'), 'total_txs',         dict(ylabel='# TXs',             xlabel='time (s)', title='Transactions in time',           legend=False, figsize=(10,6), grid=True), False),
   121      (( 'rate(' + fork + '_consensus_total_txs[20s])*60', time_window[0], time_window[1], '1s'), 'total_txs_rate',    dict(ylabel='TXs/min',           xlabel='time (s)', title='Rate of transaction processing', legend=False, figsize=(10,6), grid=True), True),
   122  ]
   123  
   124  #queries = queries200Nodes
   125  #queries = queriesRotating
   126  queries = queriesVExtension
   127  
   128  
   129  for (query, file_name, pandas_params, plot_average) in queries:
   130      print(query)
   131  
   132      data_frame = prometheus.query_range(*query)
   133      #Tweak the x ticks
   134      data_frame = data_frame.set_index(md.date2num(data_frame.index))
   135  
   136  
   137      pandas_params["title"] += "  -  " + release
   138      ax = data_frame.plot(**pandas_params)
   139      if plot_average:
   140          average = data_frame.mean(axis=1)
   141          data_frame['__average__'] = average
   142          pandas_params['lw'] = 8
   143          pandas_params['style'] = ['--']
   144          pandas_params['color'] = ['red']
   145          ax = data_frame['__average__'].plot(**pandas_params)
   146  
   147      ax.xaxis.set_major_formatter(md.DateFormatter('%H:%M:%S'))
   148      plt.savefig(os.path.join(path, file_name + '.png'))
   149      plt.plot()
   150  
   151  plt.show()