From 2de70ac33684a5e7e531a5bc8f2052846753bf12 Mon Sep 17 00:00:00 2001 From: "Dustin J. Mitchell" Date: Sun, 3 Aug 2025 11:13:58 -0400 Subject: [PATCH] Capture and log errors from bb8 (#143) --- postgres/src/lib.rs | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/postgres/src/lib.rs b/postgres/src/lib.rs index 08261a2..bfaa53e 100644 --- a/postgres/src/lib.rs +++ b/postgres/src/lib.rs @@ -39,6 +39,26 @@ use uuid::Uuid; #[cfg(test)] mod testing; +/// An `ErrorSink` implementation that logs errors to the Rust log. +#[derive(Debug, Clone, Copy)] +pub struct LogErrorSink; + +impl LogErrorSink { + fn new() -> Box { + Box::new(Self) + } +} + +impl bb8::ErrorSink for LogErrorSink { + fn sink(&self, e: tokio_postgres::Error) { + log::error!("Postgres connection error: {e}"); + } + + fn boxed_clone(&self) -> Box> { + Self::new() + } +} + /// A storage backend which uses Postgres. pub struct PostgresStorage { pool: bb8::Pool>, @@ -49,7 +69,10 @@ impl PostgresStorage { let connector = native_tls::TlsConnector::new()?; let connector = postgres_native_tls::MakeTlsConnector::new(connector); let manager = PostgresConnectionManager::new_from_stringlike(connection_string, connector)?; - let pool = bb8::Pool::builder().build(manager).await?; + let pool = bb8::Pool::builder() + .error_sink(LogErrorSink::new()) + .build(manager) + .await?; Ok(Self { pool }) } }