From 7c4be6dc90a951706fd3d361eaa3c013f70d669f Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 19:51:56 +0000 Subject: [PATCH 1/5] chore: init KeeperMetrics with chain_id and provider_address, bump version Co-Authored-By: Jayant Krishnamurthy --- apps/fortuna/Cargo.toml | 2 +- apps/fortuna/src/command/run.rs | 6 +++++- apps/fortuna/src/keeper.rs | 35 ++++++++++++++++++++++++++++++++- 3 files changed, 40 insertions(+), 3 deletions(-) diff --git a/apps/fortuna/Cargo.toml b/apps/fortuna/Cargo.toml index b8b93e39bf..96d4104339 100644 --- a/apps/fortuna/Cargo.toml +++ b/apps/fortuna/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "fortuna" -version = "7.4.0" +version = "7.4.1" edition = "2021" [dependencies] diff --git a/apps/fortuna/src/command/run.rs b/apps/fortuna/src/command/run.rs index 3130a0c108..a14c95fc53 100644 --- a/apps/fortuna/src/command/run.rs +++ b/apps/fortuna/src/command/run.rs @@ -103,7 +103,11 @@ pub async fn run_keeper( rpc_metrics: Arc, ) -> Result<()> { let mut handles = Vec::new(); - let keeper_metrics = Arc::new(KeeperMetrics::new(metrics_registry).await); + let keeper_metrics = Arc::new({ + let chain_ids: Vec = chains.iter().map(|(id, _)| id.clone()).collect(); + let provider_addresses: Vec
= chains.iter().map(|(_, state)| state.provider_address).collect(); + KeeperMetrics::new(metrics_registry.clone(), chain_ids, provider_addresses).await + }); for (chain_id, chain_config) in chains { let chain_eth_config = config .chains diff --git a/apps/fortuna/src/keeper.rs b/apps/fortuna/src/keeper.rs index 3953d87591..d5c2a9386d 100644 --- a/apps/fortuna/src/keeper.rs +++ b/apps/fortuna/src/keeper.rs @@ -128,9 +128,42 @@ impl Default for KeeperMetrics { } impl KeeperMetrics { - pub async fn new(registry: Arc>) -> Self { + pub async fn new( + registry: Arc>, + chain_ids: Vec, + provider_addresses: Vec
, + ) -> Self { let mut writable_registry = registry.write().await; let keeper_metrics = KeeperMetrics::default(); + + // Initialize metrics for each chain_id and provider_address pair + for (chain_id, provider_address) in chain_ids.into_iter().zip(provider_addresses) { + let account_label = AccountLabel { + chain_id, + address: provider_address.to_string(), + }; + + // Pre-initialize metrics with the account label + keeper_metrics.current_sequence_number.get_or_create(&account_label); + keeper_metrics.end_sequence_number.get_or_create(&account_label); + keeper_metrics.balance.get_or_create(&account_label); + keeper_metrics.collected_fee.get_or_create(&account_label); + keeper_metrics.current_fee.get_or_create(&account_label); + keeper_metrics.target_provider_fee.get_or_create(&account_label); + keeper_metrics.total_gas_spent.get_or_create(&account_label); + keeper_metrics.total_gas_fee_spent.get_or_create(&account_label); + keeper_metrics.requests.get_or_create(&account_label); + keeper_metrics.requests_processed.get_or_create(&account_label); + keeper_metrics.requests_processed_success.get_or_create(&account_label); + keeper_metrics.requests_processed_failure.get_or_create(&account_label); + keeper_metrics.requests_reprocessed.get_or_create(&account_label); + keeper_metrics.reveals.get_or_create(&account_label); + keeper_metrics.request_duration_ms.get_or_create(&account_label); + keeper_metrics.retry_count.get_or_create(&account_label); + keeper_metrics.final_gas_multiplier.get_or_create(&account_label); + keeper_metrics.final_fee_multiplier.get_or_create(&account_label); + keeper_metrics.gas_price_estimate.get_or_create(&account_label); + } writable_registry.register( "current_sequence_number", From b7934d14a9ba65a6713360d7f6d0bf8f0d0cc087 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 19:57:43 +0000 Subject: [PATCH 2/5] fix: properly handle RwLock return values in KeeperMetrics::new Co-Authored-By: Jayant Krishnamurthy --- apps/fortuna/src/keeper.rs | 76 ++++++++++++++++++++++++++++---------- 1 file changed, 57 insertions(+), 19 deletions(-) diff --git a/apps/fortuna/src/keeper.rs b/apps/fortuna/src/keeper.rs index d5c2a9386d..74fdfd17e4 100644 --- a/apps/fortuna/src/keeper.rs +++ b/apps/fortuna/src/keeper.rs @@ -144,25 +144,63 @@ impl KeeperMetrics { }; // Pre-initialize metrics with the account label - keeper_metrics.current_sequence_number.get_or_create(&account_label); - keeper_metrics.end_sequence_number.get_or_create(&account_label); - keeper_metrics.balance.get_or_create(&account_label); - keeper_metrics.collected_fee.get_or_create(&account_label); - keeper_metrics.current_fee.get_or_create(&account_label); - keeper_metrics.target_provider_fee.get_or_create(&account_label); - keeper_metrics.total_gas_spent.get_or_create(&account_label); - keeper_metrics.total_gas_fee_spent.get_or_create(&account_label); - keeper_metrics.requests.get_or_create(&account_label); - keeper_metrics.requests_processed.get_or_create(&account_label); - keeper_metrics.requests_processed_success.get_or_create(&account_label); - keeper_metrics.requests_processed_failure.get_or_create(&account_label); - keeper_metrics.requests_reprocessed.get_or_create(&account_label); - keeper_metrics.reveals.get_or_create(&account_label); - keeper_metrics.request_duration_ms.get_or_create(&account_label); - keeper_metrics.retry_count.get_or_create(&account_label); - keeper_metrics.final_gas_multiplier.get_or_create(&account_label); - keeper_metrics.final_fee_multiplier.get_or_create(&account_label); - keeper_metrics.gas_price_estimate.get_or_create(&account_label); + let _ = keeper_metrics + .current_sequence_number + .get_or_create(&account_label); + let _ = keeper_metrics + .end_sequence_number + .get_or_create(&account_label); + let _ = keeper_metrics + .balance + .get_or_create(&account_label); + let _ = keeper_metrics + .collected_fee + .get_or_create(&account_label); + let _ = keeper_metrics + .current_fee + .get_or_create(&account_label); + let _ = keeper_metrics + .target_provider_fee + .get_or_create(&account_label); + let _ = keeper_metrics + .total_gas_spent + .get_or_create(&account_label); + let _ = keeper_metrics + .total_gas_fee_spent + .get_or_create(&account_label); + let _ = keeper_metrics + .requests + .get_or_create(&account_label); + let _ = keeper_metrics + .requests_processed + .get_or_create(&account_label); + let _ = keeper_metrics + .requests_processed_success + .get_or_create(&account_label); + let _ = keeper_metrics + .requests_processed_failure + .get_or_create(&account_label); + let _ = keeper_metrics + .requests_reprocessed + .get_or_create(&account_label); + let _ = keeper_metrics + .reveals + .get_or_create(&account_label); + let _ = keeper_metrics + .request_duration_ms + .get_or_create(&account_label); + let _ = keeper_metrics + .retry_count + .get_or_create(&account_label); + let _ = keeper_metrics + .final_gas_multiplier + .get_or_create(&account_label); + let _ = keeper_metrics + .final_fee_multiplier + .get_or_create(&account_label); + let _ = keeper_metrics + .gas_price_estimate + .get_or_create(&account_label); } writable_registry.register( From 821f6f11ff8bf5bffd84855727a12d3731933334 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 20:01:39 +0000 Subject: [PATCH 3/5] fix: use keys() and values() instead of iter() for map iteration Co-Authored-By: Jayant Krishnamurthy --- apps/fortuna/src/command/run.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/fortuna/src/command/run.rs b/apps/fortuna/src/command/run.rs index a14c95fc53..f26eb5e65a 100644 --- a/apps/fortuna/src/command/run.rs +++ b/apps/fortuna/src/command/run.rs @@ -104,8 +104,8 @@ pub async fn run_keeper( ) -> Result<()> { let mut handles = Vec::new(); let keeper_metrics = Arc::new({ - let chain_ids: Vec = chains.iter().map(|(id, _)| id.clone()).collect(); - let provider_addresses: Vec
= chains.iter().map(|(_, state)| state.provider_address).collect(); + let chain_ids: Vec = chains.keys().map(|id| id.clone()).collect(); + let provider_addresses: Vec
= chains.values().map(|state| state.provider_address).collect(); KeeperMetrics::new(metrics_registry.clone(), chain_ids, provider_addresses).await }); for (chain_id, chain_config) in chains { From 5b7b09740e9bd4b2d053b7da38cbe8e8a86a4fd4 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 21:00:52 +0000 Subject: [PATCH 4/5] refactor: simplify KeeperMetrics::new to use Vec<(String, Address)> Co-Authored-By: Jayant Krishnamurthy --- apps/fortuna/src/command/run.rs | 8 ++- apps/fortuna/src/keeper.rs | 124 ++++++++++++++------------------ 2 files changed, 60 insertions(+), 72 deletions(-) diff --git a/apps/fortuna/src/command/run.rs b/apps/fortuna/src/command/run.rs index f26eb5e65a..a01324da96 100644 --- a/apps/fortuna/src/command/run.rs +++ b/apps/fortuna/src/command/run.rs @@ -104,9 +104,11 @@ pub async fn run_keeper( ) -> Result<()> { let mut handles = Vec::new(); let keeper_metrics = Arc::new({ - let chain_ids: Vec = chains.keys().map(|id| id.clone()).collect(); - let provider_addresses: Vec
= chains.values().map(|state| state.provider_address).collect(); - KeeperMetrics::new(metrics_registry.clone(), chain_ids, provider_addresses).await + let chain_labels: Vec<(String, Address)> = chains + .iter() + .map(|(id, state)| (id.clone(), state.provider_address)) + .collect(); + KeeperMetrics::new(metrics_registry.clone(), chain_labels).await }); for (chain_id, chain_config) in chains { let chain_eth_config = config diff --git a/apps/fortuna/src/keeper.rs b/apps/fortuna/src/keeper.rs index 74fdfd17e4..bce30c0dad 100644 --- a/apps/fortuna/src/keeper.rs +++ b/apps/fortuna/src/keeper.rs @@ -130,78 +130,10 @@ impl Default for KeeperMetrics { impl KeeperMetrics { pub async fn new( registry: Arc>, - chain_ids: Vec, - provider_addresses: Vec
, + chain_labels: Vec<(String, Address)>, ) -> Self { let mut writable_registry = registry.write().await; let keeper_metrics = KeeperMetrics::default(); - - // Initialize metrics for each chain_id and provider_address pair - for (chain_id, provider_address) in chain_ids.into_iter().zip(provider_addresses) { - let account_label = AccountLabel { - chain_id, - address: provider_address.to_string(), - }; - - // Pre-initialize metrics with the account label - let _ = keeper_metrics - .current_sequence_number - .get_or_create(&account_label); - let _ = keeper_metrics - .end_sequence_number - .get_or_create(&account_label); - let _ = keeper_metrics - .balance - .get_or_create(&account_label); - let _ = keeper_metrics - .collected_fee - .get_or_create(&account_label); - let _ = keeper_metrics - .current_fee - .get_or_create(&account_label); - let _ = keeper_metrics - .target_provider_fee - .get_or_create(&account_label); - let _ = keeper_metrics - .total_gas_spent - .get_or_create(&account_label); - let _ = keeper_metrics - .total_gas_fee_spent - .get_or_create(&account_label); - let _ = keeper_metrics - .requests - .get_or_create(&account_label); - let _ = keeper_metrics - .requests_processed - .get_or_create(&account_label); - let _ = keeper_metrics - .requests_processed_success - .get_or_create(&account_label); - let _ = keeper_metrics - .requests_processed_failure - .get_or_create(&account_label); - let _ = keeper_metrics - .requests_reprocessed - .get_or_create(&account_label); - let _ = keeper_metrics - .reveals - .get_or_create(&account_label); - let _ = keeper_metrics - .request_duration_ms - .get_or_create(&account_label); - let _ = keeper_metrics - .retry_count - .get_or_create(&account_label); - let _ = keeper_metrics - .final_gas_multiplier - .get_or_create(&account_label); - let _ = keeper_metrics - .final_fee_multiplier - .get_or_create(&account_label); - let _ = keeper_metrics - .gas_price_estimate - .get_or_create(&account_label); - } writable_registry.register( "current_sequence_number", @@ -317,6 +249,60 @@ impl KeeperMetrics { keeper_metrics.gas_price_estimate.clone(), ); + // *Important*: When adding a new metric: + // 1. Register it above using `writable_registry.register(...)` + // 2. Add a get_or_create call in the loop below to initialize it for each chain/provider pair + for (chain_id, provider_address) in chain_labels { + let account_label = AccountLabel { + chain_id, + address: provider_address.to_string(), + }; + + let _ = keeper_metrics + .current_sequence_number + .get_or_create(&account_label); + let _ = keeper_metrics + .end_sequence_number + .get_or_create(&account_label); + let _ = keeper_metrics.balance.get_or_create(&account_label); + let _ = keeper_metrics.collected_fee.get_or_create(&account_label); + let _ = keeper_metrics.current_fee.get_or_create(&account_label); + let _ = keeper_metrics + .target_provider_fee + .get_or_create(&account_label); + let _ = keeper_metrics.total_gas_spent.get_or_create(&account_label); + let _ = keeper_metrics + .total_gas_fee_spent + .get_or_create(&account_label); + let _ = keeper_metrics.requests.get_or_create(&account_label); + let _ = keeper_metrics + .requests_processed + .get_or_create(&account_label); + let _ = keeper_metrics + .requests_processed_success + .get_or_create(&account_label); + let _ = keeper_metrics + .requests_processed_failure + .get_or_create(&account_label); + let _ = keeper_metrics + .requests_reprocessed + .get_or_create(&account_label); + let _ = keeper_metrics.reveals.get_or_create(&account_label); + let _ = keeper_metrics + .request_duration_ms + .get_or_create(&account_label); + let _ = keeper_metrics.retry_count.get_or_create(&account_label); + let _ = keeper_metrics + .final_gas_multiplier + .get_or_create(&account_label); + let _ = keeper_metrics + .final_fee_multiplier + .get_or_create(&account_label); + let _ = keeper_metrics + .gas_price_estimate + .get_or_create(&account_label); + } + keeper_metrics } } From 250823b4ca0d04faeacc55fe1badcbc95d7d93aa Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 21:04:43 +0000 Subject: [PATCH 5/5] chore: update Cargo.lock with version bump Co-Authored-By: Jayant Krishnamurthy --- apps/fortuna/Cargo.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/fortuna/Cargo.lock b/apps/fortuna/Cargo.lock index 5815382feb..de20434304 100644 --- a/apps/fortuna/Cargo.lock +++ b/apps/fortuna/Cargo.lock @@ -1503,7 +1503,7 @@ dependencies = [ [[package]] name = "fortuna" -version = "7.4.0" +version = "7.4.1" dependencies = [ "anyhow", "axum",