Skip to content

Commit 1cdf904

Browse files
committed
Fix observe
1 parent 96d1676 commit 1cdf904

File tree

1 file changed

+8
-6
lines changed

1 file changed

+8
-6
lines changed

src/maximum_over_interval_gauge.rs

+8-6
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)