From 9218d22954d61296a32c49373ab0f17f0be59cfe Mon Sep 17 00:00:00 2001 From: zwlucas Date: Fri, 29 May 2026 17:41:33 -0300 Subject: feat: add SSL info tracking and server metrics collection Signed-off-by: zwlucas --- frontend/src/routes/(admin)/admin/+page.svelte | 67 ++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) (limited to 'frontend/src/routes/(admin)/admin/+page.svelte') diff --git a/frontend/src/routes/(admin)/admin/+page.svelte b/frontend/src/routes/(admin)/admin/+page.svelte index 5be9154..7fa361d 100644 --- a/frontend/src/routes/(admin)/admin/+page.svelte +++ b/frontend/src/routes/(admin)/admin/+page.svelte @@ -14,6 +14,7 @@ services = data.services ?? []; initialized = true; fetchMaintenances(); + fetchServerStats(); } }); let editingSvc: any = $state(null); @@ -29,6 +30,26 @@ let mtnSaving = $state(false); let mtnFormError = $state(''); + // server health state + let serverStats: { cpu_percent: number; memory_percent: number; disk_percent: number } | null = $state(null); + let serverStatsLoading = $state(true); + let serverStatsError = $state(''); + + async function fetchServerStats() { + serverStatsLoading = true; + serverStatsError = ''; + try { + const res = await fetch(`${API}/admin/server-stats`, { headers: { Authorization: `Bearer ${token}` } }); + if (await handleUnauthorized(res)) return; + if (!res.ok) throw new Error('Erro ao carregar'); + serverStats = await res.json(); + } catch { + serverStatsError = 'Falha ao carregar métricas do servidor'; + } finally { + serverStatsLoading = false; + } + } + function apiHeaders() { return { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }; } @@ -265,6 +286,52 @@ + +
+

+ Saúde do Sistema +

+ {#if serverStatsLoading} +
+ {#each ['CPU', 'RAM', 'Disco'] as label} +
+

{label}

+
+

+
+ {/each} +
+ {:else if serverStats} +
+ {#each [ + { label: 'CPU', pct: serverStats.cpu_percent }, + { label: 'RAM', pct: serverStats.memory_percent }, + { label: 'Disco', pct: serverStats.disk_percent }, + ] as item} + {@const color = item.pct >= 90 ? 'var(--red)' : item.pct >= 70 ? 'var(--amber)' : 'var(--green)'} +
+
+

{item.label}

+ + {item.pct.toFixed(1)}% + +
+
+
+
+
+ {/each} +
+ {:else if serverStatsError} +
+

{serverStatsError}

+
+ {/if} +
+