Skip to content

Commit

Permalink
Prototype of metrics expiry
Browse files Browse the repository at this point in the history
  • Loading branch information
howardjohn committed Apr 29, 2024
1 parent b462e61 commit 9ec1f88
Show file tree
Hide file tree
Showing 3 changed files with 89 additions and 0 deletions.
3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,9 @@ hyper = { version = "0.14.16", features = ["server", "http1", "tcp"] }
[build-dependencies]
prost-build = { version = "0.11.0", optional = true }

[[example]]
name = "prune"

[[bench]]
name = "baseline"
harness = false
Expand Down
78 changes: 78 additions & 0 deletions examples/prune.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
use std::fmt::Error;
use std::sync::{Arc, Mutex};
use std::sync::atomic::AtomicU64;
use std::thread;
use std::time::Duration;
use tokio::time::Instant;
use prometheus_client::encoding::{text::encode, EncodeMetric, MetricEncoder};
use prometheus_client::metrics::family::Family;
use prometheus_client::metrics::{MetricType, TypedMetric};
use prometheus_client::metrics::counter::Atomic;
use prometheus_client::registry::Registry;
use prometheus_client_derive_encode::EncodeLabelSet;

#[derive(Default, Debug)]
struct MyCounter {
value: Arc<AtomicU64>,
last_access: Arc<Mutex<Option<Instant>>>
}

impl TypedMetric for MyCounter {

}

impl MyCounter {
pub fn get(&self) -> u64 {
self.value.get()
}
pub fn inc(&self) -> u64 {
let mut last = self.last_access.lock().unwrap();
*last = Some(Instant::now());
self.value.inc()
}
}

impl EncodeMetric for MyCounter {
fn encode(&self, mut encoder: MetricEncoder) -> Result<(), Error> {
encoder.encode_counter::<(), _, u64>(&self.get(), None)
}

fn metric_type(&self) -> MetricType {
todo!()
}
}

#[derive(Clone, Hash, Default, Debug, PartialEq, Eq, EncodeLabelSet)]
struct Labels {
name: String
}

fn main() {
let mut registry = Registry::default();

let metric: Family<Labels, MyCounter> = Family::default();
registry.register(
"my_custom_metric",
"test",
metric.clone(),
);
metric.get_or_create(&Labels{name: "apple".to_string()}).inc();
metric.get_or_create(&Labels{name: "banana".to_string()}).inc();

let mut encoded = String::new();
encode(&mut encoded, &registry).unwrap();

println!("Scrape output:\n{}", encoded);
thread::sleep(Duration::from_secs(1));
metric.get_or_create(&Labels{name: "banana".to_string()}).inc();
let now = Instant::now();
metric.retain(|a, b | {

Check failure on line 69 in examples/prune.rs

View workflow job for this annotation

GitHub Actions / Clippy

unused variable: `a`

Check warning on line 69 in examples/prune.rs

View workflow job for this annotation

GitHub Actions / Test Suite

unused variable: `a`
let last = b.last_access.lock().unwrap().unwrap();
now.saturating_duration_since(last) > Duration::from_secs(1)
});

let mut encoded = String::new();
encode(&mut encoded, &registry).unwrap();

println!("Scrape output:\n{}", encoded);
}
8 changes: 8 additions & 0 deletions src/metrics/family.rs
Original file line number Diff line number Diff line change
Expand Up @@ -288,6 +288,14 @@ impl<S: Clone + std::hash::Hash + Eq, M, C: MetricConstructor<M>> Family<S, M, C
self.metrics.write().clear()
}

/// retain
pub fn retain<F>(&self, f: F)
where
F: FnMut(&S, &mut M) -> bool
{
self.metrics.write().retain(f)
}

pub(crate) fn read(&self) -> RwLockReadGuard<HashMap<S, M>> {
self.metrics.read()
}
Expand Down

0 comments on commit 9ec1f88

Please sign in to comment.