feat: add metrics export as CSV/JSON (MON-04)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-03-11 12:33:19 +00:00
parent 1b8a8cfd32
commit 980fc3af6d
4 changed files with 116 additions and 3 deletions

View File

@@ -1,8 +1,20 @@
<template>
<div>
<div class="hidden md:block mb-8">
<h1 class="text-3xl font-bold text-white mb-2">Monitoring</h1>
<p class="text-white/70">Real-time system metrics and container resource usage</p>
<div class="flex items-center justify-between">
<div>
<h1 class="text-3xl font-bold text-white mb-2">Monitoring</h1>
<p class="text-white/70">Real-time system metrics and container resource usage</p>
</div>
<div class="flex gap-2">
<button class="glass-button text-sm px-4 py-2" @click="exportMetrics('csv')">
Export CSV
</button>
<button class="glass-button text-sm px-4 py-2" @click="exportMetrics('json')">
Export JSON
</button>
</div>
</div>
</div>
<!-- Summary Cards -->
@@ -401,6 +413,32 @@ function formatAlertTime(timestamp: number): string {
return d.toLocaleString()
}
async function exportMetrics(format: 'csv' | 'json') {
try {
const data = await rpcClient.call<{ csv?: string; data?: unknown[]; count: number }>({
method: 'monitoring.export',
params: { format, resolution: 'minute', count: 1440 },
})
let blob: Blob
let filename: string
if (format === 'csv' && data?.csv) {
blob = new Blob([data.csv], { type: 'text/csv' })
filename = `archipelago-metrics-${new Date().toISOString().slice(0, 10)}.csv`
} else {
blob = new Blob([JSON.stringify(data?.data ?? [], null, 2)], { type: 'application/json' })
filename = `archipelago-metrics-${new Date().toISOString().slice(0, 10)}.json`
}
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = filename
a.click()
URL.revokeObjectURL(url)
} catch {
if (import.meta.env.DEV) console.warn('Failed to export metrics')
}
}
async function fetchCurrent() {
try {
const data = await rpcClient.call<MetricSnapshot | { status: string }>({