servers/metrics/
jemalloc.rsuse common_telemetry::error;
use lazy_static::lazy_static;
use once_cell::sync::Lazy;
use prometheus::*;
use snafu::ResultExt;
use tikv_jemalloc_ctl::stats::{allocated_mib, resident_mib};
use tikv_jemalloc_ctl::{epoch, epoch_mib, stats};
use crate::error::UpdateJemallocMetricsSnafu;
lazy_static! {
pub static ref SYS_JEMALLOC_RESIDEN: IntGauge = register_int_gauge!(
"sys_jemalloc_resident",
"Total number of bytes allocated by the application."
)
.unwrap();
pub static ref SYS_JEMALLOC_ALLOCATED: IntGauge = register_int_gauge!(
"sys_jemalloc_allocated",
"Total number of bytes in physically resident data pages mapped by the allocator."
)
.unwrap();
}
pub(crate) static JEMALLOC_COLLECTOR: Lazy<Option<JemallocCollector>> = Lazy::new(|| {
let collector = JemallocCollector::try_new()
.map_err(|e| {
error!(e; "Failed to retrieve jemalloc metrics");
e
})
.ok();
collector.inspect(|c| {
if let Err(e) = c.update() {
error!(e; "Failed to update jemalloc metrics");
};
})
});
pub(crate) struct JemallocCollector {
epoch: epoch_mib,
allocated: allocated_mib,
resident: resident_mib,
}
impl JemallocCollector {
pub(crate) fn try_new() -> crate::error::Result<Self> {
let e = epoch::mib().context(UpdateJemallocMetricsSnafu)?;
let allocated = stats::allocated::mib().context(UpdateJemallocMetricsSnafu)?;
let resident = stats::resident::mib().context(UpdateJemallocMetricsSnafu)?;
Ok(Self {
epoch: e,
allocated,
resident,
})
}
pub(crate) fn update(&self) -> crate::error::Result<()> {
let _ = self.epoch.advance().context(UpdateJemallocMetricsSnafu)?;
let allocated = self.allocated.read().context(UpdateJemallocMetricsSnafu)?;
let resident = self.resident.read().context(UpdateJemallocMetricsSnafu)?;
SYS_JEMALLOC_RESIDEN.set(allocated as i64);
SYS_JEMALLOC_ALLOCATED.set(resident as i64);
Ok(())
}
}