1
0
Fork 0
mirror of https://github.com/romanz/electrs.git synced 2025-02-24 15:02:21 +01:00

Add server loop-related metrics

This commit is contained in:
Roman Zeyde 2021-12-24 09:37:30 +02:00
parent 1a8607bb73
commit 4508125ac1

View file

@ -77,6 +77,12 @@ fn serve() -> Result<()> {
"type", "type",
metrics::default_size_buckets(), metrics::default_size_buckets(),
); );
let duration = metrics.histogram_vec(
"server_loop_duration",
"server loop duration",
"step",
metrics::default_duration_buckets(),
);
let mut rpc = Rpc::new(&config, metrics)?; let mut rpc = Rpc::new(&config, metrics)?;
let new_block_rx = rpc.new_block_notification(); let new_block_rx = rpc.new_block_notification();
@ -84,8 +90,8 @@ fn serve() -> Result<()> {
loop { loop {
// initial sync and compaction may take a few hours // initial sync and compaction may take a few hours
while server_rx.is_empty() { while server_rx.is_empty() {
let done = rpc.sync().context("sync failed")?; // sync a batch of blocks let done = duration.observe_duration("sync", || rpc.sync().context("sync failed"))?; // sync a batch of blocks
peers = notify_peers(&rpc, peers); // peers are disconnected on error peers = duration.observe_duration("notify", || notify_peers(&rpc, peers)); // peers are disconnected on error
if !done { if !done {
continue; // more blocks to sync continue; // more blocks to sync
} }
@ -94,30 +100,33 @@ fn serve() -> Result<()> {
} }
break; break;
} }
select! { duration.observe_duration("select", || -> Result<()> {
// Handle signals for graceful shutdown select! {
recv(rpc.signal().receiver()) -> result => { // Handle signals for graceful shutdown
result.context("signal channel disconnected")?; recv(rpc.signal().receiver()) -> result => {
rpc.signal().exit_flag().poll().context("RPC server interrupted")?; result.context("signal channel disconnected")?;
}, rpc.signal().exit_flag().poll().context("RPC server interrupted")?;
// Handle new blocks' notifications },
recv(new_block_rx) -> result => match result { // Handle new blocks' notifications
Ok(_) => (), // sync and update recv(new_block_rx) -> result => match result {
Err(_) => { Ok(_) => (), // sync and update
info!("disconnected from bitcoind"); Err(_) => {
return Ok(()); info!("disconnected from bitcoind");
} return Ok(());
}, }
// Handle Electrum RPC requests },
recv(server_rx) -> event => { // Handle Electrum RPC requests
let first = once(event.context("server disconnected")?); recv(server_rx) -> event => {
let rest = server_rx.iter().take(server_rx.len()); let first = once(event.context("server disconnected")?);
let events: Vec<Event> = first.chain(rest).collect(); let rest = server_rx.iter().take(server_rx.len());
server_batch_size.observe("recv", events.len() as f64); let events: Vec<Event> = first.chain(rest).collect();
handle_events(&rpc, &mut peers, events); server_batch_size.observe("recv", events.len() as f64);
}, duration.observe_duration("handle", || handle_events(&rpc, &mut peers, events));
default(config.wait_duration) => (), // sync and update },
} default(config.wait_duration) => (), // sync and update
};
Ok(())
})?;
} }
} }