nio-metrics 0.0.0

Metrics collection and reporting for nio runtime
Documentation
use std::{
    any::Any,
    fmt::Debug,
    sync::atomic::{AtomicUsize, Ordering::Relaxed},
};

pub trait Measurement: Debug + Send + Sync + Any {
    fn init(&mut self, _worker_threads: usize) {}
    fn queue_drained(&self, _worker_id: usize) {}
    fn queue_notified(&self, _worker_id: usize) {}
}

#[derive(Debug, Default)]
struct TaskQueue {
    drained: AtomicUsize,
    notified: AtomicUsize,
}

#[derive(Debug, Default)]
pub struct SimpleMeasurement {
    workers: Vec<TaskQueue>,
}

impl Measurement for SimpleMeasurement {
    fn init(&mut self, worker_threads: usize) {
        self.workers = (0..worker_threads).map(|_| TaskQueue::default()).collect();
    }

    fn queue_drained(&self, worker_id: usize) {
        self.workers[worker_id].drained.fetch_add(1, Relaxed);
    }

    fn queue_notified(&self, worker_id: usize) {
        self.workers[worker_id].notified.fetch_add(1, Relaxed);
    }
}

impl SimpleMeasurement {
    pub fn new() -> SimpleMeasurement {
        SimpleMeasurement { workers: vec![] }
    }
}