diff --git a/pageserver/src/metrics.rs b/pageserver/src/metrics.rs index fa8cd504d0..75ce77f062 100644 --- a/pageserver/src/metrics.rs +++ b/pageserver/src/metrics.rs @@ -683,6 +683,15 @@ pub static LAYER_GET_VALUE_RECONSTRUCT_DATA_SPAWN_BLOCKING_STARTED_COUNT: Lazy = + Lazy::new(|| { + register_int_gauge!( + "pageserver_layer_get_value_reconstruct_data_spawn_blocking_active_gauge", + "Number of spawn_blocking calls active in Layer::get_value_reconstruct_data" + ) + .expect("failed to define a metric") + }); + pub static LAYER_GET_VALUE_RECONSTRUCT_DATA_SPAWN_BLOCKING_QUEUE_DELAY: Lazy = Lazy::new( || { register_histogram!( diff --git a/pageserver/src/tenant/storage_layer.rs b/pageserver/src/tenant/storage_layer.rs index 39fd4aae75..e3f517d6c4 100644 --- a/pageserver/src/tenant/storage_layer.rs +++ b/pageserver/src/tenant/storage_layer.rs @@ -413,14 +413,17 @@ pub trait Layer: std::fmt::Debug + Send + Sync + 'static { )) } else { crate::metrics::LAYER_GET_VALUE_RECONSTRUCT_DATA_SPAWN_BLOCKING_STARTED_COUNT.inc(); - tokio::task::spawn_blocking(move || { + crate::metrics::LAYER_GET_VALUE_RECONSTRUCT_DATA_SPAWN_BLOCKING_ACTIVE_GAUGE.inc(); + let res = tokio::task::spawn_blocking(move || { crate::metrics::LAYER_GET_VALUE_RECONSTRUCT_DATA_SPAWN_BLOCKING_QUEUE_DELAY .observe(start.elapsed().as_secs_f64()); let _enter = span.enter(); self.get_value_reconstruct_data_blocking(key, lsn_range, reconstruct_data, ctx) }) .await - .context("spawn_blocking") + .context("spawn_blocking"); + crate::metrics::LAYER_GET_VALUE_RECONSTRUCT_DATA_SPAWN_BLOCKING_ACTIVE_GAUGE.dec(); + res }; let histo = match &res { Ok(Ok(_)) => &crate::metrics::LAYER_GET_VALUE_RECONSTRUCT_DATA_COMPLETION_TIME_OK,