mirror of
https://github.com/neondatabase/neon.git
synced 2025-12-22 21:59:59 +00:00
feat: expose locked memory in pageserver /metrics (#6669)
context: https://github.com/neondatabase/neon/issues/6667
This commit is contained in:
committed by
GitHub
parent
3bd2a4fd56
commit
c561ad4e2e
3
Cargo.lock
generated
3
Cargo.lock
generated
@@ -2869,6 +2869,7 @@ dependencies = [
|
|||||||
"chrono",
|
"chrono",
|
||||||
"libc",
|
"libc",
|
||||||
"once_cell",
|
"once_cell",
|
||||||
|
"procfs",
|
||||||
"prometheus",
|
"prometheus",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
"rand_distr",
|
"rand_distr",
|
||||||
@@ -3986,6 +3987,8 @@ checksum = "b1de8dacb0873f77e6aefc6d71e044761fcc68060290f5b1089fcdf84626bb69"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"bitflags 1.3.2",
|
"bitflags 1.3.2",
|
||||||
"byteorder",
|
"byteorder",
|
||||||
|
"chrono",
|
||||||
|
"flate2",
|
||||||
"hex",
|
"hex",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"rustix 0.36.16",
|
"rustix 0.36.16",
|
||||||
|
|||||||
@@ -113,6 +113,7 @@ parquet = { version = "49.0.0", default-features = false, features = ["zstd"] }
|
|||||||
parquet_derive = "49.0.0"
|
parquet_derive = "49.0.0"
|
||||||
pbkdf2 = { version = "0.12.1", features = ["simple", "std"] }
|
pbkdf2 = { version = "0.12.1", features = ["simple", "std"] }
|
||||||
pin-project-lite = "0.2"
|
pin-project-lite = "0.2"
|
||||||
|
procfs = "0.14"
|
||||||
prometheus = {version = "0.13", default_features=false, features = ["process"]} # removes protobuf dependency
|
prometheus = {version = "0.13", default_features=false, features = ["process"]} # removes protobuf dependency
|
||||||
prost = "0.11"
|
prost = "0.11"
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
|
|||||||
@@ -13,6 +13,9 @@ twox-hash.workspace = true
|
|||||||
|
|
||||||
workspace_hack.workspace = true
|
workspace_hack.workspace = true
|
||||||
|
|
||||||
|
[target.'cfg(target_os = "linux")'.dependencies]
|
||||||
|
procfs.workspace = true
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
rand_distr = "0.4.3"
|
rand_distr = "0.4.3"
|
||||||
|
|||||||
@@ -31,6 +31,8 @@ pub use wrappers::{CountedReader, CountedWriter};
|
|||||||
mod hll;
|
mod hll;
|
||||||
pub mod metric_vec_duration;
|
pub mod metric_vec_duration;
|
||||||
pub use hll::{HyperLogLog, HyperLogLogVec};
|
pub use hll::{HyperLogLog, HyperLogLogVec};
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
pub mod more_process_metrics;
|
||||||
|
|
||||||
pub type UIntGauge = GenericGauge<AtomicU64>;
|
pub type UIntGauge = GenericGauge<AtomicU64>;
|
||||||
pub type UIntGaugeVec = GenericGaugeVec<AtomicU64>;
|
pub type UIntGaugeVec = GenericGaugeVec<AtomicU64>;
|
||||||
|
|||||||
54
libs/metrics/src/more_process_metrics.rs
Normal file
54
libs/metrics/src/more_process_metrics.rs
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
//! process metrics that the [`::prometheus`] crate doesn't provide.
|
||||||
|
|
||||||
|
// This module has heavy inspiration from the prometheus crate's `process_collector.rs`.
|
||||||
|
|
||||||
|
use crate::UIntGauge;
|
||||||
|
|
||||||
|
pub struct Collector {
|
||||||
|
descs: Vec<prometheus::core::Desc>,
|
||||||
|
vmlck: crate::UIntGauge,
|
||||||
|
}
|
||||||
|
|
||||||
|
const NMETRICS: usize = 1;
|
||||||
|
|
||||||
|
impl prometheus::core::Collector for Collector {
|
||||||
|
fn desc(&self) -> Vec<&prometheus::core::Desc> {
|
||||||
|
self.descs.iter().collect()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn collect(&self) -> Vec<prometheus::proto::MetricFamily> {
|
||||||
|
let Ok(myself) = procfs::process::Process::myself() else {
|
||||||
|
return vec![];
|
||||||
|
};
|
||||||
|
let mut mfs = Vec::with_capacity(NMETRICS);
|
||||||
|
if let Ok(status) = myself.status() {
|
||||||
|
if let Some(vmlck) = status.vmlck {
|
||||||
|
self.vmlck.set(vmlck);
|
||||||
|
mfs.extend(self.vmlck.collect())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mfs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Collector {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
let mut descs = Vec::new();
|
||||||
|
|
||||||
|
let vmlck =
|
||||||
|
UIntGauge::new("libmetrics_process_status_vmlck", "/proc/self/status vmlck").unwrap();
|
||||||
|
descs.extend(
|
||||||
|
prometheus::core::Collector::desc(&vmlck)
|
||||||
|
.into_iter()
|
||||||
|
.cloned(),
|
||||||
|
);
|
||||||
|
|
||||||
|
Self { descs, vmlck }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Collector {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self::new()
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -272,6 +272,8 @@ fn start_pageserver(
|
|||||||
);
|
);
|
||||||
set_build_info_metric(GIT_VERSION, BUILD_TAG);
|
set_build_info_metric(GIT_VERSION, BUILD_TAG);
|
||||||
set_launch_timestamp_metric(launch_ts);
|
set_launch_timestamp_metric(launch_ts);
|
||||||
|
#[cfg(target_os = "linux")]
|
||||||
|
metrics::register_internal(Box::new(metrics::more_process_metrics::Collector::new())).unwrap();
|
||||||
pageserver::preinitialize_metrics();
|
pageserver::preinitialize_metrics();
|
||||||
|
|
||||||
// If any failpoints were set from FAILPOINTS environment variable,
|
// If any failpoints were set from FAILPOINTS environment variable,
|
||||||
|
|||||||
Reference in New Issue
Block a user