diff --git a/zebra-state/src/request.rs b/zebra-state/src/request.rs index 87dac6a70e1..7bf45ec02b2 100644 --- a/zebra-state/src/request.rs +++ b/zebra-state/src/request.rs @@ -511,6 +511,33 @@ pub enum Request { }, } +impl Request { + fn variant_name(&self) -> &'static str { + match self { + Request::CommitBlock(_) => "commit_block", + Request::CommitFinalizedBlock(_) => "commit_finalized_block", + Request::AwaitUtxo(_) => "await_utxo", + Request::Depth(_) => "depth", + Request::Tip => "tip", + Request::BlockLocator => "block_locator", + Request::Transaction(_) => "transaction", + Request::Block(_) => "block", + Request::FindBlockHashes { .. } => "find_block_hashes", + Request::FindBlockHeaders { .. } => "find_block_headers", + } + } + + /// Counts metric for StateService call + pub fn count_metric(&self) { + metrics::counter!( + "state.requests", + 1, + "service" => "state", + "type" => self.variant_name() + ); + } +} + #[derive(Clone, Debug, PartialEq, Eq)] /// A read-only query about the chain state, via the /// [`ReadStateService`](crate::service::ReadStateService). @@ -670,6 +697,37 @@ pub enum ReadRequest { UtxosByAddresses(HashSet), } +impl ReadRequest { + fn variant_name(&self) -> &'static str { + match self { + ReadRequest::Tip => "tip", + ReadRequest::Depth(_) => "depth", + ReadRequest::Block(_) => "block", + ReadRequest::Transaction(_) => "transaction", + ReadRequest::BestChainUtxo { .. } => "best_chain_utxo", + ReadRequest::AnyChainUtxo { .. } => "any_chain_utxo", + ReadRequest::BlockLocator => "block_locator", + ReadRequest::FindBlockHashes { .. } => "find_block_hashes", + ReadRequest::FindBlockHeaders { .. } => "find_block_headers", + ReadRequest::SaplingTree { .. } => "sapling_tree", + ReadRequest::OrchardTree { .. } => "orchard_tree", + ReadRequest::AddressBalance { .. } => "address_balance", + ReadRequest::TransactionIdsByAddresses { .. } => "transaction_ids_by_addesses", + ReadRequest::UtxosByAddresses(_) => "utxos_by_addesses", + } + } + + /// Counts metric for ReadStateService call + pub fn count_metric(&self) { + metrics::counter!( + "state.requests", + 1, + "service" => "read_state", + "type" => self.variant_name() + ); + } +} + /// Conversion from read-write [`Request`]s to read-only [`ReadRequest`]s. /// /// Used to dispatch read requests concurrently from the [`StateService`](crate::service::StateService). diff --git a/zebra-state/src/service.rs b/zebra-state/src/service.rs index 18c0ee4ea50..dec20dee0c9 100644 --- a/zebra-state/src/service.rs +++ b/zebra-state/src/service.rs @@ -647,17 +647,12 @@ impl Service for StateService { #[instrument(name = "state", skip(self, req))] fn call(&mut self, req: Request) -> Self::Future { + req.count_metric(); + match req { // Uses queued_non_finalized_blocks and pending_utxos in the StateService // Accesses shared writeable state in the StateService, NonFinalizedState, and ZebraDb. Request::CommitBlock(prepared) => { - metrics::counter!( - "state.requests", - 1, - "service" => "state", - "type" => "commit_block", - ); - let timer = CodeTimer::start(); self.assert_block_can_be_validated(&prepared); @@ -703,13 +698,6 @@ impl Service for StateService { // Uses queued_finalized_blocks and pending_utxos in the StateService. // Accesses shared writeable state in the StateService and ZebraDb. Request::CommitFinalizedBlock(finalized) => { - metrics::counter!( - "state.requests", - 1, - "service" => "state", - "type" => "commit_finalized_block", - ); - let timer = CodeTimer::start(); // # Consensus @@ -758,13 +746,6 @@ impl Service for StateService { // Uses pending_utxos and queued_non_finalized_blocks in the StateService. // If the UTXO isn't in the queued blocks, runs concurrently using the ReadStateService. Request::AwaitUtxo(outpoint) => { - metrics::counter!( - "state.requests", - 1, - "service" => "state", - "type" => "await_utxo", - ); - let timer = CodeTimer::start(); // Prepare the AwaitUtxo future from PendingUxtos. @@ -828,167 +809,14 @@ impl Service for StateService { .boxed() } - // TODO: add a name() method to Request, and combine all the generic read requests - // - // Runs concurrently using the ReadStateService - Request::Depth(_) => { - metrics::counter!( - "state.requests", - 1, - "service" => "state", - "type" => "depth", - ); - - // Redirect the request to the concurrent ReadStateService - let read_service = self.read_service.clone(); - - async move { - let req = req - .try_into() - .expect("ReadRequest conversion should not fail"); - - let rsp = read_service.oneshot(req).await?; - let rsp = rsp.try_into().expect("Response conversion should not fail"); - - Ok(rsp) - } - .boxed() - } - - // Runs concurrently using the ReadStateService - Request::Tip => { - metrics::counter!( - "state.requests", - 1, - "service" => "state", - "type" => "tip", - ); - - // Redirect the request to the concurrent ReadStateService - let read_service = self.read_service.clone(); - - async move { - let req = req - .try_into() - .expect("ReadRequest conversion should not fail"); - - let rsp = read_service.oneshot(req).await?; - let rsp = rsp.try_into().expect("Response conversion should not fail"); - - Ok(rsp) - } - .boxed() - } - - // Runs concurrently using the ReadStateService - Request::BlockLocator => { - metrics::counter!( - "state.requests", - 1, - "service" => "state", - "type" => "block_locator", - ); - - // Redirect the request to the concurrent ReadStateService - let read_service = self.read_service.clone(); - - async move { - let req = req - .try_into() - .expect("ReadRequest conversion should not fail"); - - let rsp = read_service.oneshot(req).await?; - let rsp = rsp.try_into().expect("Response conversion should not fail"); - - Ok(rsp) - } - .boxed() - } - - // Runs concurrently using the ReadStateService - Request::Transaction(_) => { - metrics::counter!( - "state.requests", - 1, - "service" => "state", - "type" => "transaction", - ); - - // Redirect the request to the concurrent ReadStateService - let read_service = self.read_service.clone(); - - async move { - let req = req - .try_into() - .expect("ReadRequest conversion should not fail"); - - let rsp = read_service.oneshot(req).await?; - let rsp = rsp.try_into().expect("Response conversion should not fail"); - - Ok(rsp) - } - .boxed() - } - - // Runs concurrently using the ReadStateService - Request::Block(_) => { - metrics::counter!( - "state.requests", - 1, - "service" => "state", - "type" => "block", - ); - - // Redirect the request to the concurrent ReadStateService - let read_service = self.read_service.clone(); - - async move { - let req = req - .try_into() - .expect("ReadRequest conversion should not fail"); - - let rsp = read_service.oneshot(req).await?; - let rsp = rsp.try_into().expect("Response conversion should not fail"); - - Ok(rsp) - } - .boxed() - } - - // Runs concurrently using the ReadStateService - Request::FindBlockHashes { .. } => { - metrics::counter!( - "state.requests", - 1, - "service" => "state", - "type" => "find_block_hashes", - ); - - // Redirect the request to the concurrent ReadStateService - let read_service = self.read_service.clone(); - - async move { - let req = req - .try_into() - .expect("ReadRequest conversion should not fail"); - - let rsp = read_service.oneshot(req).await?; - let rsp = rsp.try_into().expect("Response conversion should not fail"); - - Ok(rsp) - } - .boxed() - } - // Runs concurrently using the ReadStateService - Request::FindBlockHeaders { .. } => { - metrics::counter!( - "state.requests", - 1, - "service" => "state", - "type" => "find_block_headers", - ); - + Request::Depth(_) + | Request::Tip + | Request::BlockLocator + | Request::Transaction(_) + | Request::Block(_) + | Request::FindBlockHashes { .. } + | Request::FindBlockHeaders { .. } => { // Redirect the request to the concurrent ReadStateService let read_service = self.read_service.clone(); @@ -1020,16 +848,11 @@ impl Service for ReadStateService { #[instrument(name = "read_state", skip(self))] fn call(&mut self, req: ReadRequest) -> Self::Future { + req.count_metric(); + match req { // Used by the StateService. ReadRequest::Tip => { - metrics::counter!( - "state.requests", - 1, - "service" => "read_state", - "type" => "tip", - ); - let timer = CodeTimer::start(); let state = self.clone(); @@ -1055,13 +878,6 @@ impl Service for ReadStateService { // Used by the StateService. ReadRequest::Depth(hash) => { - metrics::counter!( - "state.requests", - 1, - "service" => "read_state", - "type" => "depth", - ); - let timer = CodeTimer::start(); let state = self.clone(); @@ -1087,13 +903,6 @@ impl Service for ReadStateService { // Used by get_block RPC and the StateService. ReadRequest::Block(hash_or_height) => { - metrics::counter!( - "state.requests", - 1, - "service" => "read_state", - "type" => "block", - ); - let timer = CodeTimer::start(); let state = self.clone(); @@ -1123,13 +932,6 @@ impl Service for ReadStateService { // For the get_raw_transaction RPC and the StateService. ReadRequest::Transaction(hash) => { - metrics::counter!( - "state.requests", - 1, - "service" => "read_state", - "type" => "transaction", - ); - let timer = CodeTimer::start(); let state = self.clone(); @@ -1155,13 +957,6 @@ impl Service for ReadStateService { // Currently unused. ReadRequest::BestChainUtxo(outpoint) => { - metrics::counter!( - "state.requests", - 1, - "service" => "read_state", - "type" => "best_chain_utxo", - ); - let timer = CodeTimer::start(); let state = self.clone(); @@ -1187,13 +982,6 @@ impl Service for ReadStateService { // Manually used by the StateService to implement part of AwaitUtxo. ReadRequest::AnyChainUtxo(outpoint) => { - metrics::counter!( - "state.requests", - 1, - "service" => "read_state", - "type" => "any_chain_utxo", - ); - let timer = CodeTimer::start(); let state = self.clone(); @@ -1219,13 +1007,6 @@ impl Service for ReadStateService { // Used by the StateService. ReadRequest::BlockLocator => { - metrics::counter!( - "state.requests", - 1, - "service" => "read_state", - "type" => "block_locator", - ); - let timer = CodeTimer::start(); let state = self.clone(); @@ -1253,13 +1034,6 @@ impl Service for ReadStateService { // Used by the StateService. ReadRequest::FindBlockHashes { known_blocks, stop } => { - metrics::counter!( - "state.requests", - 1, - "service" => "read_state", - "type" => "find_block_hashes", - ); - let timer = CodeTimer::start(); let state = self.clone(); @@ -1291,13 +1065,6 @@ impl Service for ReadStateService { // Used by the StateService. ReadRequest::FindBlockHeaders { known_blocks, stop } => { - metrics::counter!( - "state.requests", - 1, - "service" => "read_state", - "type" => "find_block_headers", - ); - let timer = CodeTimer::start(); let state = self.clone(); @@ -1333,13 +1100,6 @@ impl Service for ReadStateService { } ReadRequest::SaplingTree(hash_or_height) => { - metrics::counter!( - "state.requests", - 1, - "service" => "read_state", - "type" => "sapling_tree", - ); - let timer = CodeTimer::start(); let state = self.clone(); @@ -1368,13 +1128,6 @@ impl Service for ReadStateService { } ReadRequest::OrchardTree(hash_or_height) => { - metrics::counter!( - "state.requests", - 1, - "service" => "read_state", - "type" => "orchard_tree", - ); - let timer = CodeTimer::start(); let state = self.clone(); @@ -1404,13 +1157,6 @@ impl Service for ReadStateService { // For the get_address_balance RPC. ReadRequest::AddressBalance(addresses) => { - metrics::counter!( - "state.requests", - 1, - "service" => "read_state", - "type" => "address_balance", - ); - let timer = CodeTimer::start(); let state = self.clone(); @@ -1443,13 +1189,6 @@ impl Service for ReadStateService { addresses, height_range, } => { - metrics::counter!( - "state.requests", - 1, - "service" => "read_state", - "type" => "transaction_ids_by_addresses", - ); - let timer = CodeTimer::start(); let state = self.clone(); @@ -1486,13 +1225,6 @@ impl Service for ReadStateService { // For the get_address_utxos RPC. ReadRequest::UtxosByAddresses(addresses) => { - metrics::counter!( - "state.requests", - 1, - "service" => "read_state", - "type" => "utxos_by_addresses", - ); - let timer = CodeTimer::start(); let state = self.clone();