Skip to content

Commit 7ee08cc

Browse files
committed
store: Report average connection wait times to Prometheus
1 parent 63fafd1 commit 7ee08cc

File tree

1 file changed

+19
-12
lines changed

1 file changed

+19
-12
lines changed

store/postgres/src/connection_pool.rs

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -26,23 +26,32 @@ impl r2d2::HandleError<r2d2::Error> for ErrorHandler {
2626

2727
struct EventHandler {
2828
logger: Logger,
29-
gauge: Box<Gauge>,
29+
count_gauge: Box<Gauge>,
30+
wait_gauge: Box<Gauge>,
3031
wait_stats: PoolWaitStats,
3132
last_log: RwLock<Instant>,
3233
}
3334

3435
impl EventHandler {
3536
fn new(logger: Logger, registry: Arc<dyn MetricsRegistry>, wait_stats: PoolWaitStats) -> Self {
36-
let gauge = registry
37+
let count_gauge = registry
3738
.new_gauge(
3839
String::from("store_connection_checkout_count"),
3940
String::from("The number of Postgres connections currently checked out"),
4041
HashMap::new(),
4142
)
4243
.expect("failed to create `store_connection_checkout_count` counter");
44+
let wait_gauge = registry
45+
.new_gauge(
46+
String::from("store_connection_wait_time_ms"),
47+
String::from("Average connection wait time"),
48+
HashMap::new(),
49+
)
50+
.expect("failed to create `store_connection_wait_time_ms` counter");
4351
EventHandler {
4452
logger,
45-
gauge,
53+
count_gauge,
54+
wait_gauge,
4655
wait_stats,
4756
last_log: RwLock::new(Instant::now()),
4857
}
@@ -62,15 +71,13 @@ impl EventHandler {
6271
let wait_avg = {
6372
let mut wait_stats = self.wait_stats.write().unwrap();
6473
wait_stats.add(duration);
65-
if should_log {
66-
wait_stats.average()
67-
} else {
68-
None
69-
}
74+
wait_stats.average()
7075
};
71-
if let Some(wait_avg) = wait_avg {
76+
let wait_avg = wait_avg.map(|wait_avg| wait_avg.as_millis()).unwrap_or(0);
77+
self.wait_gauge.set(wait_avg as f64);
78+
if should_log {
7279
info!(self.logger, "Average connection wait time";
73-
"wait_ms" => wait_avg.as_millis());
80+
"wait_ms" => wait_avg);
7481
}
7582
}
7683
}
@@ -85,7 +92,7 @@ impl HandleEvent for EventHandler {
8592
fn handle_acquire(&self, _: e::AcquireEvent) {}
8693
fn handle_release(&self, _: e::ReleaseEvent) {}
8794
fn handle_checkout(&self, event: e::CheckoutEvent) {
88-
self.gauge.inc();
95+
self.count_gauge.inc();
8996
self.add_wait_time(event.duration());
9097
}
9198
fn handle_timeout(&self, event: e::TimeoutEvent) {
@@ -94,7 +101,7 @@ impl HandleEvent for EventHandler {
94101
"wait_ms" => event.timeout().as_millis())
95102
}
96103
fn handle_checkin(&self, _: e::CheckinEvent) {
97-
self.gauge.dec();
104+
self.count_gauge.dec();
98105
}
99106
}
100107

0 commit comments

Comments
 (0)