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