Skip to content

Commit 2d24b8f

Browse files
authored
fix: gauges should use f64 (#330)
1 parent 484461b commit 2d24b8f

File tree

7 files changed

+157
-123
lines changed

7 files changed

+157
-123
lines changed

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,6 @@ devenv.local.nix
3737
# Direnv
3838
.direnv*
3939

40-
.DS_Store
40+
.DS_Store
41+
42+
CLAUDE.md

unleash-yggdrasil/src/impact_metrics/counter.rs

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::impact_metrics::types::{
2-
get_label_key, parse_label_key, CollectedMetric, MetricLabels, MetricOptions, MetricType,
3-
NumericMetricSample,
2+
get_label_key, parse_label_key, CollectedMetric, CounterMetricSample, MetricLabels,
3+
MetricOptions,
44
};
55
use dashmap::DashMap;
66
use std::sync::atomic::{AtomicI64, Ordering};
@@ -45,21 +45,16 @@ impl Counter {
4545
let key = entry.key();
4646
let value = entry.value().swap(0, Ordering::Relaxed);
4747
if value != 0 {
48-
samples.push(NumericMetricSample::new(parse_label_key(key), value));
48+
samples.push(CounterMetricSample::new(parse_label_key(key), value));
4949
}
5050
}
5151

5252
self.values.retain(|_, v| v.load(Ordering::Relaxed) != 0);
5353

5454
if samples.is_empty() {
55-
samples.push(NumericMetricSample::zero());
55+
samples.push(CounterMetricSample::zero());
5656
}
5757

58-
CollectedMetric::new_numeric(
59-
&self.opts.name,
60-
&self.opts.help,
61-
MetricType::Counter,
62-
samples,
63-
)
58+
CollectedMetric::new_counter(&self.opts.name, &self.opts.help, samples)
6459
}
6560
}
Lines changed: 28 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
use crate::impact_metrics::types::{
2-
get_label_key, parse_label_key, CollectedMetric, MetricLabels, MetricOptions, MetricType,
3-
NumericMetricSample,
2+
get_label_key, parse_label_key, CollectedMetric, GaugeMetricSample, MetricLabels, MetricOptions,
43
};
54
use dashmap::DashMap;
6-
use std::sync::atomic::{AtomicI64, Ordering};
75

86
pub struct Gauge {
97
opts: MetricOptions,
10-
values: DashMap<String, AtomicI64>,
8+
values: DashMap<String, f64>,
119
}
1210

1311
impl Gauge {
@@ -18,75 +16,75 @@ impl Gauge {
1816
}
1917
}
2018

