Skip to content

Commit aeca8d8

Browse files
navaatimxinden
andauthored
feat(metrics): add support of f32 for Gauge and Counter (#216)
Signed-off-by: Léo Gillot-Lamure <[email protected]> Signed-off-by: Max Inden <[email protected]> Co-authored-by: Max Inden <[email protected]>
1 parent 4216fa6 commit aeca8d8

File tree

4 files changed

+88
-3
lines changed

4 files changed

+88
-3
lines changed

CHANGELOG.md

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,23 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
66

77
## [0.23.0] - unreleased
88

9+
### Changed
10+
11+
- `ConstCounter::new` now requires specifying the type of literal arguments, like this: `ConstCounter::new(42u64);`.
12+
See [PR 173].
13+
914
- Update `prost` dependencies to `v0.12`.
1015
See [PR 198].
1116

1217
[PR 198]: https://github.com/prometheus/client_rust/pull/198
1318

14-
- Add `EncodeGaugeValue` `i32` and `f32`, `EncodeCounterValue` `u32` and `f32` and `EncodeExemplarValue` `f32` and `u32` implementations.
15-
See [PR 173].
19+
### Added
20+
21+
- Support `i32`/`f32` for `Gauge` and `u32`/`f32` for `Counter`/`CounterWithExemplar`.
22+
See [PR 173] and [PR 216].
1623

1724
[PR 173]: https://github.com/prometheus/client_rust/pull/173
25+
[PR 216]: https://github.com/prometheus/client_rust/pull/216
1826

1927
## [0.22.3]
2028

src/encoding/text.rs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -717,9 +717,10 @@ mod tests {
717717
let mut registry = Registry::default();
718718
registry.register("my_counter", "My counter", counter);
719719

720+
let counter_f32 = Counter::<f32, AtomicU32>::default();
721+
registry.register("f32_counter", "Counter::<f32, AtomicU32>", counter_f32);
720722
let counter_u32 = Counter::<u32, AtomicU32>::default();
721723
registry.register("u32_counter", "Counter::<u32, AtomicU32>", counter_u32);
722-
723724
let mut encoded = String::new();
724725

725726
encode(&mut encoded, &registry).unwrap();
@@ -783,6 +784,9 @@ mod tests {
783784
let gauge = Gauge::<u32, AtomicU32>::default();
784785
registry.register("u32_gauge", "Gauge::<u32, AtomicU32>", gauge);
785786

787+
let gauge_f32 = Gauge::<f32, AtomicU32>::default();
788+
registry.register("f32_gauge", "Gauge::<f32, AtomicU32>", gauge_f32);
789+
786790
let gauge_i32 = Gauge::<i32, AtomicI32>::default();
787791
registry.register("i32_gauge", "Gauge::<i32, AtomicU32>", gauge_i32);
788792

src/metrics/counter.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,31 @@ impl Atomic<f64> for AtomicU64 {
169169
}
170170
}
171171

172+
impl Atomic<f32> for AtomicU32 {
173+
fn inc(&self) -> f32 {
174+
self.inc_by(1.0)
175+
}
176+
177+
fn inc_by(&self, v: f32) -> f32 {
178+
let mut old_u32 = self.load(Ordering::Relaxed);
179+
let mut old_f32;
180+
loop {
181+
old_f32 = f32::from_bits(old_u32);
182+
let new = f32::to_bits(old_f32 + v);
183+
match self.compare_exchange_weak(old_u32, new, Ordering::Relaxed, Ordering::Relaxed) {
184+
Ok(_) => break,
185+
Err(x) => old_u32 = x,
186+
}
187+
}
188+
189+
old_f32
190+
}
191+
192+
fn get(&self) -> f32 {
193+
f32::from_bits(self.load(Ordering::Relaxed))
194+
}
195+
}
196+
172197
impl<N, A> TypedMetric for Counter<N, A> {
173198
const TYPE: MetricType = MetricType::Counter;
174199
}

src/metrics/gauge.rs

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,54 @@ impl Atomic<f64> for AtomicU64 {
262262
}
263263
}
264264

265+
impl Atomic<f32> for AtomicU32 {
266+
fn inc(&self) -> f32 {
267+
self.inc_by(1.0)
268+
}
269+
270+
fn inc_by(&self, v: f32) -> f32 {
271+
let mut old_u32 = self.load(Ordering::Relaxed);
272+
let mut old_f32;
273+
loop {
274+
old_f32 = f32::from_bits(old_u32);
275+
let new = f32::to_bits(old_f32 + v);
276+
match self.compare_exchange_weak(old_u32, new, Ordering::Relaxed, Ordering::Relaxed) {
277+
Ok(_) => break,
278+
Err(x) => old_u32 = x,
279+
}
280+
}
281+
282+
old_f32
283+
}
284+
285+
fn dec(&self) -> f32 {
286+
self.dec_by(1.0)
287+
}
288+
289+
fn dec_by(&self, v: f32) -> f32 {
290+
let mut old_u32 = self.load(Ordering::Relaxed);
291+
let mut old_f32;
292+
loop {
293+
old_f32 = f32::from_bits(old_u32);
294+
let new = f32::to_bits(old_f32 - v);
295+
match self.compare_exchange_weak(old_u32, new, Ordering::Relaxed, Ordering::Relaxed) {
296+
Ok(_) => break,
297+
Err(x) => old_u32 = x,
298+
}
299+
}
300+
301+
old_f32
302+
}
303+
304+
fn set(&self, v: f32) -> f32 {
305+
f32::from_bits(self.swap(f32::to_bits(v), Ordering::Relaxed))
306+
}
307+
308+
fn get(&self) -> f32 {
309+
f32::from_bits(self.load(Ordering::Relaxed))
310+
}
311+
}
312+
265313
impl<N, A> TypedMetric for Gauge<N, A> {
266314
const TYPE: MetricType = MetricType::Gauge;
267315
}

0 commit comments

Comments
 (0)