chiralmap 0.1.3

Left-Right map using IndexMap
Documentation
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 {
        // At every clone, the metrics increase their instance number
        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(),
        }
    }
}