11use 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};
54use dashmap::DashMap;
6- use std::sync::atomic::{AtomicI64, Ordering};
75
86pub struct Gauge {
97 opts: MetricOptions,
10- values: DashMap<String, AtomicI64 >,
8+ values: DashMap<String, f64 >,
119}
1210
1311impl 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}
0 commit comments