Skip to content

Commit 64be847

Browse files
committed
feat: [#1446] add aggregate function sum to metric collection
It allows sum metric samples matching a given criteria. The criteria is a label set. Sample values are added if they contain all the label name/value pairs specified in the criteria. For example, given these metric's samples in Prometheus export text format: ``` udp_tracker_server_requests_accepted_total{request_kind="scrape",server_binding_address_type="plain",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 213118 udp_tracker_server_requests_accepted_total{request_kind="announce",server_binding_address_type="plain",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 16460553 udp_tracker_server_requests_accepted_total{request_kind="connect",server_binding_address_type="plain",server_binding_ip="0.0.0.0",server_binding_port="6868",server_binding_protocol="udp"} 617 udp_tracker_server_requests_accepted_total{request_kind="connect",server_binding_address_type="plain",server_binding_ip="0.0.0.0",server_binding_port="6969",server_binding_protocol="udp"} 17148137 ``` And the criteria: it should contain the label `request_kind` with the value `connect`. It should return: 617 + 17148137 = 17148754
1 parent c3dffa5 commit 64be847

File tree

15 files changed

+493
-15
lines changed

15 files changed

+493
-15
lines changed

packages/http-tracker-core/src/statistics/metrics.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ impl Metrics {
3333
labels: &LabelSet,
3434
now: DurationSinceUnixEpoch,
3535
) -> Result<(), Error> {
36-
self.metric_collection.increase_counter(metric_name, labels, now)
36+
self.metric_collection.increment_counter(metric_name, labels, now)
3737
}
3838

3939
/// # Errors

packages/metrics/src/aggregate.rs

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
use derive_more::Display;
2+
3+
#[derive(Debug, Display, Clone, Copy, PartialEq)]
4+
pub struct AggregateValue(f64);
5+
6+
impl AggregateValue {
7+
#[must_use]
8+
pub fn new(value: f64) -> Self {
9+
Self(value)
10+
}
11+
12+
#[must_use]
13+
pub fn value(&self) -> f64 {
14+
self.0
15+
}
16+
}
17+
18+
impl From<f64> for AggregateValue {
19+
fn from(value: f64) -> Self {
20+
Self(value)
21+
}
22+
}
23+
24+
impl From<AggregateValue> for f64 {
25+
fn from(value: AggregateValue) -> Self {
26+
value.0
27+
}
28+
}

packages/metrics/src/counter.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ impl Counter {
1717
self.0
1818
}
1919

20+
#[must_use]
21+
pub fn primitive(&self) -> u64 {
22+
self.value()
23+
}
24+
2025
pub fn increment(&mut self, value: u64) {
2126
self.0 += value;
2227
}
@@ -26,12 +31,25 @@ impl Counter {
2631
}
2732
}
2833

34+
impl From<u32> for Counter {
35+
fn from(value: u32) -> Self {
36+
Self(u64::from(value))
37+
}
38+
}
39+
2940
impl From<u64> for Counter {
3041
fn from(value: u64) -> Self {
3142
Self(value)
3243
}
3344
}
3445

46+
impl From<i32> for Counter {
47+
fn from(value: i32) -> Self {
48+
#[allow(clippy::cast_sign_loss)]
49+
Self(value as u64)
50+
}
51+
}
52+
3553
impl From<Counter> for u64 {
3654
fn from(counter: Counter) -> Self {
3755
counter.value()

packages/metrics/src/gauge.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@ impl Gauge {
1717
self.0
1818
}
1919

20+
#[must_use]
21+
pub fn primitive(&self) -> f64 {
22+
self.value()
23+
}
24+
2025
pub fn set(&mut self, value: f64) {
2126
self.0 = value;
2227
}
@@ -30,6 +35,12 @@ impl Gauge {
3035
}
3136
}
3237

38+
impl From<f32> for Gauge {
39+
fn from(value: f32) -> Self {
40+
Self(f64::from(value))
41+
}
42+
}
43+
3344
impl From<f64> for Gauge {
3445
fn from(value: f64) -> Self {
3546
Self(value)

packages/metrics/src/label/set.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::collections::btree_map::Iter;
12
use std::collections::BTreeMap;
23
use std::fmt::Display;
34

@@ -12,6 +13,11 @@ pub struct LabelSet {
1213
}
1314

1415
impl LabelSet {
16+
#[must_use]
17+
pub fn empty() -> Self {
18+
Self { items: BTreeMap::new() }
19+
}
20+
1521
/// Insert a new label pair or update the value of an existing label.
1622
pub fn upsert(&mut self, key: LabelName, value: LabelValue) {
1723
self.items.insert(key, value);
@@ -20,6 +26,21 @@ impl LabelSet {
2026
pub fn is_empty(&self) -> bool {
2127
self.items.is_empty()
2228
}
29+
30+
pub fn contains_pair(&self, name: &LabelName, value: &LabelValue) -> bool {
31+
match self.items.get(name) {
32+
Some(existing_value) => existing_value == value,
33+
None => false,
34+
}
35+
}
36+
37+
pub fn matches(&self, criteria: &LabelSet) -> bool {
38+
criteria.iter().all(|(key, value)| self.contains_pair(key, value))
39+
}
40+
41+
pub fn iter(&self) -> Iter<'_, LabelName, LabelValue> {
42+
self.items.iter()
43+
}
2344
}
2445

2546
impl Display for LabelSet {

packages/metrics/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
pub mod aggregate;
12
pub mod counter;
23
pub mod gauge;
34
pub mod label;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
pub mod sum;

0 commit comments

Comments
 (0)