From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from firstgate.proxmox.com (firstgate.proxmox.com [IPv6:2a01:7e0:0:424::9]) by lore.proxmox.com (Postfix) with ESMTPS id 49DF11FF295 for ; Tue, 26 Aug 2025 15:51:42 +0200 (CEST) Received: from firstgate.proxmox.com (localhost [127.0.0.1]) by firstgate.proxmox.com (Proxmox) with ESMTP id 4378834C1E; Tue, 26 Aug 2025 15:51:36 +0200 (CEST) From: Lukas Wagner To: pdm-devel@lists.proxmox.com Date: Tue, 26 Aug 2025 15:51:07 +0200 Message-ID: <20250826135119.336510-13-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: 1756216281325 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 12/24] metric collection: record remote response time in metric database 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" This gives us the ability to retrieve max/avg response times for a given time window. Signed-off-by: Lukas Wagner Reviewed-by: Maximiliano Sandoval Reviewed-by: Dominik Csapak Tested-by: Dominik Csapak --- .../src/metric_collection/collection_task.rs | 13 +++++++- server/src/metric_collection/rrd_task.rs | 31 +++++++++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) diff --git a/server/src/metric_collection/collection_task.rs b/server/src/metric_collection/collection_task.rs index c3448995..51bcd78a 100644 --- a/server/src/metric_collection/collection_task.rs +++ b/server/src/metric_collection/collection_task.rs @@ -266,6 +266,7 @@ impl MetricCollectionTask { let (result_tx, result_rx) = oneshot::channel(); let now = proxmox_time::epoch_i64(); + let start = Instant::now(); let res: Result = async { match remote.ty { @@ -279,11 +280,16 @@ impl MetricCollectionTask { ) .await?; + let duration = start.elapsed(); + sender .send(RrdStoreRequest::Pve { remote: remote.id.clone(), metrics, channel: result_tx, + // TODO: use as_millis_f64 once stabilized + response_time: duration.as_secs_f64() * 1000., + request_at: now, }) .await?; } @@ -293,15 +299,20 @@ impl MetricCollectionTask { .metrics(Some(true), Some(status.most_recent_datapoint)) .await?; + let duration = start.elapsed(); + sender .send(RrdStoreRequest::Pbs { remote: remote.id.clone(), metrics, channel: result_tx, + // TODO: use as_millis_f64 once stabilized + response_time: duration.as_secs_f64() * 1000., + request_at: now, }) .await?; } - } + }; result_rx.await.map_err(Error::from) } diff --git a/server/src/metric_collection/rrd_task.rs b/server/src/metric_collection/rrd_task.rs index f65a9291..91927602 100644 --- a/server/src/metric_collection/rrd_task.rs +++ b/server/src/metric_collection/rrd_task.rs @@ -20,6 +20,10 @@ pub(super) enum RrdStoreRequest { metrics: ClusterMetrics, /// Oneshot channel to return the [`RrdStoreResult`]. channel: oneshot::Sender, + /// Reponse time in ms for the API request. + response_time: f64, + /// Timestamp at which the request was done (UNIX epoch). + request_at: i64, }, /// Store PBS metrics. Pbs { @@ -29,6 +33,10 @@ pub(super) enum RrdStoreRequest { metrics: Metrics, /// Oneshot channel to return the [`RrdStoreResult`]. channel: oneshot::Sender, + /// Reponse time in ms for the API request. + response_time: f64, + /// Timestamp at which the request was done (UNIX epoch). + request_at: i64, }, } @@ -54,11 +62,14 @@ pub(super) async fn store_in_rrd_task( remote, metrics, channel, + response_time, + request_at, } => { for data_point in metrics.data { most_recent_timestamp = most_recent_timestamp.max(data_point.timestamp); store_metric_pve(&cache_clone, &remote, &data_point); } + store_response_time(&cache_clone, &remote, response_time, request_at); channel } @@ -66,11 +77,14 @@ pub(super) async fn store_in_rrd_task( remote, metrics, channel, + response_time, + request_at, } => { for data_point in metrics.data { most_recent_timestamp = most_recent_timestamp.max(data_point.timestamp); store_metric_pbs(&cache_clone, &remote, &data_point); } + store_response_time(&cache_clone, &remote, response_time, request_at); channel } @@ -137,6 +151,12 @@ fn store_metric_pbs(cache: &RrdCache, remote_name: &str, data_point: &MetricData ); } +fn store_response_time(cache: &RrdCache, remote_name: &str, response_time: f64, timestamp: i64) { + let name = format!("remotes/{remote_name}/metric-collection-response-time"); + + cache.update_value(&name, response_time, timestamp, DataSourceType::Gauge); +} + #[cfg(test)] mod tests { use proxmox_rrd_api_types::{RrdMode, RrdTimeframe}; @@ -199,6 +219,8 @@ mod tests { remote: "some-remote".into(), metrics, channel: tx_back, + response_time: 10.0, + request_at: now, }; // Act @@ -224,6 +246,15 @@ mod tests { assert!(data.data.iter().any(Option::is_some)); } + if let Some(data) = cache.extract_data( + "remotes/some-remote", + "metric-collection-response-time", + RrdTimeframe::Hour, + RrdMode::Max, + )? { + assert!(data.data.iter().any(Option::is_some)); + } + Ok(()) } } -- 2.47.2 _______________________________________________ pdm-devel mailing list pdm-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pdm-devel