use super::{raw, EncodeLabelSet, EncodeLabelValue, Registered};
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, EncodeLabelSet)]
pub struct Label {
status: Status,
}
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, EncodeLabelValue)]
pub enum Status {
Success,
Failure,
Invalid,
Dropped,
Timeout,
}
pub type Raw = raw::Family<Label, raw::Counter>;
pub type Counter = Registered<Raw>;
impl Counter {
pub fn guard(&self, status: Status) -> CounterGuard {
CounterGuard {
metric: self.clone(),
status,
}
}
pub fn inc(&self, status: Status) {
self.get_or_create(&Label { status }).inc();
}
pub fn inc_by(&self, status: Status, n: u64) {
self.get_or_create(&Label { status }).inc_by(n);
}
}
pub struct CounterGuard {
metric: Counter,
status: Status,
}
impl CounterGuard {
pub const fn set(&mut self, status: Status) {
self.status = status;
}
}
impl Drop for CounterGuard {
fn drop(&mut self) {
self.metric.inc(self.status);
}
}