Skip to content

Commit 1138bd5

Browse files
committed
fix(frontend): update system metrics parsing and display in satellite components
1 parent 898a98a commit 1138bd5

File tree

4 files changed

+48
-26
lines changed

4 files changed

+48
-26
lines changed

services/frontend/src/components/admin/satellites/HeartbeatDetailSheet.vue

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ const parsedMetrics = computed<SystemMetrics | null>(() => {
3131
try {
3232
const parsed = JSON.parse(props.heartbeat.system_metrics)
3333
return {
34-
cpu: parsed.cpu ?? 0,
35-
memory: parsed.memory ?? 0,
36-
disk: parsed.disk ?? 0,
34+
cpu: parsed.cpu_usage_percent ?? 0,
35+
memory: parsed.memory_usage_mb ?? 0,
36+
disk: parsed.disk_usage_percent ?? 0,
37+
uptime_seconds: parsed.uptime_seconds ?? 0,
3738
network: parsed.network
3839
}
3940
} catch {
@@ -181,18 +182,7 @@ function formatBytes(bytes: number): string {
181182
<HardDrive class="h-3 w-3" />
182183
Memory
183184
</span>
184-
<span class="text-sm font-medium">{{ (parsedMetrics.memory ?? 0).toFixed(1) }}%</span>
185-
</div>
186-
<div class="w-full bg-muted rounded-full h-2">
187-
<div
188-
class="h-2 rounded-full transition-all"
189-
:class="{
190-
'bg-green-600': (parsedMetrics.memory ?? 0) < 70,
191-
'bg-yellow-600': (parsedMetrics.memory ?? 0) >= 70 && (parsedMetrics.memory ?? 0) < 90,
192-
'bg-red-600': (parsedMetrics.memory ?? 0) >= 90
193-
}"
194-
:style="{ width: `${Math.min(parsedMetrics.memory ?? 0, 100)}%` }"
195-
></div>
185+
<span class="text-sm font-medium">{{ parsedMetrics.memory }} MB</span>
196186
</div>
197187
</div>
198188

services/frontend/src/components/admin/satellites/HeartbeatsTab.vue

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,13 +64,14 @@ function parseMetrics(metricsJson: string): SystemMetrics {
6464
try {
6565
const parsed = JSON.parse(metricsJson)
6666
return {
67-
cpu: parsed.cpu ?? 0,
68-
memory: parsed.memory ?? 0,
69-
disk: parsed.disk ?? 0,
67+
cpu: parsed.cpu_usage_percent ?? 0,
68+
memory: parsed.memory_usage_mb ?? 0,
69+
disk: parsed.disk_usage_percent ?? 0,
70+
uptime_seconds: parsed.uptime_seconds ?? 0,
7071
network: parsed.network
7172
}
7273
} catch {
73-
return { cpu: 0, memory: 0, disk: 0 }
74+
return { cpu: 0, memory: 0, disk: 0, uptime_seconds: 0 }
7475
}
7576
}
7677
@@ -263,7 +264,7 @@ onMounted(() => {
263264
{{ (parseMetrics(heartbeat.system_metrics).cpu ?? 0).toFixed(1) }}%
264265
</TableCell>
265266
<TableCell class="text-sm text-right tabular-nums">
266-
{{ (parseMetrics(heartbeat.system_metrics).memory ?? 0).toFixed(1) }}%
267+
{{ parseMetrics(heartbeat.system_metrics).memory }} MB
267268
</TableCell>
268269
<TableCell class="text-sm text-right tabular-nums">
269270
<span v-if="heartbeat.response_time_ms">{{ heartbeat.response_time_ms }}ms</span>

services/frontend/src/components/admin/satellites/SatelliteInfo.vue

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<script setup lang="ts">
2-
import { ref, computed, watch } from 'vue'
2+
import { ref, computed, watch, onMounted } from 'vue'
33
import { useI18n } from 'vue-i18n'
44
import { Badge } from '@/components/ui/badge'
55
import { Button } from '@/components/ui/button'
@@ -19,6 +19,7 @@ import {
1919
import { Hash, Server, Cpu, HardDrive } from 'lucide-vue-next'
2020
import { SatelliteService, type Satellite } from '@/services/satelliteService'
2121
import { DsCard } from '@/components/ui/ds-card'
22+
import { Progress } from '@/components/ui/progress'
2223
import { toast } from 'vue-sonner'
2324
2425
const { t } = useI18n()
@@ -32,6 +33,26 @@ const emit = defineEmits<{
3233
'satellite-updated': [satellite: Satellite]
3334
}>()
3435
36+
// Memory usage from latest heartbeat
37+
const memoryUsageMb = ref<number | null>(null)
38+
const memoryUsagePercent = computed(() => {
39+
if (memoryUsageMb.value === null || !props.satellite.system_info?.memory_mb) return null
40+
return Math.round((memoryUsageMb.value / props.satellite.system_info.memory_mb) * 100)
41+
})
42+
43+
async function loadLatestHeartbeat() {
44+
try {
45+
const response = await SatelliteService.listHeartbeats(props.satellite.id, { limit: 1, offset: 0 })
46+
const heartbeat = response.data.heartbeats[0]
47+
if (heartbeat) {
48+
const metrics = JSON.parse(heartbeat.system_metrics)
49+
memoryUsageMb.value = metrics.memory_usage_mb ?? null
50+
}
51+
} catch {
52+
// Silent fail — progress bar just won't show
53+
}
54+
}
55+
3556
// Available capabilities (MCP server types)
3657
const availableCapabilities = [
3758
'stdio',
@@ -170,6 +191,10 @@ const hasCapabilities = computed(() => {
170191
const hasTeam = computed(() => {
171192
return props.satellite.team !== null && props.satellite.team !== undefined
172193
})
194+
195+
onMounted(() => {
196+
loadLatestHeartbeat()
197+
})
173198
</script>
174199

175200
<template>
@@ -309,8 +334,13 @@ const hasTeam = computed(() => {
309334
<HardDrive class="h-4 w-4 text-muted-foreground" />
310335
{{ t('satellites.manage.info.memory') }}
311336
</dt>
312-
<dd class="mt-1 text-sm/6 text-gray-700 sm:col-span-2 sm:mt-0">
313-
{{ satellite.system_info.memory_mb }} MB
337+
<dd class="mt-1 text-sm/6 text-gray-700 sm:col-span-2 sm:mt-0 space-y-2">
338+
<div class="flex items-center justify-between">
339+
<span v-if="memoryUsageMb !== null">{{ memoryUsageMb }} MB / {{ satellite.system_info.memory_mb }} MB</span>
340+
<span v-else>{{ satellite.system_info.memory_mb }} MB</span>
341+
<span v-if="memoryUsagePercent !== null" class="text-sm text-muted-foreground">{{ memoryUsagePercent }}%</span>
342+
</div>
343+
<Progress v-if="memoryUsagePercent !== null" :model-value="memoryUsagePercent" class="w-full" />
314344
</dd>
315345
</div>
316346
</dl>

services/frontend/src/services/satelliteService.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,9 +129,10 @@ export interface SatelliteHeartbeat {
129129
}
130130

131131
export interface SystemMetrics {
132-
cpu: number
133-
memory: number
134-
disk: number
132+
cpu: number // cpu_usage_percent (0-100)
133+
memory: number // memory_usage_mb (absolute MB)
134+
disk: number // disk_usage_percent (0-100)
135+
uptime_seconds: number // process uptime
135136
network?: {
136137
rx: number
137138
tx: number

0 commit comments

Comments
 (0)