feat: log reader DB pool stats every minute

This commit is contained in:
Greg Heartsfield 2022-12-25 10:43:47 -06:00
parent 3e4ae4aeec
commit ce0e00ffb3
2 changed files with 18 additions and 8 deletions

View File

@ -94,6 +94,16 @@ pub fn build_pool(
pool pool
} }
/// Display database pool stats every 1 minute
pub async fn monitor_pool(name: &str, pool: SqlitePool) {
let sleep_dur = Duration::from_secs(60);
loop {
log_pool_stats(name, &pool);
tokio::time::sleep(sleep_dur).await;
}
}
/// Perform normal maintenance /// Perform normal maintenance
pub fn optimize_db(conn: &mut PooledConnection) -> Result<()> { pub fn optimize_db(conn: &mut PooledConnection) -> Result<()> {
let start = Instant::now(); let start = Instant::now();
@ -671,15 +681,13 @@ fn _pool_at_capacity(pool: &SqlitePool) -> bool {
fn log_pool_stats(name: &str, pool: &SqlitePool) { fn log_pool_stats(name: &str, pool: &SqlitePool) {
let state: r2d2::State = pool.state(); let state: r2d2::State = pool.state();
let in_use_cxns = state.connections - state.idle_connections; let in_use_cxns = state.connections - state.idle_connections;
trace!( debug!(
"DB pool {:?} usage (in_use: {}, available: {})", "DB pool {:?} usage (in_use: {}, available: {}, max: {})",
name, name,
in_use_cxns, in_use_cxns,
state.connections state.connections,
pool.max_size()
); );
if state.connections == in_use_cxns {
debug!("DB pool {:?} is empty (in_use: {})", name, in_use_cxns);
}
} }
/// Perform database maintenance on a regular basis /// Perform database maintenance on a regular basis
@ -743,8 +751,6 @@ pub async fn db_query(
if sql_gen_elapsed > Duration::from_millis(10) { if sql_gen_elapsed > Duration::from_millis(10) {
debug!("SQL (slow) generated in {:?}", start.elapsed()); debug!("SQL (slow) generated in {:?}", start.elapsed());
} }
// show pool stats
log_pool_stats("reader", &pool);
// cutoff for displaying slow queries // cutoff for displaying slow queries
let slow_cutoff = Duration::from_millis(2000); let slow_cutoff = Duration::from_millis(2000);
// any client that doesn't cause us to generate new rows in 5 // any client that doesn't cause us to generate new rows in 5

View File

@ -358,6 +358,10 @@ pub fn start_server(settings: Settings, shutdown_rx: MpscReceiver<()>) -> Result
db_max_conn, db_max_conn,
true, true,
); );
// spawn a task to check the pool size.
let pool_monitor = pool.clone();
tokio::spawn(async move {db::monitor_pool("reader", pool_monitor).await;});
// A `Service` is needed for every connection, so this // A `Service` is needed for every connection, so this
// creates one from our `handle_request` function. // creates one from our `handle_request` function.
let make_svc = make_service_fn(|conn: &AddrStream| { let make_svc = make_service_fn(|conn: &AddrStream| {