use std::sync::{
Arc,
atomic::{AtomicU64, Ordering},
};
use indexmap::IndexMap;
use metrics::{Counter, Gauge, counter, gauge};
use crate::ChiralMapConfig;
pub(crate) struct Metrics {
id: Arc<String>,
instances: Arc<AtomicU64>,
inserts: Arc<Counter>,
deletions: Arc<Counter>,
size: Arc<Gauge>,
capacity: Arc<Gauge>,
flushes: Arc<Counter>,
opslog: Arc<Gauge>,
}
impl Metrics {
pub(crate) fn new(config: &ChiralMapConfig) -> Self {
let instances = Arc::new(AtomicU64::from(1));
let instance = 1;
let met_inserts = counter!("chiral_map_inserts", "id" => config.id.clone(), "instance" => instance.to_string());
let met_deletions = counter!("chiral_map_deletions", "id" => config.id.clone(), "instance" => instance.to_string());
let met_size = gauge!("chiral_map_size", "id" => config.id.clone(), "instance" => instance.to_string());
let met_capacity = gauge!("chiral_map_capacity", "id" => config.id.clone(), "instance" => instance.to_string());
let met_flushes = counter!("chiral_map_flushes", "id" => config.id.clone());
let met_opslog = gauge!("chiral_map_queued_ops", "id" => config.id.clone());
Self {
id: config.id.clone().into(),
instances,
inserts: met_inserts.into(),
deletions: met_deletions.into(),
size: met_size.into(),
capacity: met_capacity.into(),
flushes: met_flushes.into(),
opslog: met_opslog.into(),
}
}
#[allow(clippy::cast_precision_loss)]
pub(crate) fn inserted<K, V>(&self, map: &IndexMap<K, V>) {
self.inserts.increment(1);
self.size.set(map.len() as f64);
self.capacity.set(map.capacity() as f64);
}
#[allow(clippy::cast_precision_loss)]
pub(crate) fn removed<K, V>(&self, map: &IndexMap<K, V>) {
self.deletions.increment(1);
self.size.set(map.len() as f64);
self.capacity.set(map.capacity() as f64);
}
#[allow(clippy::cast_precision_loss)]
pub(crate) fn opcount(&self, count: usize) {
self.opslog.set(count as f64);
}
pub(crate) fn flushed(&self) {
self.flushes.increment(1);
}
}
impl Clone for Metrics {
fn clone(&self) -> Self {
let instance = self.instances.fetch_add(1, Ordering::Relaxed) + 1;
let met_inserts = counter!("chiral_map_inserts", "id" => self.id.to_string(), "instance" => instance.to_string());
let met_deletions = counter!("chiral_map_deletions", "id" => self.id.to_string(), "instance" => instance.to_string());
let met_size = gauge!("chiral_map_size", "id" => self.id.to_string(), "instance" => instance.to_string());
let met_capacity = gauge!("chiral_map_capacity", "id" => self.id.to_string(), "instance" => instance.to_string());
let met_flushes = counter!("chiral_map_flushes", "id" => self.id.to_string());
let met_opslog = gauge!("chiral_map_queued_ops", "id" => self.id.to_string());
Self {
id: self.id.clone(),
instances: self.instances.clone(),
inserts: met_inserts.into(),
deletions: met_deletions.into(),
size: met_size.into(),
capacity: met_capacity.into(),
flushes: met_flushes.into(),
opslog: met_opslog.into(),
}
}
}