diff --git a/pageserver/src/metrics.rs b/pageserver/src/metrics.rs index dc7f89cf3a..63fa858d55 100644 --- a/pageserver/src/metrics.rs +++ b/pageserver/src/metrics.rs @@ -891,6 +891,25 @@ pub(crate) static STORAGE_IO_SIZE: Lazy = Lazy::new(|| { ) .expect("failed to define a metric") }); + +pub(crate) mod virtual_file_descriptor_cache { + use super::*; + + pub(crate) static SIZE_MAX: Lazy = Lazy::new(|| { + register_uint_gauge!( + "pageserver_virtual_file_descriptor_cache_size_max", + "Maximum number of open file descriptors in the cache." + ).unwrap() + }); + + // SIZE_CURRENT: derive it like so: + // ``` + // sum (pageserver_io_operations_seconds_count{operation=~"^(open|open-after-replace)$") + // -ignoring(operation) + // sum(pageserver_io_operations_seconds_count{operation=~"^(close|close-by-replace)$"} + // ``` +} + #[derive(Debug)] struct GlobalAndPerTimelineHistogram { global: Histogram, diff --git a/pageserver/src/virtual_file.rs b/pageserver/src/virtual_file.rs index ada7313ba7..9af0de546d 100644 --- a/pageserver/src/virtual_file.rs +++ b/pageserver/src/virtual_file.rs @@ -701,6 +701,7 @@ pub fn init(num_slots: usize) { if OPEN_FILES.set(OpenFiles::new(num_slots)).is_err() { panic!("virtual_file::init called twice"); } + crate::metrics::virtual_file_descriptor_cache::SIZE_MAX.set(num_slots as u64); } const TEST_MAX_FILE_DESCRIPTORS: usize = 10;