Skip to content

Commit 9be0509

Browse files
committed
refactor
1 parent bdff702 commit 9be0509

File tree

4 files changed

+80
-22
lines changed

4 files changed

+80
-22
lines changed

packages/primitives/src/metrics/metric.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
use derive_more::Display;
22
use serde::{Deserialize, Serialize};
33

4+
use super::counter::Counter;
45
use super::label_set::LabelSet;
56
use super::prometheus::PrometheusSerializable;
67
use super::sample::Sample;
78
use super::sample_collection::SampleCollection;
9+
use crate::DurationSinceUnixEpoch;
810

911
#[derive(Debug, Clone, Default, PartialEq)]
1012
pub struct Metric<T> {
@@ -32,6 +34,12 @@ impl<T> Metric<T> {
3234
}
3335
}
3436

37+
impl Metric<Counter> {
38+
pub fn increment(&mut self, labels: &LabelSet, time: DurationSinceUnixEpoch) {
39+
self.sample_collection.increment(labels, time);
40+
}
41+
}
42+
3543
impl<T: PrometheusSerializable> PrometheusSerializable for Metric<T> {
3644
fn to_prometheus(&self) -> String {
3745
let mut output = String::new();

packages/primitives/src/metrics/metric_collection.rs

Lines changed: 30 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -158,31 +158,24 @@ impl<T> MetricKindCollection<T> {
158158
}
159159

160160
impl MetricKindCollection<Counter> {
161+
/// Increments the counter for the given metric name and labels.
162+
///
163+
/// If the metric name does not exist, it will be created.
164+
///
161165
/// # Panics
162166
///
163167
/// Panics if the metric name already exists in the collection.
164168
pub fn increment(&mut self, name: &MetricName, labels: &LabelSet, time: DurationSinceUnixEpoch) {
165-
// Create the metric if it doesn't exist
166169
if !self.metrics.contains_key(name) {
167-
let new_metric = Metric::new(name.clone(), SampleCollection { samples: HashMap::new() });
168-
self.metrics.insert(name.clone(), new_metric);
170+
self.metrics.insert(
171+
name.clone(),
172+
Metric::new(name.clone(), SampleCollection { samples: HashMap::new() }),
173+
);
169174
}
170175

171176
let metric = self.metrics.get_mut(name).unwrap();
172177

173-
// Use entry API to handle existing or new sample
174-
let sample = metric
175-
.sample_collection
176-
.samples
177-
.entry(labels.clone())
178-
.or_insert_with(|| Sample {
179-
value: Counter::new(0),
180-
update_at: time,
181-
labels: labels.clone(),
182-
});
183-
184-
sample.value.increment(1);
185-
sample.update_at = time;
178+
metric.increment(labels, time);
186179
}
187180

188181
#[must_use]
@@ -242,17 +235,33 @@ mod tests {
242235
use crate::metrics::sample::Sample;
243236

244237
#[test]
245-
fn test_increase_counter_in_metric_collection() {
238+
fn it_should_increase_a_preexistent_counter() {
246239
let time = DurationSinceUnixEpoch::from_secs(1_743_552_000);
247240
let label_set: LabelSet = (LabelName::new("label_name"), LabelValue::new("value")).into();
248241

249-
let mut metric_collection = MetricCollection {
250-
counters: MetricKindCollection::new(vec![Metric::new(
242+
let mut metric_collection = MetricCollection::new(
243+
MetricKindCollection::new(vec![Metric::new(
251244
MetricName::new("test_counter"),
252245
SampleCollection::new(vec![Sample::new(Counter::new(0), time, label_set.clone())]),
253246
)]),
254-
gauges: MetricKindCollection::new(vec![]),
255-
};
247+
MetricKindCollection::new(vec![]),
248+
);
249+
250+
metric_collection.increase_counter(&MetricName::new("test_counter"), &label_set, time);
251+
metric_collection.increase_counter(&MetricName::new("test_counter"), &label_set, time);
252+
253+
assert_eq!(
254+
metric_collection.get_counter_value(&MetricName::new("test_counter"), &label_set),
255+
2
256+
);
257+
}
258+
259+
#[test]
260+
fn it_should_automatically_create_a_counter_when_increasing_if_it_does_not_exist() {
261+
let time = DurationSinceUnixEpoch::from_secs(1_743_552_000);
262+
let label_set: LabelSet = (LabelName::new("label_name"), LabelValue::new("value")).into();
263+
264+
let mut metric_collection = MetricCollection::new(MetricKindCollection::new(vec![]), MetricKindCollection::new(vec![]));
256265

257266
metric_collection.increase_counter(&MetricName::new("test_counter"), &label_set, time);
258267
metric_collection.increase_counter(&MetricName::new("test_counter"), &label_set, time);

packages/primitives/src/metrics/sample.rs

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
use chrono::DateTime;
22
use serde::{Serialize, Serializer};
33

4+
use super::counter::Counter;
5+
use super::gauge::Gauge;
46
use super::label_set::LabelSet;
57
use super::prometheus::PrometheusSerializable;
68
use crate::DurationSinceUnixEpoch;
@@ -44,7 +46,7 @@ impl<T> Sample<T> {
4446
self.update_at
4547
}
4648

47-
pub fn set_update_at(&mut self, time: DurationSinceUnixEpoch) {
49+
fn set_update_at(&mut self, time: DurationSinceUnixEpoch) {
4850
self.update_at = time;
4951
}
5052
}
@@ -55,6 +57,20 @@ impl<T: PrometheusSerializable> PrometheusSerializable for Sample<T> {
5557
}
5658
}
5759

60+
impl Sample<Counter> {
61+
pub fn increment(&mut self, time: DurationSinceUnixEpoch) {
62+
self.value.increment(1);
63+
self.set_update_at(time);
64+
}
65+
}
66+
67+
impl Sample<Gauge> {
68+
pub fn set(&mut self, value: f64, time: DurationSinceUnixEpoch) {
69+
self.value.set(value);
70+
self.set_update_at(time);
71+
}
72+
}
73+
5874
/// Serializes the `update_at` field as a string in ISO 8601 format (RFC 3339).
5975
///
6076
/// # Errors

packages/primitives/src/metrics/sample_collection.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,12 @@ use std::collections::HashMap;
22

33
use serde::{Serialize, Serializer};
44

5+
use super::counter::Counter;
6+
use super::gauge::Gauge;
57
use super::label_set::LabelSet;
68
use super::prometheus::PrometheusSerializable;
79
use super::sample::Sample;
10+
use crate::DurationSinceUnixEpoch;
811

912
#[derive(Debug, Clone, Default, PartialEq)]
1013
pub struct SampleCollection<T> {
@@ -38,6 +41,28 @@ impl<T> SampleCollection<T> {
3841
}
3942
}
4043

44+
impl SampleCollection<Counter> {
45+
pub fn increment(&mut self, labels: &LabelSet, time: DurationSinceUnixEpoch) {
46+
let sample = self
47+
.samples
48+
.entry(labels.clone())
49+
.or_insert_with(|| Sample::new(Counter::new(0), time, labels.clone()));
50+
51+
sample.increment(time);
52+
}
53+
}
54+
55+
impl SampleCollection<Gauge> {
56+
pub fn set(&mut self, labels: &LabelSet, value: f64, time: DurationSinceUnixEpoch) {
57+
let sample = self
58+
.samples
59+
.entry(labels.clone())
60+
.or_insert_with(|| Sample::new(Gauge::new(0.0), time, labels.clone()));
61+
62+
sample.set(value, time);
63+
}
64+
}
65+
4166
impl<T: Serialize> Serialize for SampleCollection<T> {
4267
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
4368
where

0 commit comments

Comments
 (0)