use std::{
fmt::Debug,
hash::{DefaultHasher, Hasher},
};
#[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)]
pub struct Token<'a> {
pub hash: u64,
pub name: &'a str,
pub labels: &'a [(&'a str, &'a str)],
}
impl<'a> Token<'a> {
pub fn new(name: &'a str, labels: &'a [(&'a str, &'a str)]) -> Self {
let mut hasher = DefaultHasher::new();
hasher.write(name.as_bytes());
hasher.write_u8(0xff);
for (key, value) in labels {
hasher.write(key.as_bytes());
hasher.write_u8(0xff);
hasher.write(value.as_bytes());
hasher.write_u8(0xff);
}
Self {
hash: hasher.finish(),
name,
labels,
}
}
}
pub trait CounterWrite: Send + Sync {
fn increment(&self, step: u64);
fn absolute(&self, value: u64);
}
pub enum Counter {
Noop,
Record(Box<dyn CounterWrite>),
}
impl Counter {
#[inline]
pub fn increment(&self, step: u64) {
match self {
Counter::Noop => {}
Counter::Record(raw_counter) => raw_counter.increment(step),
}
}
#[inline]
pub fn absolute(&self, value: u64) {
match self {
Counter::Noop => {}
Counter::Record(raw_counter) => raw_counter.absolute(value),
}
}
}
pub trait GaugeWrite: Send + Sync {
fn increment(&self, value: f64);
fn decrement(&self, value: f64);
fn set(&self, value: f64);
}
pub enum Gauge {
Noop,
Record(Box<dyn GaugeWrite>),
}
impl Gauge {
#[inline]
pub fn increment(&self, value: f64) {
match self {
Gauge::Noop => {}
Gauge::Record(raw_gauge) => raw_gauge.increment(value),
}
}
#[inline]
pub fn decrement(&self, value: f64) {
match self {
Gauge::Noop => {}
Gauge::Record(raw_gauge) => raw_gauge.decrement(value),
}
}
#[inline]
pub fn set(&self, value: f64) {
match self {
Gauge::Noop => {}
Gauge::Record(raw_gauge) => raw_gauge.set(value),
}
}
}
pub trait HistogramWrite: Send + Sync {
fn record(&self, value: f64);
}
pub enum Histogram {
Noop,
Record(Box<dyn HistogramWrite>),
}
impl Histogram {
#[inline]
pub fn record(&self, value: f64) {
match self {
Histogram::Noop => {}
Histogram::Record(raw_histogram) => raw_histogram.record(value),
}
}
}
pub trait Registry: Send + Sync + Debug {
#[must_use = "This will cause unnecessary performance loss."]
fn counter(&self, token: Token<'_>) -> Counter;
#[must_use = "This will cause unnecessary performance loss."]
fn gauge(&self, token: Token<'_>) -> Gauge;
#[must_use = "This will cause unnecessary performance loss."]
fn histogam(&self, token: Token<'_>) -> Histogram;
}