From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [212.224.123.68]) by lore.proxmox.com (Postfix) with ESMTPS id 875D31FF16B for ; Tue, 26 Aug 2025 15:51:44 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id E089234CA2; Tue, 26 Aug 2025 15:51:37 +0200 (CEST) From: Lukas Wagner To: pdm-devel@lists.proxmox.com Date: Tue, 26 Aug 2025 15:51:08 +0200 Message-ID: <20250826135119.336510-14-l.wagner@proxmox.com> X-Mailer: git-send-email 2.47.2 In-Reply-To: <20250826135119.336510-1-l.wagner@proxmox.com> References: <20250826135119.336510-1-l.wagner@proxmox.com> MIME-Version: 1.0 X-Bm-Milter-Handled: 55990f41-d878-4baa-be0a-ee34c49e34d2 X-Bm-Transport-Timestamp: 1756216281415 X-SPAM-LEVEL: Spam detection results: 0 AWL 0.026 Adjusted score from AWL reputation of From: address BAYES_00 -1.9 Bayes spam probability is 0 to 1% DMARC_MISSING 0.1 Missing DMARC policy KAM_DMARC_STATUS 0.01 Test Rule for DKIM or SPF Failure with Strict Alignment SPF_HELO_NONE 0.001 SPF: HELO does not publish an SPF Record SPF_PASS -0.001 SPF: sender matches SPF record Subject: [pdm-devel] [PATCH proxmox-datacenter-manager v7 13/24] metric collection: save time needed for collection run to RRD X-BeenThere: pdm-devel@lists.proxmox.com X-Mailman-Version: 2.1.29 Precedence: list List-Id: Proxmox Datacenter Manager development discussion List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Proxmox Datacenter Manager development discussion Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: pdm-devel-bounces@lists.proxmox.com Sender: "pdm-devel" For large setups, it might be useful to know how much time was needed to collect metrics for *all* remotes together, e.g. for making sure that the collection interval is not exceeded. Signed-off-by: Lukas Wagner Reviewed-by: Maximiliano Sandoval Reviewed-by: Dominik Csapak Tested-by: Dominik Csapak --- .../src/metric_collection/collection_task.rs | 17 ++++++ server/src/metric_collection/rrd_task.rs | 53 ++++++++++++++----- 2 files changed, 58 insertions(+), 12 deletions(-) diff --git a/server/src/metric_collection/collection_task.rs b/server/src/metric_collection/collection_task.rs index 51bcd78a..7605198f 100644 --- a/server/src/metric_collection/collection_task.rs +++ b/server/src/metric_collection/collection_task.rs @@ -17,6 +17,7 @@ use proxmox_sys::fs::CreateOptions; use pdm_api_types::remotes::{Remote, RemoteType}; +use crate::metric_collection::rrd_task::CollectionStats; use crate::{connection, task_utils}; use super::{ @@ -105,11 +106,27 @@ impl MetricCollectionTask { log::debug!("starting metric collection from all remotes - triggered by timer"); if let Some(remotes) = Self::load_remote_config() { + let now = Instant::now(); let to_fetch = remotes .iter() .map(|(name, _)| name.into()) .collect::>(); self.fetch_remotes(&remotes, &to_fetch).await; + let elapsed = now.elapsed(); + + if let Err(err) = self + .metric_data_tx + .send(RrdStoreRequest::CollectionStats { + timestamp: proxmox_time::epoch_i64(), + stats: CollectionStats { + // TODO: use as_millis_f64 once stabilized + total_time: elapsed.as_secs_f64() * 1000., + }, + }) + .await + { + log::error!("could not send collection stats to rrd task: {err}"); + } } } diff --git a/server/src/metric_collection/rrd_task.rs b/server/src/metric_collection/rrd_task.rs index 91927602..507d6b23 100644 --- a/server/src/metric_collection/rrd_task.rs +++ b/server/src/metric_collection/rrd_task.rs @@ -38,6 +38,13 @@ pub(super) enum RrdStoreRequest { /// Timestamp at which the request was done (UNIX epoch). request_at: i64, }, + /// Store collection stats. + CollectionStats { + /// Timestamp at which the collection took place (UNIX epoch). + timestamp: i64, + /// Statistics. + stats: CollectionStats, + }, } /// Result for a [`RrdStoreRequest`]. @@ -46,6 +53,12 @@ pub(super) struct RrdStoreResult { pub(super) most_recent_timestamp: i64, } +/// Statistics for a (full) metric collection run. +pub(super) struct CollectionStats { + /// Total time in ms. + pub(super) total_time: f64, +} + /// Task which stores received metrics in the RRD. Metric data is fed into /// this task via a MPSC channel. pub(super) async fn store_in_rrd_task( @@ -57,7 +70,8 @@ pub(super) async fn store_in_rrd_task( // Involves some blocking file IO let res = tokio::task::spawn_blocking(move || { let mut most_recent_timestamp = 0; - let channel = match msg { + + match msg { RrdStoreRequest::Pve { remote, metrics, @@ -71,7 +85,13 @@ pub(super) async fn store_in_rrd_task( } store_response_time(&cache_clone, &remote, response_time, request_at); - channel + let result = RrdStoreResult { + most_recent_timestamp, + }; + + if channel.send(result).is_err() { + log::error!("could not send RrdStoreStoreResult to metric collection task"); + }; } RrdStoreRequest::Pbs { remote, @@ -86,17 +106,17 @@ pub(super) async fn store_in_rrd_task( } store_response_time(&cache_clone, &remote, response_time, request_at); - channel - } - }; + let result = RrdStoreResult { + most_recent_timestamp, + }; - if channel - .send(RrdStoreResult { - most_recent_timestamp, - }) - .is_err() - { - log::error!("could not send RrdStoreStoreResult to metric collection task"); + if channel.send(result).is_err() { + log::error!("could not send RrdStoreStoreResult to metric collection task"); + }; + } + RrdStoreRequest::CollectionStats { timestamp, stats } => { + store_stats(&cache_clone, &stats, timestamp) + } }; }) .await; @@ -157,6 +177,15 @@ fn store_response_time(cache: &RrdCache, remote_name: &str, response_time: f64, cache.update_value(&name, response_time, timestamp, DataSourceType::Gauge); } +fn store_stats(cache: &RrdCache, stats: &CollectionStats, timestamp: i64) { + cache.update_value( + "nodes/localhost/metric-collection-total-time", + stats.total_time, + timestamp, + DataSourceType::Gauge, + ); +} + #[cfg(test)] mod tests { use proxmox_rrd_api_types::{RrdMode, RrdTimeframe}; -- 2.47.2 _______________________________________________ pdm-devel mailing list pdm-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel