diff --git a/.gitignore b/.gitignore index e8163da..737e434 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,6 @@ target # ignore local config files **/*.local.toml + +# ignore .DS_Store recursively +.DS_Store diff --git a/Cargo.lock b/Cargo.lock index de5d562..1abe3ca 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -143,15 +143,15 @@ dependencies = [ [[package]] name = "base64" -version = "0.13.1" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "base64" -version = "0.21.7" +version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bech32" @@ -161,9 +161,9 @@ checksum = "32637268377fc7b10a8c6d51de3e7fba1ce5dd371a96e342b34e6078db558e7f" [[package]] name = "bitcoin" -version = "0.32.8" +version = "0.32.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e499f9fc0407f50fe98af744ab44fa67d409f76b6772e1689ec8485eb0c0f66" +checksum = "9cf93e61f2dbc3e3c41234ca26a65e2c0b0975c52e0f069ab9893ebbede584d3" dependencies = [ "base58ck", "base64 0.21.7", @@ -195,9 +195,9 @@ checksum = "2dee39a0ee5b4095224a0cfc6bf4cc1baf0f9624b96b367e53b66d974e51d953" [[package]] name = "bitcoin-units" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5285c8bcaa25876d07f37e3d30c303f2609179716e11d688f51e8f1fe70063e2" +checksum = "346568ebaab2918487cea76dd55dae13c27bb618cdb737c952e69eb2017c4118" dependencies = [ "bitcoin-internals", "serde", @@ -220,6 +220,16 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4512299f36f043ab09a583e57bceb5a5aab7a73db1805848e8fef3c9e8c78b3" +[[package]] +name = "bitreq" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c84f27ed293cb5218ab015faad9fbb95cf7905865ce71df075c8805a0b33b71" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "btcnode-metrics" version = "2.0.5" @@ -245,9 +255,9 @@ checksum = "1e748733b7cbc798e1434b6ac524f0c1ff2ab456fe201501e6497c8417a4fc33" [[package]] name = "cc" -version = "1.2.60" +version = "1.2.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c5703da9466b66a946814e1adf53ea2c90f10063b86290cc9eb67ce3478a20" +checksum = "a1dce859f0832a7d088c4f1119888ab94ef4b5d6795d1ce05afb7fe159d79f98" dependencies = [ "find-msvc-tools", "shlex", @@ -261,9 +271,9 @@ checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "clap" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b193af5b67834b676abd72466a96c1024e6a6ad978a1f484bd90b85c94041351" +checksum = "1ddb117e43bbf7dacf0a4190fef4d345b9bad68dfc649cb349e7d17d28428e51" dependencies = [ "clap_builder", "clap_derive", @@ -283,9 +293,9 @@ dependencies = [ [[package]] name = "clap_derive" -version = "4.6.0" +version = "4.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1110bd8a634a1ab8cb04345d8d878267d57c3cf1b38d91b71af6686408bbca6a" +checksum = "f2ce8604710f6733aa641a2b3731eaa1e8b3d9973d5e3565da11800813f997a9" dependencies = [ "heck", "proc-macro2", @@ -307,9 +317,9 @@ checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" [[package]] name = "corepc-client" -version = "0.10.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7755b8b9219b23d166a5897b5e2d8266cbdd0de5861d351b96f6db26bcf415f3" +checksum = "dc0d0096927a820ea80d4a43a2355209d9a69ef5b420861bf413c7e667cbff0b" dependencies = [ "bitcoin", "corepc-types", @@ -321,9 +331,9 @@ dependencies = [ [[package]] name = "corepc-types" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c22db78b0223b66f82f92b14345f06307078f76d94b18280431ea9bc6cd9cbb6" +checksum = "1583872320eb2ac629c36753023fd072f1ca1b3b74b20cc62bab055b54278789" dependencies = [ "bitcoin", "serde", @@ -402,9 +412,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.17.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f467dd6dccf739c208452f8014c75c18bb8301b050ad1cfb27153803edb0f51" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" [[package]] name = "heck" @@ -531,12 +541,12 @@ checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" [[package]] name = "jsonrpc" -version = "0.18.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3662a38d341d77efecb73caf01420cfa5aa63c0253fd7bc05289ef9f6616e1bf" +checksum = "629d2b4ae586d04b6bae3c75879d7ddd39325c2b67a9c87634f4ec88a488dc65" dependencies = [ - "base64 0.13.1", - "minreq", + "base64 0.22.1", + "bitreq", "serde", "serde_json", ] @@ -549,9 +559,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.185" +version = "0.2.186" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52ff2c0fe9bc6cb6b14a0592c2ff4fa9ceb83eea9db979b0487cd054946a2b8f" +checksum = "68ab91017fe16c622486840e4c83c9a37afeff978bd239b5293d61ece587de66" [[package]] name = "lock_api" @@ -595,16 +605,6 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" -[[package]] -name = "minreq" -version = "2.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05015102dad0f7d61691ca347e9d9d9006685a64aefb3d79eecf62665de2153d" -dependencies = [ - "serde", - "serde_json", -] - [[package]] name = "mio" version = "1.2.0" @@ -979,9 +979,9 @@ dependencies = [ [[package]] name = "tokio" -version = "1.51.1" +version = "1.52.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f66bf9585cda4b724d3e78ab34b73fb2bbaba9011b9bfdf69dc836382ea13b8c" +checksum = "8fc7f01b389ac15039e4dc9531aa973a135d7a4135281b12d7c1bc79fd57fffe" dependencies = [ "bytes", "libc", @@ -1175,9 +1175,9 @@ dependencies = [ [[package]] name = "winnow" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09dac053f1cd375980747450bfc7250c264eaae0583872e845c0c7cd578872b5" +checksum = "0592e1c9d151f854e6fd382574c3a0855250e1d9b2f99d9281c6e6391af352f1" [[package]] name = "zmij" diff --git a/Cargo.toml b/Cargo.toml index cc4c534..ef16536 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -19,7 +19,7 @@ tracing-subscriber = { version = "0.3", features = ["env-filter"] } clap = { version = "4", features = ["derive"] } toml = "1" anyhow = "1" -corepc-client = { version = "0.10", features = ["client-sync"] } +corepc-client = { version = "0.12", features = ["client-sync"] } thiserror = "2" diff --git a/src/btcnode_metrics_gatherer/collector.rs b/src/btcnode_metrics_gatherer/collector.rs index 0bd2206..0f65fec 100644 --- a/src/btcnode_metrics_gatherer/collector.rs +++ b/src/btcnode_metrics_gatherer/collector.rs @@ -211,31 +211,33 @@ impl MetricsCollector { if let Some(height) = block_height { match self.node.get_block_stats_by_height(height as u32) { Ok(stats) => { - self.metrics.latest_block_txs.set(stats.txs as f64); - self.metrics.latest_block_size.set(stats.total_size as f64); - self.metrics.latest_block_weight.set(stats.total_weight as f64); - self.metrics.latest_block_avg_fee.set(stats.average_fee as f64); - self.metrics.latest_block_avg_fee_rate.set(stats.average_fee_rate as f64); - self.metrics.latest_block_median_fee.set(stats.median_fee as f64); - self.metrics.latest_block_min_fee.set(stats.minimum_fee as f64); - self.metrics.latest_block_max_fee.set(stats.max_fee as f64); - self.metrics.latest_block_min_fee_rate.set(stats.minimum_fee_rate as f64); - self.metrics.latest_block_max_fee_rate.set(stats.max_fee_rate as f64); - self.metrics.latest_block_total_fee.set(stats.total_fee as f64); - self.metrics.latest_block_subsidy.set(stats.subsidy as f64); - self.metrics.latest_block_inputs.set(stats.inputs as f64); - self.metrics.latest_block_outputs.set(stats.outputs as f64); - self.metrics.latest_block_segwit_txs.set(stats.segwit_txs as f64); - self.metrics.latest_block_segwit_total_size.set(stats.segwit_total_size as f64); - self.metrics.latest_block_segwit_total_weight.set(stats.segwit_total_weight as f64); - self.metrics.latest_block_total_out.set(stats.total_out as f64); - self.metrics.latest_block_utxo_increase.set(stats.utxo_increase as f64); - self.metrics.latest_block_fee_rate_10th.set(stats.fee_rate_percentiles[0] as f64); - self.metrics.latest_block_fee_rate_25th.set(stats.fee_rate_percentiles[1] as f64); - self.metrics.latest_block_fee_rate_50th.set(stats.fee_rate_percentiles[2] as f64); - self.metrics.latest_block_fee_rate_75th.set(stats.fee_rate_percentiles[3] as f64); - self.metrics.latest_block_fee_rate_90th.set(stats.fee_rate_percentiles[4] as f64); - info!("Updated latest block stats: height={}, txs={}, total_fee={}", height, stats.txs, stats.total_fee); + self.metrics.latest_block_txs.set(stats.txs.unwrap_or(0) as f64); + self.metrics.latest_block_size.set(stats.total_size.unwrap_or(0) as f64); + self.metrics.latest_block_weight.set(stats.total_weight.unwrap_or(0) as f64); + self.metrics.latest_block_avg_fee.set(stats.average_fee.unwrap_or(0) as f64); + self.metrics.latest_block_avg_fee_rate.set(stats.average_fee_rate.unwrap_or(0) as f64); + self.metrics.latest_block_median_fee.set(stats.median_fee.unwrap_or(0) as f64); + self.metrics.latest_block_min_fee.set(stats.minimum_fee.unwrap_or(0) as f64); + self.metrics.latest_block_max_fee.set(stats.max_fee.unwrap_or(0) as f64); + self.metrics.latest_block_min_fee_rate.set(stats.minimum_fee_rate.unwrap_or(0) as f64); + self.metrics.latest_block_max_fee_rate.set(stats.max_fee_rate.unwrap_or(0) as f64); + self.metrics.latest_block_total_fee.set(stats.total_fee.unwrap_or(0) as f64); + self.metrics.latest_block_subsidy.set(stats.subsidy.unwrap_or(0) as f64); + self.metrics.latest_block_inputs.set(stats.inputs.unwrap_or(0) as f64); + self.metrics.latest_block_outputs.set(stats.outputs.unwrap_or(0) as f64); + self.metrics.latest_block_segwit_txs.set(stats.segwit_txs.unwrap_or(0) as f64); + self.metrics.latest_block_segwit_total_size.set(stats.segwit_total_size.unwrap_or(0) as f64); + self.metrics.latest_block_segwit_total_weight.set(stats.segwit_total_weight.unwrap_or(0) as f64); + self.metrics.latest_block_total_out.set(stats.total_out.unwrap_or(0) as f64); + self.metrics.latest_block_utxo_increase.set(stats.utxo_increase.unwrap_or(0) as f64); + if let Some(p) = stats.fee_rate_percentiles { + self.metrics.latest_block_fee_rate_10th.set(p[0] as f64); + self.metrics.latest_block_fee_rate_25th.set(p[1] as f64); + self.metrics.latest_block_fee_rate_50th.set(p[2] as f64); + self.metrics.latest_block_fee_rate_75th.set(p[3] as f64); + self.metrics.latest_block_fee_rate_90th.set(p[4] as f64); + } + info!("Updated latest block stats: height={}, txs={}, total_fee={}", height, stats.txs.unwrap_or(0), stats.total_fee.unwrap_or(0)); } Err(e) => { warn!("Failed to get block stats for height {height}: {e}"); @@ -360,7 +362,6 @@ mod tests { addresses_processed: None, addresses_rate_limited: None, permissions: vec![], - whitelisted: None, minimum_fee_filter: 0.00001, bytes_sent_per_message: Default::default(), bytes_received_per_message: Default::default(), @@ -405,7 +406,6 @@ mod tests { addresses_processed: None, addresses_rate_limited: None, permissions: vec![], - whitelisted: None, minimum_fee_filter: 0.00001, bytes_sent_per_message: Default::default(), bytes_received_per_message: Default::default(), @@ -496,35 +496,35 @@ mod tests { fn get_block_stats_by_height(&self, _height: u32) -> Result { Ok(GetBlockStats { - average_fee: 15_000, - average_fee_rate: 25, - average_tx_size: 500, - block_hash: "0000000000000000000000000000000000000000000000000000000000000000".into(), - fee_rate_percentiles: [5, 10, 20, 50, 100], - height: 800_000, - inputs: 6000, - max_fee: 500_000, - max_fee_rate: 200, - max_tx_size: 100_000, - median_fee: 10_000, - median_time: 1_699_999_000, - median_tx_size: 250, - minimum_fee: 500, - minimum_fee_rate: 1, - minimum_tx_size: 150, - outputs: 8000, - subsidy: 625_000_000, - segwit_total_size: 1_500_000, - segwit_total_weight: 3_000_000, - segwit_txs: 2000, - time: 1_700_000_000, - total_out: 500_000_000_000, - total_size: 2_000_000, - total_weight: 3_993_000, - total_fee: 37_500_000, - txs: 2500, - utxo_increase: 500, - utxo_size_increase: 25_000, + average_fee: Some(15_000), + average_fee_rate: Some(25), + average_tx_size: Some(500), + block_hash: Some("0000000000000000000000000000000000000000000000000000000000000000".to_string()), + fee_rate_percentiles: Some([5, 10, 20, 50, 100]), + height: Some(800_000), + inputs: Some(6000), + max_fee: Some(500_000), + max_fee_rate: Some(200), + max_tx_size: Some(100_000), + median_fee: Some(10_000), + median_time: Some(1_699_999_000), + median_tx_size: Some(250), + minimum_fee: Some(500), + minimum_fee_rate: Some(1), + minimum_tx_size: Some(150), + outputs: Some(8000), + subsidy: Some(625_000_000), + segwit_total_size: Some(1_500_000), + segwit_total_weight: Some(3_000_000), + segwit_txs: Some(2000), + time: Some(1_700_000_000), + total_out: Some(500_000_000_000), + total_size: Some(2_000_000), + total_weight: Some(3_993_000), + total_fee: Some(37_500_000), + txs: Some(2500), + utxo_increase: Some(500), + utxo_size_increase: Some(25_000), utxo_increase_actual: None, utxo_size_increase_actual: None, }) diff --git a/src/btcnode_metrics_gatherer/node.rs b/src/btcnode_metrics_gatherer/node.rs index 6f3f33e..02e8d4c 100644 --- a/src/btcnode_metrics_gatherer/node.rs +++ b/src/btcnode_metrics_gatherer/node.rs @@ -125,6 +125,6 @@ impl NodeClient for BitcoinNode { } fn get_block_stats_by_height(&self, height: u32) -> Result { - Ok(self.client.get_block_stats_by_height(height)?) + Ok(self.client.get_block_stats_by_height(height, None)?) } }