@@ -100,17 +100,19 @@ impl MaximumOverIntervalGauge {
100
100
self . apply_delta ( -v) ;
101
101
}
102
102
103
+ /// Observe a new value. Sets it as the current value of the guage and tracks maximum value in the interval.
103
104
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) ;
108
107
}
109
108
110
109
fn apply_delta ( & self , delta : f64 ) {
111
110
let previous_value = self . value . fetch_add ( delta) ;
112
111
let new_value = previous_value + delta;
112
+ self . set_max_over_interval ( new_value) ;
113
+ }
113
114
115
+ fn set_max_over_interval ( & self , value : f64 ) {
114
116
let now = Instant :: now ( ) ;
115
117
let interval_expiry = self . interval_expiry . upgradable_read ( ) ;
116
118
let loaded_interval_expiry = * interval_expiry;
@@ -125,14 +127,14 @@ impl MaximumOverIntervalGauge {
125
127
// could have updated the value before we got the exclusive lock.
126
128
if * interval_expiry == loaded_interval_expiry {
127
129
* interval_expiry = now + self . interval_duration ;
128
- self . maximum_value . set ( new_value ) ;
130
+ self . maximum_value . set ( value ) ;
129
131
130
132
return ;
131
133
}
132
134
}
133
135
134
136
// 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 ) ;
136
138
}
137
139
}
138
140
0 commit comments