From ba1559e79029b5e650cefc109817176c0e999638 Mon Sep 17 00:00:00 2001 From: nessi Date: Fri, 13 Feb 2026 10:01:24 +0100 Subject: [PATCH] Improve agentless mode messaging for host-level metrics Updated the messaging and UI to clarify unavailability of host-level metrics, such as CPU, RAM, and disk space, in agentless mode. Added clear formatting and new functions to handle missing metrics gracefully in the frontend. --- backend/app/services/infra_probe.py | 4 ++-- frontend/src/pages/TargetDetailPage.jsx | 26 +++++++++++++++++++++++-- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/backend/app/services/infra_probe.py b/backend/app/services/infra_probe.py index a5910b0..d331ec8 100644 --- a/backend/app/services/infra_probe.py +++ b/backend/app/services/infra_probe.py @@ -17,10 +17,10 @@ class DiskSpaceProvider: class NullDiskSpaceProvider(DiskSpaceProvider): async def get_free_bytes(self, target_host: str) -> DiskSpaceProbeResult: return DiskSpaceProbeResult( - source="none", + source="agentless", status="unavailable", free_bytes=None, - message=f"No infra probe configured for host {target_host}. Add SSH/Agent provider later.", + message=f"Agentless mode: host-level free disk is not available for {target_host}.", ) diff --git a/frontend/src/pages/TargetDetailPage.jsx b/frontend/src/pages/TargetDetailPage.jsx index a24b9ed..21c26e1 100644 --- a/frontend/src/pages/TargetDetailPage.jsx +++ b/frontend/src/pages/TargetDetailPage.jsx @@ -41,6 +41,19 @@ function formatNumber(value, digits = 2) { return Number(value).toFixed(digits); } +function formatHostMetricUnavailable() { + return "N/A (agentless)"; +} + +function formatDiskSpaceAgentless(diskSpace) { + if (!diskSpace) return formatHostMetricUnavailable(); + if (diskSpace.free_bytes !== null && diskSpace.free_bytes !== undefined) { + return formatBytes(diskSpace.free_bytes); + } + if (diskSpace.status === "unavailable") return formatHostMetricUnavailable(); + return "-"; +} + function MetricsTooltip({ active, payload, label }) { if (!active || !payload || payload.length === 0) return null; const row = payload[0]?.payload || {}; @@ -346,6 +359,9 @@ export function TargetDetailPage() { {uiMode === "dba" && overview && (

Database Overview

+

+ Agentless mode: host-level CPU, RAM, and free-disk metrics are not available. +

PostgreSQL Version{overview.instance.server_version || "-"}
@@ -366,8 +382,8 @@ export function TargetDetailPage() {
WAL Size{formatBytes(overview.storage.wal_directory_size_bytes)}
-
- Free Disk{formatBytes(overview.storage.disk_space.free_bytes)} +
+ Free Disk{formatDiskSpaceAgentless(overview.storage.disk_space)}
Replay Lag @@ -378,6 +394,12 @@ export function TargetDetailPage() {
Replication Slots{overview.replication.replication_slots_count ?? "-"}
Repl Clients{overview.replication.active_replication_clients ?? "-"}
Autovacuum Workers{overview.performance.autovacuum_workers ?? "-"}
+
+ Host CPU{formatHostMetricUnavailable()} +
+
+ Host RAM{formatHostMetricUnavailable()} +