21-
pub fn set(&self, value: i64) {
19+
pub fn set(&self, value: f64) {
2220
self.set_internal(value, None);
2321
}
2422

25-
pub fn set_with_labels(&self, value: i64, labels: &MetricLabels) {
23+
pub fn set_with_labels(&self, value: f64, labels: &MetricLabels) {
2624
self.set_internal(value, Some(labels));
2725
}
2826

29-
fn set_internal(&self, value: i64, labels: Option<&MetricLabels>) {
27+
fn set_internal(&self, value: f64, labels: Option<&MetricLabels>) {
3028
let key = get_label_key(labels);
31-
self.values
32-
.entry(key)
33-
.and_modify(|v| v.store(value, Ordering::Relaxed))
34-
.or_insert_with(|| AtomicI64::new(value));
29+
self.values.insert(key, value);
3530
}
3631

3732
pub fn inc(&self) {
38-
self.inc_internal(1, None);
33+
self.inc_internal(1.0, None);
3934
}
4035

41-
pub fn inc_by(&self, value: i64) {
36+
pub fn inc_by(&self, value: f64) {
4237
self.inc_internal(value, None);
4338
}
4439

45-
pub fn inc_with_labels(&self, value: i64, labels: &MetricLabels) {
40+
pub fn inc_with_labels(&self, value: f64, labels: &MetricLabels) {
4641
self.inc_internal(value, Some(labels));
4742
}
4843

49-
fn inc_internal(&self, value: i64, labels: Option<&MetricLabels>) {
44+
fn inc_internal(&self, value: f64, labels: Option<&MetricLabels>) {
5045
let key = get_label_key(labels);
5146
self.values
5247
.entry(key)
53-
.or_insert_with(|| AtomicI64::new(0))
54-
.fetch_add(value, Ordering::Relaxed);
48+
.and_modify(|v| *v += value)
49+
.or_insert(value);
5550
}
5651

5752
pub fn dec(&self) {
58-
self.dec_internal(1, None);
53+
self.dec_internal(1.0, None);
5954
}
6055

61-
pub fn dec_by(&self, value: i64) {
56+
pub fn dec_by(&self, value: f64) {
6257
self.dec_internal(value, None);
6358
}
6459

65-
pub fn dec_with_labels(&self, value: i64, labels: &MetricLabels) {
60+
pub fn dec_with_labels(&self, value: f64, labels: &MetricLabels) {
6661
self.dec_internal(value, Some(labels));
6762
}
6863

69-
fn dec_internal(&self, value: i64, labels: Option<&MetricLabels>) {
64+
fn dec_internal(&self, value: f64, labels: Option<&MetricLabels>) {
7065
let key = get_label_key(labels);
7166
self.values
7267
.entry(key)
73-
.or_insert_with(|| AtomicI64::new(0))
74-
.fetch_sub(value, Ordering::Relaxed);
68+
.and_modify(|v| *v -= value)
69+
.or_insert(-value);
7570
}
7671

7772
pub(crate) fn collect(&self) -> CollectedMetric {
7873
let mut samples = Vec::new();
7974

80-
for entry in self.values.iter() {
81-
let key = entry.key();
82-
let value = entry.value().swap(0, Ordering::Relaxed);
83-
if value != 0 {
84-
samples.push(NumericMetricSample::new(parse_label_key(key), value));
75+
for mut entry in self.values.iter_mut() {
76+
let value = std::mem::take(entry.value_mut());
77+
if value != 0.0 {
78+
samples.push(GaugeMetricSample::new(parse_label_key(entry.key()), value));
8579
}
8680
}
8781

88-
self.values.retain(|_, v| v.load(Ordering::Relaxed) != 0);
82+
self.values.retain(|_, v| *v != 0.0);
83+
84+
if samples.is_empty() {
85+
samples.push(GaugeMetricSample::zero());
86+
}
8987

90-
CollectedMetric::new_numeric(&self.opts.name, &self.opts.help, MetricType::Gauge, samples)
88+
CollectedMetric::new_gauge(&self.opts.name, &self.opts.help, samples)
9189
}
9290
}

unleash-yggdrasil/src/impact_metrics/mod.rs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ pub use gauge::Gauge;
99
pub use histogram::Histogram;
1010
pub use registry::InMemoryMetricRegistry;
1111
pub use types::{
12-
BucketMetricOptions, BucketMetricSample, CollectedMetric, HistogramBucket, MetricLabels,
13-
MetricOptions, MetricSample, MetricType, NumericMetricSample,
12+
BucketMetricOptions, BucketMetricSample, CollectedMetric, CounterMetricSample,
13+
GaugeMetricSample, HistogramBucket, MetricLabels, MetricOptions, MetricSample, MetricType,
1414
};
1515

1616
pub trait ImpactMetricRegistry {
@@ -20,14 +20,14 @@ pub trait ImpactMetricRegistry {
2020
fn inc_counter_with_labels(&self, name: &str, value: i64, labels: &MetricLabels);
2121

2222
fn define_gauge(&self, opts: MetricOptions);
23-
fn set_gauge(&self, name: &str, value: i64);
24-
fn set_gauge_with_labels(&self, name: &str, value: i64, labels: &MetricLabels);
23+
fn set_gauge(&self, name: &str, value: f64);
24+
fn set_gauge_with_labels(&self, name: &str, value: f64, labels: &MetricLabels);
2525
fn inc_gauge(&self, name: &str);
26-
fn inc_gauge_by(&self, name: &str, value: i64);
27-
fn inc_gauge_with_labels(&self, name: &str, value: i64, labels: &MetricLabels);
26+
fn inc_gauge_by(&self, name: &str, value: f64);
27+
fn inc_gauge_with_labels(&self, name: &str, value: f64, labels: &MetricLabels);
2828
fn dec_gauge(&self, name: &str);
29-
fn dec_gauge_by(&self, name: &str, value: i64);
30-
fn dec_gauge_with_labels(&self, name: &str, value: i64, labels: &MetricLabels);
29+
fn dec_gauge_by(&self, name: &str, value: f64);
30+
fn dec_gauge_with_labels(&self, name: &str, value: f64, labels: &MetricLabels);
3131

3232
fn define_histogram(&self, opts: BucketMetricOptions);
3333
fn observe_histogram(&self, name: &str, value: f64);

0 commit comments

Comments
 (0)