emit_batcher 2.22.3

Batch processing infrastructure for emit.
Documentation
use std::sync::atomic::{AtomicUsize, Ordering};

macro_rules! metrics {
    ($container:ident {
        $($name:ident: $ty:ty,)*
    }) => {
        #[derive(Default)]
        pub(crate) struct $container { $(pub(crate) $name: $ty),* }

        impl emit::metric::Source for $container {
            fn sample_metrics<S: emit::metric::Sampler>(&self, sampler: S) {
                let $container { $($name),* } = self;

                $(
                    sampler.metric(
                        emit::metric::Metric::new(
                            emit::pkg!(),
                            emit::Empty,
                            emit::props! {
                                metric_name: stringify!($name),
                                metric_agg: <$ty>::AGG,
                                metric_value: $name.sample(),
                            },
                        ),
                    );
                )*
            }
        }
    };
}

#[derive(Default)]
pub(crate) struct Counter(AtomicUsize);

impl Counter {
    const AGG: &'static str = emit::well_known::METRIC_AGG_COUNT;

    pub fn increment(&self) {
        self.increment_by(1);
    }

    pub fn increment_by(&self, by: usize) {
        self.0.fetch_add(by, Ordering::Relaxed);
    }

    pub fn sample(&self) -> usize {
        self.0.load(Ordering::Relaxed)
    }
}

metrics!(InternalMetrics {
    queue_full_truncated: Counter,
    queue_full_blocked: Counter,
    queue_batch_processed: Counter,
    queue_batch_failed: Counter,
    queue_batch_panicked: Counter,
    queue_batch_retry: Counter,
});