@@ -7,10 +7,7 @@ use graph::util::security::SafeDisplay;
7
7
use std:: collections:: HashMap ;
8
8
use std:: fmt;
9
9
use std:: sync:: { Arc , RwLock } ;
10
- use std:: time:: Duration ;
11
-
12
- // Log connection checkouts that take longer than this many millis
13
- const CONTENTION_LOG_THRESHOLD : u64 = 100 ;
10
+ use std:: time:: { Duration , Instant } ;
14
11
15
12
struct ErrorHandler ( Logger , Box < Counter > ) ;
16
13
@@ -31,6 +28,7 @@ struct EventHandler {
31
28
logger : Logger ,
32
29
gauge : Box < Gauge > ,
33
30
wait_stats : PoolWaitStats ,
31
+ last_log : RwLock < Instant > ,
34
32
}
35
33
36
34
impl EventHandler {
@@ -46,11 +44,34 @@ impl EventHandler {
46
44
logger,
47
45
gauge,
48
46
wait_stats,
47
+ last_log : RwLock :: new ( Instant :: now ( ) ) ,
49
48
}
50
49
}
51
50
52
51
fn add_wait_time ( & self , duration : Duration ) {
53
- self . wait_stats . write ( ) . unwrap ( ) . add ( duration) ;
52
+ let should_log = {
53
+ // Log average wait time, but at most every 10s
54
+ let mut last_log = self . last_log . write ( ) . unwrap ( ) ;
55
+ if last_log. elapsed ( ) > Duration :: from_secs ( 10 ) {
56
+ * last_log = Instant :: now ( ) ;
57
+ true
58
+ } else {
59
+ false
60
+ }
61
+ } ;
62
+ let wait_avg = {
63
+ let mut wait_stats = self . wait_stats . write ( ) . unwrap ( ) ;
64
+ wait_stats. add ( duration) ;
65
+ if should_log {
66
+ wait_stats. average ( )
67
+ } else {
68
+ None
69
+ }
70
+ } ;
71
+ if let Some ( wait_avg) = wait_avg {
72
+ info ! ( self . logger, "Average connection wait time" ;
73
+ "wait_ms" => wait_avg. as_millis( ) ) ;
74
+ }
54
75
}
55
76
}
56
77
@@ -66,10 +87,6 @@ impl HandleEvent for EventHandler {
66
87
fn handle_checkout ( & self , event : e:: CheckoutEvent ) {
67
88
self . gauge . inc ( ) ;
68
89
self . add_wait_time ( event. duration ( ) ) ;
69
- if event. duration ( ) > Duration :: from_millis ( CONTENTION_LOG_THRESHOLD ) {
70
- warn ! ( self . logger, "Excessive wait time on checkout" ;
71
- "wait_ms" => event. duration( ) . as_millis( ) )
72
- }
73
90
}
74
91
fn handle_timeout ( & self , event : e:: TimeoutEvent ) {
75
92
self . add_wait_time ( event. timeout ( ) ) ;
0 commit comments