use crate::telemetry::metrics::Counter;
use slog::{Drain, Never, OwnedKVList, Record, SendSyncRefUnwindSafeDrain};
#[crate::telemetry::metrics::metrics(crate_path = "crate")]
mod rustfoundry {
pub fn log_record_count(level: &'static str) -> Counter;
}
pub(crate) struct LogVolumeMetricsDrain<D>
where
D: SendSyncRefUnwindSafeDrain<Err = Never, Ok = ()> + 'static,
{
inner: D,
}
impl<D> LogVolumeMetricsDrain<D>
where
D: SendSyncRefUnwindSafeDrain<Err = Never, Ok = ()> + 'static,
{
pub(crate) fn new(inner: D) -> Self {
Self { inner }
}
}
impl<D> Drain for LogVolumeMetricsDrain<D>
where
D: SendSyncRefUnwindSafeDrain<Err = Never, Ok = ()> + 'static,
{
type Ok = ();
type Err = D::Err;
fn log(&self, record: &Record, values: &OwnedKVList) -> Result<Self::Ok, Self::Err> {
let res = self.inner.log(record, values);
rustfoundry::log_record_count(record.level().as_str()).inc();
res
}
}