1
0
Fork 0
mirror of https://github.com/romanz/electrs.git synced 2025-02-23 22:56:55 +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",
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 new_block_rx = rpc.new_block_notification();
@ -84,8 +90,8 @@ fn serve() -> Result<()> {
loop {
// initial sync and compaction may take a few hours
while server_rx.is_empty() {
let done = rpc.sync().context("sync failed")?; // sync a batch of blocks
peers = notify_peers(&rpc, peers); // peers are disconnected on error
let done = duration.observe_duration("sync", || rpc.sync().context("sync failed"))?; // sync a batch of blocks
peers = duration.observe_duration("notify", || notify_peers(&rpc, peers)); // peers are disconnected on error
if !done {
continue; // more blocks to sync
}
@ -94,30 +100,33 @@ fn serve() -> Result<()> {
}
break;
}
select! {
// Handle signals for graceful shutdown
recv(rpc.signal().receiver()) -> result => {
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 {
Ok(_) => (), // sync and update
Err(_) => {
info!("disconnected from bitcoind");
return Ok(());
}
},
// Handle Electrum RPC requests
recv(server_rx) -> event => {
let first = once(event.context("server disconnected")?);
let rest = server_rx.iter().take(server_rx.len());
let events: Vec<Event> = first.chain(rest).collect();
server_batch_size.observe("recv", events.len() as f64);
handle_events(&rpc, &mut peers, events);
},
default(config.wait_duration) => (), // sync and update
}
duration.observe_duration("select", || -> Result<()> {
select! {
// Handle signals for graceful shutdown
recv(rpc.signal().receiver()) -> result => {
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 {
Ok(_) => (), // sync and update
Err(_) => {
info!("disconnected from bitcoind");
return Ok(());
}
},
// Handle Electrum RPC requests
recv(server_rx) -> event => {
let first = once(event.context("server disconnected")?);
let rest = server_rx.iter().take(server_rx.len());
let events: Vec<Event> = first.chain(rest).collect();
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
};
Ok(())
})?;
}
}