diff --git a/bb8/src/api.rs b/bb8/src/api.rs index a74459c..1f2d598 100644 --- a/bb8/src/api.rs +++ b/bb8/src/api.rs @@ -101,6 +101,8 @@ pub struct Statistics { pub get_timed_out: u64, /// Total time accumulated waiting for a connection. pub get_wait_time: Duration, + /// Total connections created. + pub connections_created: u64, /// Total connections that were closed due to be in broken state. pub connections_closed_broken: u64, /// Total connections that were closed due to be considered invalid. diff --git a/bb8/src/inner.rs b/bb8/src/inner.rs index f6f8c8c..209d69f 100644 --- a/bb8/src/inner.rs +++ b/bb8/src/inner.rs @@ -196,6 +196,7 @@ where .internals .lock() .put(conn, Some(approval), self.inner.clone()); + self.inner.statistics.record(StatsKind::Created); return Ok(()); } Err(e) => { diff --git a/bb8/src/internals.rs b/bb8/src/internals.rs index e0ef176..807050d 100644 --- a/bb8/src/internals.rs +++ b/bb8/src/internals.rs @@ -272,6 +272,7 @@ pub(crate) struct AtomicStatistics { pub(crate) get_waited: AtomicU64, pub(crate) get_timed_out: AtomicU64, pub(crate) get_wait_time_micros: AtomicU64, + pub(crate) connections_created: AtomicU64, pub(crate) connections_closed_broken: AtomicU64, pub(crate) connections_closed_invalid: AtomicU64, pub(crate) connections_closed_max_lifetime: AtomicU64, @@ -295,6 +296,7 @@ impl AtomicStatistics { pub(crate) fn record(&self, kind: StatsKind) { match kind { + StatsKind::Created => &self.connections_created, StatsKind::ClosedBroken => &self.connections_closed_broken, StatsKind::ClosedInvalid => &self.connections_closed_invalid, } @@ -320,6 +322,7 @@ impl From<&AtomicStatistics> for Statistics { get_waited: item.get_waited.load(Ordering::SeqCst), get_timed_out: item.get_timed_out.load(Ordering::SeqCst), get_wait_time: Duration::from_micros(item.get_wait_time_micros.load(Ordering::SeqCst)), + connections_created: item.connections_created.load(Ordering::SeqCst), connections_closed_broken: item.connections_closed_broken.load(Ordering::SeqCst), connections_closed_invalid: item.connections_closed_invalid.load(Ordering::SeqCst), connections_closed_max_lifetime: item @@ -339,6 +342,7 @@ pub(crate) enum StatsGetKind { } pub(crate) enum StatsKind { + Created, ClosedBroken, ClosedInvalid, } diff --git a/bb8/tests/test.rs b/bb8/tests/test.rs index f0db198..d5db34e 100644 --- a/bb8/tests/test.rs +++ b/bb8/tests/test.rs @@ -992,3 +992,23 @@ async fn test_state_get_contention() { assert_eq!(statistics.get_waited, 1); assert!(statistics.get_wait_time > Duration::from_micros(0)); } + +#[tokio::test] +async fn test_statistics_connections_created() { + let pool = Pool::builder() + .max_size(1) + .min_idle(1) + .build(OkManager::::new()) + .await + .unwrap(); + let (tx1, rx1) = oneshot::channel(); + let clone = pool.clone(); + tokio::spawn(async move { + let _ = clone.get().await.unwrap(); + tx1.send(()).unwrap(); + }); + // wait until finished. + rx1.await.unwrap(); + + assert_eq!(pool.state().statistics.connections_created, 1); +}