diff --git a/cli/src/node/mod.rs b/cli/src/node/mod.rs index 3abd32603..84cd8776b 100644 --- a/cli/src/node/mod.rs +++ b/cli/src/node/mod.rs @@ -26,8 +26,8 @@ use tycho_collator::validator::config::ValidatorConfig; use tycho_collator::validator::validator::ValidatorStdImplFactory; use tycho_core::block_strider::{ BlockProvider, BlockStrider, BlockchainBlockProvider, BlockchainBlockProviderConfig, - OptionalBlockStuff, PersistentBlockStriderState, StateSubscriber, StateSubscriberContext, - StateSubscriberExt, StorageBlockProvider, + MetricsSubscriber, OptionalBlockStuff, PersistentBlockStriderState, StateSubscriber, + StateSubscriberContext, StateSubscriberExt, StorageBlockProvider, }; use tycho_core::blockchain_rpc::{ BlockchainRpcClient, BlockchainRpcService, BlockchainRpcServiceConfig, BroadcastListener, @@ -666,7 +666,9 @@ impl Node { .with_state_subscriber( self.state_tracker.clone(), self.storage.clone(), - collator_state_subscriber.chain(rpc_state), + collator_state_subscriber + .chain(rpc_state) + .chain(MetricsSubscriber), ) .build(); diff --git a/collator/src/collator/do_collate.rs b/collator/src/collator/do_collate.rs index 7bcdbab96..322f1824c 100644 --- a/collator/src/collator/do_collate.rs +++ b/collator/src/collator/do_collate.rs @@ -478,11 +478,6 @@ impl CollatorStdImpl { // metrics let labels = [("workchain", self.shard_id.workchain().to_string())]; - metrics::counter!("tycho_do_collate_msgs_exec_count_all_total", &labels) - .increment(collation_data.execute_count_all as _); - metrics::counter!("tycho_do_collate_msgs_exec_count_ext_total", &labels) - .increment(collation_data.execute_count_ext as _); - metrics::counter!("tycho_do_collate_tx_total", &labels) .increment(collation_data.tx_count as _); diff --git a/core/src/block_strider/mod.rs b/core/src/block_strider/mod.rs index 1cc2d9f0a..f667a9e7c 100644 --- a/core/src/block_strider/mod.rs +++ b/core/src/block_strider/mod.rs @@ -19,8 +19,8 @@ pub use self::state_applier::ShardStateApplier; #[cfg(any(test, feature = "test"))] pub use self::subscriber::test::PrintSubscriber; pub use self::subscriber::{ - BlockSubscriber, BlockSubscriberContext, BlockSubscriberExt, ChainSubscriber, NoopSubscriber, - StateSubscriber, StateSubscriberContext, StateSubscriberExt, + BlockSubscriber, BlockSubscriberContext, BlockSubscriberExt, ChainSubscriber, + MetricsSubscriber, NoopSubscriber, StateSubscriber, StateSubscriberContext, StateSubscriberExt, }; mod provider; @@ -126,7 +126,7 @@ where while let Some(next) = self.fetch_next_master_block().await { let started_at = Instant::now(); self.process_mc_block(next.data, next.archive_data).await?; - metrics::histogram!("tycho_process_mc_block_time").record(started_at.elapsed()); + metrics::histogram!("tycho_core_process_mc_block_time").record(started_at.elapsed()); } tracing::info!("block strider loop finished"); @@ -154,11 +154,11 @@ where while let Some(blocks) = download_futures.next().await.transpose()? { process_futures.push(Box::pin(self.process_shard_blocks(&mc_block_id, blocks))); } - metrics::histogram!("tycho_download_shard_blocks_time").record(started_at.elapsed()); + metrics::histogram!("tycho_core_download_sc_blocks_time").record(started_at.elapsed()); // Wait for all shard blocks to be processed while process_futures.next().await.transpose()?.is_some() {} - metrics::histogram!("tycho_process_shard_blocks_time").record(started_at.elapsed()); + metrics::histogram!("tycho_core_process_sc_blocks_time").record(started_at.elapsed()); // Process masterchain block let cx = BlockSubscriberContext { @@ -189,7 +189,7 @@ where tracing::debug!(block_id = %top_block_id, "fetched shard block"); debug_assert_eq!(block.id(), &top_block_id); - metrics::histogram!("tycho_fetch_shard_block_time").record(started_at.elapsed()); + metrics::histogram!("tycho_core_fetch_sc_block_time").record(started_at.elapsed()); // Parse info in advance to make borrow checker happy let info = block.data.load_info()?; @@ -234,7 +234,7 @@ where let started_at = Instant::now(); self.subscriber.handle_block(&cx).await?; - metrics::histogram!("tycho_process_shard_block_time").record(started_at.elapsed()); + metrics::histogram!("tycho_core_process_sc_block_time").record(started_at.elapsed()); self.state.commit_shard(&block_id); } diff --git a/core/src/block_strider/state_applier.rs b/core/src/block_strider/state_applier.rs index 046fc9340..f09c7e3f2 100644 --- a/core/src/block_strider/state_applier.rs +++ b/core/src/block_strider/state_applier.rs @@ -100,7 +100,7 @@ where prev_root_cell, ) .await?; - metrics::histogram!("tycho_apply_block_time").record(started_at.elapsed()); + metrics::histogram!("tycho_core_apply_block_time").record(started_at.elapsed()); // Update metrics let gen_utime = handle.meta().gen_utime() as f64; @@ -108,14 +108,14 @@ where let now = tycho_util::time::now_millis() as f64 / 1000.0; if cx.block.id().is_masterchain() { - metrics::gauge!("tycho_last_mc_block_utime").set(gen_utime); - metrics::gauge!("tycho_last_mc_block_seqno").set(seqno); - metrics::gauge!("tycho_last_mc_block_applied").set(now); + metrics::gauge!("tycho_core_last_mc_block_utime").set(gen_utime); + metrics::gauge!("tycho_core_last_mc_block_seqno").set(seqno); + metrics::gauge!("tycho_core_last_mc_block_applied").set(now); } else { // TODO: only store max - metrics::gauge!("tycho_last_shard_block_utime").set(gen_utime); - metrics::gauge!("tycho_last_shard_block_seqno").set(seqno); - metrics::gauge!("tycho_last_shard_block_applied").set(now); + metrics::gauge!("tycho_core_last_sc_block_utime").set(gen_utime); + metrics::gauge!("tycho_core_last_sc_block_seqno").set(seqno); + metrics::gauge!("tycho_core_last_sc_block_applied").set(now); } // Process state @@ -127,7 +127,7 @@ where state, }; self.inner.state_subscriber.handle_state(&cx).await?; - metrics::histogram!("tycho_subscriber_handle_block_time").record(started_at.elapsed()); + metrics::histogram!("tycho_core_subscriber_handle_block_time").record(started_at.elapsed()); // Mark block as applied handle_storage.store_block_applied(&handle); diff --git a/core/src/block_strider/subscriber/metrics_subscriber.rs b/core/src/block_strider/subscriber/metrics_subscriber.rs new file mode 100644 index 000000000..f5ecc6cb2 --- /dev/null +++ b/core/src/block_strider/subscriber/metrics_subscriber.rs @@ -0,0 +1,133 @@ +use anyhow::Result; +use everscale_types::models::{AccountStatus, ComputePhase, InMsg, MsgInfo, OutMsg, TxInfo}; +use tycho_block_util::block::BlockStuff; + +use crate::block_strider::{ + BlockSubscriber, BlockSubscriberContext, StateSubscriber, StateSubscriberContext, +}; + +#[derive(Debug, Clone, Copy)] +pub struct MetricsSubscriber; + +impl BlockSubscriber for MetricsSubscriber { + type HandleBlockFut<'a> = futures_util::future::Ready>; + + fn handle_block(&self, cx: &BlockSubscriberContext) -> Self::HandleBlockFut<'_> { + if let Err(e) = handle_block(&cx.block) { + tracing::error!("failed to handle block: {e:?}"); + } + futures_util::future::ready(Ok(())) + } +} + +impl StateSubscriber for MetricsSubscriber { + type HandleStateFut<'a> = futures_util::future::Ready>; + + fn handle_state(&self, cx: &StateSubscriberContext) -> Self::HandleStateFut<'_> { + if let Err(e) = handle_block(&cx.block) { + tracing::error!("failed to handle block: {e:?}"); + } + futures_util::future::ready(Ok(())) + } +} + +fn handle_block(block: &BlockStuff) -> Result<()> { + let block_id = block.id(); + let info = block.as_ref().load_info()?; + let extra = block.as_ref().load_extra()?; + + let mut in_msg_count: u32 = 0; + for descr in extra.in_msg_description.load()?.iter() { + let (_, _, in_msg) = descr?; + in_msg_count += matches!( + in_msg, + InMsg::External(_) | InMsg::Immediate(_) | InMsg::Final(_) + ) as u32; + } + + let mut out_msgs_count: u32 = 0; + for descr in extra.out_msg_description.load()?.iter() { + let (_, _, out_msg) = descr?; + out_msgs_count += matches!(out_msg, OutMsg::New(_) | OutMsg::Immediate(_)) as u32; + } + + let mut transaction_count = 0u32; + let mut message_count = 0u32; + let mut ext_message_count = 0u32; + let mut account_blocks_count = 0u32; + let mut contract_deployments = 0u32; + let mut contract_destructions = 0u32; + let mut total_gas_used = 0; + + let account_blocks = extra.account_blocks.load()?; + for entry in account_blocks.iter() { + let (_, _, account_block) = entry?; + account_blocks_count += 1; + + for entry in account_block.transactions.iter() { + let (_, _, tx) = entry?; + let tx = tx.load()?; + + transaction_count += 1; + message_count += tx.in_msg.is_some() as u32 + tx.out_msg_count.into_inner() as u32; + + if let Some(in_msg) = tx.load_in_msg()? { + ext_message_count += matches!(&in_msg.info, MsgInfo::ExtIn(_)) as u32; + } + + let was_active = tx.orig_status == AccountStatus::Active; + let is_active = tx.end_status == AccountStatus::Active; + + contract_deployments += (!was_active && is_active) as u32; + contract_destructions += (was_active && !is_active) as u32; + + total_gas_used += 'gas: { + match tx.load_info()? { + TxInfo::Ordinary(info) => { + if let ComputePhase::Executed(phase) = &info.compute_phase { + break 'gas phase.gas_used.into_inner(); + } + } + TxInfo::TickTock(info) => { + if let ComputePhase::Executed(phase) = &info.compute_phase { + break 'gas phase.gas_used.into_inner(); + } + } + }; + + 0 + }; + } + } + + let out_in_message_ratio = if in_msg_count > 0 { + out_msgs_count as f64 / in_msg_count as f64 + } else { + 0.0 + }; + let out_message_account_ratio = if account_blocks_count > 0 { + out_msgs_count as f64 / account_blocks_count as f64 + } else { + 0.0 + }; + + let labels = &[("workchain", block_id.shard.workchain().to_string())]; + metrics::histogram!("tycho_bc_software_version", labels).record(info.gen_software.version); + metrics::histogram!("tycho_bc_in_msg_count", labels).record(in_msg_count); + metrics::histogram!("tycho_bc_out_msg_count", labels).record(out_msgs_count); + + metrics::counter!("tycho_bc_txs_total", labels).increment(transaction_count as _); + metrics::counter!("tycho_bc_msgs_total", labels).increment(message_count as _); + metrics::counter!("tycho_bc_ext_msgs_total", labels).increment(ext_message_count as _); + + metrics::counter!("tycho_bc_contract_deploy_total", labels) + .increment(contract_deployments as _); + metrics::counter!("tycho_bc_contract_delete_total", labels) + .increment(contract_destructions as _); + + metrics::histogram!("tycho_bc_total_gas_used", labels).record(total_gas_used as f64); + metrics::histogram!("tycho_bc_out_in_msg_ratio", labels).record(out_in_message_ratio); + metrics::histogram!("tycho_bc_out_msg_acc_ratio", labels).record(out_message_account_ratio); + + Ok(()) +} diff --git a/core/src/block_strider/subscriber.rs b/core/src/block_strider/subscriber/mod.rs similarity index 98% rename from core/src/block_strider/subscriber.rs rename to core/src/block_strider/subscriber/mod.rs index 8690596fb..cb0ddc802 100644 --- a/core/src/block_strider/subscriber.rs +++ b/core/src/block_strider/subscriber/mod.rs @@ -8,6 +8,10 @@ use tycho_block_util::archive::ArchiveData; use tycho_block_util::block::BlockStuff; use tycho_block_util::state::ShardStateStuff; +pub use self::metrics_subscriber::MetricsSubscriber; + +mod metrics_subscriber; + // === trait BlockSubscriber === pub struct BlockSubscriberContext { diff --git a/network/src/dht/mod.rs b/network/src/dht/mod.rs index d0b7df95c..ef9be5929 100644 --- a/network/src/dht/mod.rs +++ b/network/src/dht/mod.rs @@ -42,39 +42,6 @@ const METRIC_IN_REQ_FIND_VALUE_TOTAL: &str = "tycho_net_dht_in_req_find_value_to const METRIC_IN_REQ_GET_NODE_INFO_TOTAL: &str = "tycho_net_dht_in_req_get_node_info_total"; const METRIC_IN_REQ_STORE_TOTAL: &str = "tycho_net_dht_in_req_store_value_total"; -// Registered in `DhtServiceBuilder::build` -fn describe_metrics() { - metrics::describe_counter!( - METRIC_IN_REQ_TOTAL, - "Number of incoming DHT requests over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_FAIL_TOTAL, - "Number of failed incoming DHT requests over time" - ); - - metrics::describe_counter!( - METRIC_IN_REQ_WITH_PEER_INFO_TOTAL, - "Number of incoming DHT requests with peer info over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_FIND_NODE_TOTAL, - "Number of incoming DHT FindNode requests over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_FIND_VALUE_TOTAL, - "Number of incoming DHT FindValue requests over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_GET_NODE_INFO_TOTAL, - "Number of incoming DHT GetNodeInfo requests over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_STORE_TOTAL, - "Number of incoming DHT Store requests over time" - ); -} - #[derive(Clone)] pub struct DhtClient { inner: Arc, @@ -319,8 +286,6 @@ impl DhtServiceBuilder { } pub fn build(self) -> (DhtServiceBackgroundTasks, DhtService) { - describe_metrics(); - let config = self.config.unwrap_or_default(); let storage = { diff --git a/network/src/network/connection_manager.rs b/network/src/network/connection_manager.rs index f4641f4be..5a93119fc 100644 --- a/network/src/network/connection_manager.rs +++ b/network/src/network/connection_manager.rs @@ -41,54 +41,6 @@ const METRIC_CONNECTIONS_PENDING_DIALS: &str = "tycho_net_conn_pending_dials"; const METRIC_ACTIVE_PEERS: &str = "tycho_net_active_peers"; const METRIC_KNOWN_PEERS: &str = "tycho_net_known_peers"; -pub fn describe_metrics() { - metrics::describe_histogram!( - METRIC_CONNECTION_OUT_TIME, - "Time taken to establish an outgoing connection" - ); - metrics::describe_histogram!( - METRIC_CONNECTION_IN_TIME, - "Time taken to establish an incoming connection" - ); - - metrics::describe_counter!( - METRIC_CONNECTIONS_OUT_TOTAL, - "Number of established outgoing connections over time" - ); - metrics::describe_counter!( - METRIC_CONNECTIONS_IN_TOTAL, - "Number of established incoming connections over time" - ); - metrics::describe_counter!( - METRIC_CONNECTIONS_OUT_FAIL_TOTAL, - "Number of failed outgoing connections over time" - ); - metrics::describe_counter!( - METRIC_CONNECTIONS_IN_FAIL_TOTAL, - "Number of failed incoming connections over time" - ); - - metrics::describe_gauge!( - METRIC_CONNECTIONS_ACTIVE, - "Number of currently active connections" - ); - metrics::describe_gauge!( - METRIC_CONNECTIONS_PENDING, - "Number of currently pending connections" - ); - metrics::describe_gauge!( - METRIC_CONNECTIONS_PARTIAL, - "Number of currently half-resolved connections" - ); - metrics::describe_gauge!( - METRIC_CONNECTIONS_PENDING_DIALS, - "Number of currently pending connectivity checks" - ); - - metrics::describe_gauge!(METRIC_ACTIVE_PEERS, "Number of currently active peers"); - metrics::describe_gauge!(METRIC_KNOWN_PEERS, "Number of currently known peers"); -} - #[derive(Debug)] pub(crate) enum ConnectionManagerRequest { Connect(Address, PeerId, CallbackTx), diff --git a/network/src/network/mod.rs b/network/src/network/mod.rs index d1c261fa7..810303bb4 100644 --- a/network/src/network/mod.rs +++ b/network/src/network/mod.rs @@ -29,13 +29,6 @@ mod peer; mod request_handler; mod wire; -// Registered in `NetworkBuilder::build` -fn describe_metrics() { - connection_manager::describe_metrics(); - request_handler::describe_metrics(); - peer::describe_metrics(); -} - pub struct NetworkBuilder { mandatory_fields: MandatoryFields, optional_fields: BuilderFields, @@ -89,8 +82,6 @@ impl NetworkBuilder { S: Send + Sync + Clone + 'static, S: Service, { - describe_metrics(); - let config = self.optional_fields.config.unwrap_or_default(); let quic_config = config.quic.clone().unwrap_or_default(); let (service_name, private_key) = self.mandatory_fields; diff --git a/network/src/network/peer.rs b/network/src/network/peer.rs index deae5bb7e..d4b4c356f 100644 --- a/network/src/network/peer.rs +++ b/network/src/network/peer.rs @@ -22,31 +22,6 @@ const METRIC_OUT_MESSAGES_TOTAL: &str = "tycho_net_out_messages_total"; const METRIC_OUT_QUERIES: &str = "tycho_net_out_queries"; const METRIC_OUT_MESSAGES: &str = "tycho_net_out_messages"; -pub fn describe_metrics() { - metrics::describe_histogram!( - METRIC_OUT_QUERIES_TIME, - metrics::Unit::Seconds, - "Duration of outgoing queries" - ); - metrics::describe_histogram!( - METRIC_OUT_MESSAGES_TIME, - metrics::Unit::Seconds, - "Duration of outgoing messages" - ); - - metrics::describe_counter!( - METRIC_OUT_QUERIES_TOTAL, - "Number of outgoing queries over time" - ); - metrics::describe_counter!( - METRIC_OUT_MESSAGES_TOTAL, - "Number of outgoing messages over time" - ); - - metrics::describe_gauge!(METRIC_OUT_QUERIES, "Current number of outgoing queries"); - metrics::describe_gauge!(METRIC_OUT_MESSAGES, "Current number of outgoing messages"); -} - #[derive(Clone)] pub struct Peer { connection: Connection, diff --git a/network/src/network/request_handler.rs b/network/src/network/request_handler.rs index 57defad88..e23d87189 100644 --- a/network/src/network/request_handler.rs +++ b/network/src/network/request_handler.rs @@ -25,37 +25,6 @@ const METRIC_IN_DATAGRAMS_TOTAL: &str = "tycho_net_in_datagrams_total"; // Gauges const METRIC_REQ_HANDLERS: &str = "tycho_net_req_handlers"; -pub fn describe_metrics() { - metrics::describe_histogram!( - METRIC_IN_QUERIES_TIME, - metrics::Unit::Seconds, - "Duration of incoming queries handlers" - ); - metrics::describe_histogram!( - METRIC_IN_MESSAGES_TIME, - metrics::Unit::Seconds, - "Duration of incoming messages handlers" - ); - - metrics::describe_counter!( - METRIC_IN_QUERIES_TOTAL, - "Number of incoming queries over time" - ); - metrics::describe_counter!( - METRIC_IN_MESSAGES_TOTAL, - "Number of incoming messages over time" - ); - metrics::describe_counter!( - METRIC_IN_DATAGRAMS_TOTAL, - "Number of incoming datagrams over time" - ); - - metrics::describe_gauge!( - METRIC_REQ_HANDLERS, - "Current number of incoming request handlers" - ); -} - pub(crate) struct InboundRequestHandler { config: Arc, connection: Connection, diff --git a/rpc/src/endpoint/jrpc/extractor.rs b/rpc/src/endpoint/jrpc/extractor.rs index f5fa24db8..a390df6a3 100644 --- a/rpc/src/endpoint/jrpc/extractor.rs +++ b/rpc/src/endpoint/jrpc/extractor.rs @@ -12,17 +12,6 @@ use serde_json::value::RawValue; const METRIC_IN_REQ_TOTAL: &str = "tycho_rpc_in_req_total"; const METRIC_IN_REQ_FAIL_TOTAL: &str = "tycho_rpc_in_req_fail_total"; -pub fn describe_metrics() { - metrics::describe_counter!( - METRIC_IN_REQ_TOTAL, - "Number of incoming JRPC requests over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_FAIL_TOTAL, - "Number of failed incoming JRPC requests over time" - ); -} - pub trait ParseParams { type Params; diff --git a/rpc/src/endpoint/jrpc/mod.rs b/rpc/src/endpoint/jrpc/mod.rs index 88c0a09b7..cbe976d6d 100644 --- a/rpc/src/endpoint/jrpc/mod.rs +++ b/rpc/src/endpoint/jrpc/mod.rs @@ -35,55 +35,6 @@ const METRIC_IN_REQ_GET_TRANSACTIONS_LIST_TOTAL: &str = const METRIC_IN_REQ_GET_TRANSACTION_TOTAL: &str = "tycho_rpc_in_req_get_transaction_total"; const METRIC_IN_REQ_GET_DST_TRANSACTION_TOTAL: &str = "tycho_rpc_in_req_get_dst_transaction_total"; -pub fn describe_metrics() { - extractor::describe_metrics(); - - metrics::describe_counter!( - METRIC_IN_REQ_GET_CAPABILITIES_TOTAL, - "Number of incoming JRPC getCapabilities requests over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_GET_LATEST_KEY_BLOCK_TOTAL, - "Number of incoming JRPC getLatestKeyBlock requests over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_GET_BLOCKCHAIN_CONFIG_TOTAL, - "Number of incoming JRPC getBlockchainConfig requests over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_GET_STATUS_TOTAL, - "Number of incoming JRPC getStatus requests over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_GET_TIMINGS_TOTAL, - "Number of incoming JRPC getTimings requests over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_SEND_MESSAGE_TOTAL, - "Number of incoming JRPC sendMessage requests over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_GET_CONTRACT_STATE_TOTAL, - "Number of incoming JRPC getContractState requests over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_GET_ACCOUNTS_BY_CODE_HASH_TOTAL, - "Number of incoming JRPC getAccountsByCodeHash requests over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_GET_TRANSACTIONS_LIST_TOTAL, - "Number of incoming JRPC getTransactionsList requests over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_GET_TRANSACTION_TOTAL, - "Number of incoming JRPC getTransaction requests over time" - ); - metrics::describe_counter!( - METRIC_IN_REQ_GET_DST_TRANSACTION_TOTAL, - "Number of incoming JRPC getDstTransaction requests over time" - ); -} - declare_jrpc_method! { pub enum MethodParams: Method { GetCapabilities(EmptyParams), diff --git a/rpc/src/endpoint/mod.rs b/rpc/src/endpoint/mod.rs index bee7edd7f..c9020105e 100644 --- a/rpc/src/endpoint/mod.rs +++ b/rpc/src/endpoint/mod.rs @@ -18,8 +18,6 @@ pub struct RpcEndpoint { impl RpcEndpoint { pub async fn bind(state: RpcState) -> Result { - jrpc::describe_metrics(); - let listener = TcpListener::bind(state.config().listen_addr).await?; Ok(Self { listener, state }) } diff --git a/scripts/gen-dashboard.py b/scripts/gen-dashboard.py index e5672aeea..39756dcc4 100644 --- a/scripts/gen-dashboard.py +++ b/scripts/gen-dashboard.py @@ -19,10 +19,12 @@ target, template, Expr, - expr_aggr, + Heatmap, + expr_histogram_quantile, expr_sum_rate, heatmap_panel, yaxis, + DATASOURCE, ) @@ -30,37 +32,6 @@ def heatmap_color_warm() -> HeatmapColor: return HeatmapColor() -def expr_histogram_full( - quantile: float, - metrics: str, - label_selectors: list[str] = [], - by_labels: list[str] = [], -) -> Expr: - # sum(rate(metrics_bucket{label_selectors}[$__rate_interval])) by (le) - assert not metrics.endswith( - "_bucket" - ), f"'{metrics}' should not specify '_bucket' suffix manually" - - by_labels = list(filter(lambda label: label != "le", by_labels)) - sum_rate_of_buckets = expr_sum_rate( - metrics + "_bucket", - label_selectors=label_selectors, - by_labels=by_labels + ["le"], - ) - - # histogram_quantile({quantile}, {sum_rate_of_buckets}) - return expr_aggr( - metric=f"{sum_rate_of_buckets}", - aggr_op="histogram_quantile", - aggr_param=f"{quantile}", - label_selectors=[], - by_labels=[], - ).extra( - # Do not attach default label selector again. - default_label_selectors=[] - ) - - def create_gauge_panel( expr, title, unit_format=UNITS.NUMBER_FORMAT, labels=[] ) -> Panel: @@ -98,6 +69,46 @@ def create_heatmap_panel( ) +def create_heatmap_quantile_panel( + metric_name: str, + title: str, + description=None, + label_selectors: list[str] = [], + yaxis=yaxis(UNITS.NO_FORMAT), + tooltip=Tooltip(shared=True, valueType="individual"), + color=heatmap_color_warm(), + decimals=1, + data_source=DATASOURCE, +) -> Panel: + metric_name = f"{metric_name}_" + t = target( + expr=expr_sum_rate( + metric_name, label_selectors=label_selectors, by_labels=["quintile"] + ), + ) + # Make sure targets are in heatmap format. + t.format = "heatmap" + # Heatmap target legendFormat should be "{{le}}" + t.legendFormat = "{{quintile}}" + # Overrides yaxis decimal places. + yaxis.decimals = decimals + return Heatmap( + title=title, + dataSource=data_source, + description=description, + targets=[t], + yAxis=yaxis, + color=color, + dataFormat="tsbuckets", + yBucketBound="upper", + tooltip=tooltip, + extraJson={"tooltip": {"showHistogram": True, "show": True}}, + hideZeroBuckets=True, + maxDataPoints=512, + options={}, + ) + + def create_row(name, metrics) -> RowPanel: layout = Layout(name) for i in range(0, len(metrics), 2): @@ -106,6 +117,39 @@ def create_row(name, metrics) -> RowPanel: return layout.row_panel +def core_bc() -> RowPanel: + metrics = [ + create_counter_panel("tycho_bc_txs_total", "Number of transactions over time"), + create_counter_panel( + "tycho_bc_ext_msgs_total", "Number of external messages over time" + ), + create_counter_panel("tycho_bc_msgs_total", "Number of all messages over time"), + create_counter_panel( + "tycho_bc_contract_deploy_total", "Number of contract deployments over time" + ), + create_counter_panel( + "tycho_bc_contract_delete_total", "Number of contract deletions over time" + ), + create_heatmap_quantile_panel( + "tycho_bc_in_msg_count", "Number of inbound messages per block" + ), + create_heatmap_quantile_panel( + "tycho_bc_out_msg_count", "Number of outbound messages per block" + ), + create_heatmap_quantile_panel( + "tycho_bc_out_in_msg_ratio", "Out/In message ratio per block" + ), + create_heatmap_quantile_panel( + "tycho_bc_out_msg_acc_ratio", + "Out message/Account ratio per block", + ), + create_heatmap_quantile_panel( + "tycho_bc_total_gas_used", "Total gas used per block" + ), + ] + return create_row("Blockchain", metrics) + + def net_conn_manager() -> RowPanel: metrics = [ create_heatmap_panel( @@ -238,18 +282,18 @@ def core_block_strider() -> RowPanel: "tycho_process_mc_block_time", "Masterchain block processing time" ), create_heatmap_panel( - "tycho_process_shard_block_time", + "tycho_process_sc_block_time", "Shard block processing time", ), create_heatmap_panel( - "tycho_fetch_shard_block_time", "Shard block downloading time" + "tycho_fetch_sc_block_time", "Shard block downloading time" ), create_heatmap_panel( - "tycho_download_shard_blocks_time", + "tycho_download_sc_blocks_time", "Total time to download all shard blocks", ), create_heatmap_panel( - "tycho_process_shard_blocks_time", "Total time to process all shard blocks" + "tycho_process_sc_blocks_time", "Total time to process all shard blocks" ), ] return create_row("Core Block Strider", metrics) @@ -315,11 +359,11 @@ def jrpc() -> RowPanel: def collator_do_collate() -> RowPanel: metrics = [ create_counter_panel( - "tycho_do_collate_msgs_exec_count_all_total", + "tycho_do_collate_msgs_exec_count_all_sum", "Number of all executed messages over time", ), create_counter_panel( - "tycho_do_collate_msgs_exec_count_ext_total", + "tycho_do_collate_msgs_exec_count_ext_sum", "Number of executed external messages over time", ), create_counter_panel( @@ -368,12 +412,13 @@ def templates() -> Templating: templating=templates(), refresh="5s", panels=[ + core_bc(), + core_block_strider(), collator_do_collate(), net_conn_manager(), net_request_handler(), net_peer(), net_dht(), - core_block_strider(), jrpc(), ], annotations=Annotations(),