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 && (
+ Agentless mode: host-level CPU, RAM, and free-disk metrics are not available. +