@@ -100,17 +100,19 @@ impl MaximumOverIntervalGauge {
100100 self . apply_delta ( -v) ;
101101 }
102102
103+ /// Observe a new value. Sets it as the current value of the guage and tracks maximum value in the interval.
103104 pub fn observe ( & self , v : f64 ) {
104- let previous_value = self . value . swap ( v, Ordering :: AcqRel ) ;
105- if self . maximum_value . get ( ) < previous_value {
106- self . maximum_value . set ( previous_value) ;
107- }
105+ self . value . swap ( v, Ordering :: Relaxed ) ;
106+ self . set_max_over_interval ( v) ;
108107 }
109108
110109 fn apply_delta ( & self , delta : f64 ) {
111110 let previous_value = self . value . fetch_add ( delta) ;
112111 let new_value = previous_value + delta;
112+ self . set_max_over_interval ( new_value) ;
113+ }
113114
115+ fn set_max_over_interval ( & self , value : f64 ) {
114116 let now = Instant :: now ( ) ;
115117 let interval_expiry = self . interval_expiry . upgradable_read ( ) ;
116118 let loaded_interval_expiry = * interval_expiry;
@@ -125,14 +127,14 @@ impl MaximumOverIntervalGauge {
125127 // could have updated the value before we got the exclusive lock.
126128 if * interval_expiry == loaded_interval_expiry {
127129 * interval_expiry = now + self . interval_duration ;
128- self . maximum_value . set ( new_value ) ;
130+ self . maximum_value . set ( value ) ;
129131
130132 return ;
131133 }
132134 }
133135
134136 // Set the maximum_value to the max of the current value & previous max.
135- self . maximum_value . fetch_max ( new_value , Ordering :: Relaxed ) ;
137+ self . maximum_value . fetch_max ( value , Ordering :: Relaxed ) ;
136138 }
137139}
138140
0 commit comments