Skip to content

Commit b9639ac

Browse files
authored
Alerts for Merkle Root Upload and Claims (#176)
Added a new "epoch_percentage" field ([already used elsewhere](https://github.com/jito-foundation/jito-tip-router/blob/master/cli/src/keeper/keeper_metrics.rs#L122)), in creating new alerts for Merkle Root Uploads and MEV/PF Claims. Three new alerts: 1) "Tip Router -- Merkle Root Upload Timer" https://jitolabs.grafana.net/alerting/grafana/beub9k1y9dfcwd/view Alerts if the number of failed MR uploads has not reached zero after 10% of the epoch. 2) "Tip Router -- Claims Timer" https://jitolabs.grafana.net/alerting/grafana/beub9k1y9dfcwd/view Alerts if the number of remaining claims has not reached zero after 33% of the epoch. 3) "Tip Router -- Claims Have Stalled" https://jitolabs.grafana.net/alerting/grafana/fetnet1krxatcf/view Checks the num remaining claims now vs an hour ago, and alerts if those values are the same.
1 parent 6a3ca1d commit b9639ac

File tree

3 files changed

+64
-29
lines changed

3 files changed

+64
-29
lines changed

tip-router-operator-cli/src/claim.rs

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ use tokio::io::BufReader;
3939
use tokio::sync::Mutex;
4040

4141
use crate::{
42-
merkle_tree_collection_file_name, priority_fees,
42+
get_epoch_percentage, merkle_tree_collection_file_name, priority_fees,
4343
rpc_utils::{get_batched_accounts, send_until_blockhash_expires},
4444
Cli,
4545
};
@@ -120,12 +120,20 @@ pub async fn emit_claim_mev_tips_metrics(
120120
.await?;
121121

122122
if validators_processed {
123-
datapoint_info!(
124-
"tip_router_cli.claim_mev_tips-send_summary",
125-
("claim_transactions_left", claims_to_process.len(), i64),
126-
("epoch", epoch, i64),
127-
"cluster" => &cli.cluster,
128-
);
123+
match get_epoch_percentage(&rpc_client).await {
124+
Ok(epoch_percentage) => {
125+
datapoint_info!(
126+
"tip_router_cli.claim_mev_tips-send_summary",
127+
("claim_transactions_left", claims_to_process.len(), i64),
128+
("epoch", epoch, i64),
129+
("epoch_percentage", epoch_percentage, f64),
130+
"cluster" => &cli.cluster,
131+
);
132+
}
133+
Err(e) => {
134+
warn!("Failed to fetch epoch percentage for claims: {:?}", e);
135+
}
136+
}
129137
}
130138

131139
if validators_processed && claims_to_process.is_empty() {
@@ -326,13 +334,21 @@ pub async fn claim_mev_tips(
326334
.await?;
327335

328336
if validators_processed {
329-
datapoint_info!(
330-
"tip_router_cli.claim_mev_tips-send_summary",
331-
("claim_transactions_left", claims_to_process.len(), i64),
332-
("epoch", epoch, i64),
333-
("operator", operator_address, String),
334-
"cluster" => cluster,
335-
);
337+
match get_epoch_percentage(&rpc_client).await {
338+
Ok(epoch_percentage) => {
339+
datapoint_info!(
340+
"tip_router_cli.claim_mev_tips-send_summary",
341+
("claim_transactions_left", claims_to_process.len(), i64),
342+
("epoch", epoch, i64),
343+
("operator", operator_address, String),
344+
("epoch_percentage", epoch_percentage, f64),
345+
"cluster" => cluster,
346+
);
347+
}
348+
Err(e) => {
349+
warn!("Failed to fetch epoch percentage for claims: {:?}", e);
350+
}
351+
}
336352
}
337353

338354
if validators_processed && claims_to_process.is_empty() {

tip-router-operator-cli/src/lib.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,10 @@ use meta_merkle_tree::generated_merkle_tree::StakeMetaCollection;
3838
use meta_merkle_tree::{
3939
generated_merkle_tree::GeneratedMerkleTreeCollection, meta_merkle_tree::MetaMerkleTree,
4040
};
41+
use solana_client::nonblocking::rpc_client::RpcClient;
4142
use solana_metrics::{datapoint_error, datapoint_info};
4243
use solana_runtime::bank::Bank;
44+
use solana_sdk::clock::DEFAULT_SLOTS_PER_EPOCH;
4345
use solana_sdk::pubkey::Pubkey;
4446
use stake_meta_generator::generate_stake_meta_collection;
4547

@@ -630,3 +632,10 @@ pub fn cleanup_tmp_files(snapshot_output_dir: &Path) -> std::result::Result<(),
630632

631633
Ok(())
632634
}
635+
636+
pub async fn get_epoch_percentage(client: &RpcClient) -> anyhow::Result<f64> {
637+
let current_slot = client.get_slot().await? as f64;
638+
let epoch_percentage =
639+
(current_slot % DEFAULT_SLOTS_PER_EPOCH as f64) / DEFAULT_SLOTS_PER_EPOCH as f64;
640+
Ok(epoch_percentage)
641+
}

tip-router-operator-cli/src/submit.rs

Lines changed: 25 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use jito_bytemuck::AccountDeserialize as JitoAccountDeserialize;
66
use jito_priority_fee_distribution_sdk::PriorityFeeDistributionAccount;
77
use jito_tip_distribution_sdk::TipDistributionAccount;
88
use jito_tip_router_core::{ballot_box::BallotBox, config::Config};
9-
use log::{debug, error, info};
9+
use log::{debug, error, info, warn};
1010
use meta_merkle_tree::meta_merkle_tree::MetaMerkleTree;
1111
use solana_account_decoder::UiAccountEncoding;
1212
use solana_client::nonblocking::rpc_client::RpcClient as AsyncRpcClient;
@@ -18,7 +18,7 @@ use solana_metrics::{datapoint_error, datapoint_info};
1818
use solana_sdk::{pubkey::Pubkey, signature::Keypair};
1919

2020
use crate::tip_router::send_set_merkle_root_txs;
21-
use crate::{meta_merkle_tree_file_name, Version};
21+
use crate::{get_epoch_percentage, meta_merkle_tree_file_name, Version};
2222
use crate::{
2323
tip_router::{
2424
cast_vote, get_ncn_config, set_merkle_root_instructions,
@@ -261,19 +261,29 @@ pub async fn submit_to_ncn(
261261
Ok(res) => {
262262
let num_success = res.iter().filter(|r| r.is_ok()).count();
263263
let num_failed = res.iter().filter(|r| r.is_err()).count();
264-
265-
datapoint_info!(
266-
"tip_router_cli.set_merkle_root",
267-
("operator_address", operator_address.to_string(), String),
268-
("epoch", tip_router_target_epoch, i64),
269-
("num_success", num_success, i64),
270-
("num_failed", num_failed, i64),
271-
"cluster" => cluster,
272-
);
273-
info!(
274-
"Set merkle root for {} tip distribution accounts, failed for {}",
275-
num_success, num_failed
276-
);
264+
match get_epoch_percentage(client).await {
265+
Ok(epoch_percentage) => {
266+
datapoint_info!(
267+
"tip_router_cli.set_merkle_root",
268+
("operator_address", operator_address.to_string(), String),
269+
("epoch", tip_router_target_epoch, i64),
270+
("num_success", num_success, i64),
271+
("num_failed", num_failed, i64),
272+
("epoch_percentage", epoch_percentage, f64),
273+
"cluster" => cluster,
274+
);
275+
info!(
276+
"Set merkle root for {} tip distribution accounts, failed for {}",
277+
num_success, num_failed
278+
);
279+
}
280+
Err(e) => {
281+
warn!(
282+
"Failed to fetch epoch percentage for set merkle root: {:?}",
283+
e
284+
);
285+
}
286+
}
277287
}
278288
Err(e) => {
279289
datapoint_error!(

0 commit comments

Comments
 (0)