Files
boc/quixzoom-capture-pipeline/visualization/system-health.html
T
Bernt bae705aa97 ARCHITECTURE: NFC roadmap, edge AI, audit logging
- Add NFC ePassport roadmap (ICAO 9303, eIDAS)
- Add TensorFlow.js edge face detection (BlazeFace)
- Add structured audit logger (GDPR-compliant)
- Risk scoring support

Part of KYC Apple Native UX v1.1.0
2026-06-29 16:24:48 +00:00

171 lines
5.8 KiB
HTML

<!DOCTYPE html>
<html lang="sv">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>QUIXZOOM System Health</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font-family: -apple-system, system-ui, sans-serif; background: #0a0e27; color: #fff; padding: 20px; }
.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: 20px; max-width: 1400px; margin: 0 auto; }
.card { background: #1a1f3a; border-radius: 12px; padding: 20px; }
.card h2 { font-size: 14px; text-transform: uppercase; color: #8b92b4; margin-bottom: 16px; }
.metric { display: flex; justify-content: space-between; align-items: center; padding: 12px 0; border-bottom: 1px solid #2a3050; }
.metric:last-child { border-bottom: none; }
.metric-label { font-size: 14px; color: #c5c9e0; }
.metric-value { font-size: 18px; font-weight: 600; }
.metric-value.good { color: #4ade80; }
.metric-value.warn { color: #fbbf24; }
.metric-value.critical { color: #f87171; }
.header { text-align: center; margin-bottom: 30px; }
.header h1 { font-size: 24px; margin-bottom: 8px; }
.header p { color: #8b92b4; font-size: 14px; }
.timestamp { font-size: 12px; color: #5a6090; margin-top: 20px; text-align: center; }
</style>
</head>
<body>
<div class="header">
<h1>QUIXZOOM System Health</h1>
<p>Real-time infrastructure monitoring</p>
</div>
<div class="grid">
<div class="card">
<h2>Data Collection</h2>
<div class="metric">
<span class="metric-label">Observations/min</span>
<span class="metric-value good" id="obs-rate">0</span>
</div>
<div class="metric">
<span class="metric-label">Videos uploaded</span>
<span class="metric-value" id="videos">0</span>
</div>
<div class="metric">
<span class="metric-label">AI analyses/min</span>
<span class="metric-value good" id="ai-rate">0</span>
</div>
</div>
<div class="card">
<h2>Knowledge Graph</h2>
<div class="metric">
<span class="metric-label">Total objects</span>
<span class="metric-value" id="total-objects">0</span>
</div>
<div class="metric">
<span class="metric-label">Evidence per object</span>
<span class="metric-value" id="evidence-ratio">0</span>
</div>
<div class="metric">
<span class="metric-label">Uncertain objects</span>
<span class="metric-value warn" id="uncertain">0</span>
</div>
<div class="metric">
<span class="metric-label">Unverified</span>
<span class="metric-value warn" id="unverified">0</span>
</div>
<div class="metric">
<span class="metric-label">Duplicate suspects</span>
<span class="metric-value critical" id="duplicates">0</span>
</div>
</div>
<div class="card">
<h2>Identity Engine</h2>
<div class="metric">
<span class="metric-label">Auto-merge rate</span>
<span class="metric-value good" id="auto-merge">0%</span>
</div>
<div class="metric">
<span class="metric-label">Manual verification</span>
<span class="metric-value" id="manual">0%</span>
</div>
<div class="metric">
<span class="metric-label">Precision</span>
<span class="metric-value good" id="precision">0%</span>
</div>
<div class="metric">
<span class="metric-label">Recall</span>
<span class="metric-value good" id="recall">0%</span>
</div>
</div>
<div class="card">
<h2>Infrastructure Health</h2>
<div class="metric">
<span class="metric-label">Objects with changes</span>
<span class="metric-value warn" id="changes">0</span>
</div>
<div class="metric">
<span class="metric-label">New anomalies</span>
<span class="metric-value critical" id="anomalies">0</span>
</div>
<div class="metric">
<span class="metric-label">Priority missions</span>
<span class="metric-value critical" id="missions">0</span>
</div>
</div>
<div class="card">
<h2>Fleet</h2>
<div class="metric">
<span class="metric-label">Active Zoomers</span>
<span class="metric-value good" id="active-zoomers">0</span>
</div>
<div class="metric">
<span class="metric-label">Avg response time</span>
<span class="metric-value" id="response-time">0ms</span>
</div>
<div class="metric">
<span class="metric-label">Mission completion</span>
<span class="metric-value good" id="completion">0%</span>
</div>
</div>
<div class="card">
<h2>System Resources</h2>
<div class="metric">
<span class="metric-label">Events/sec</span>
<span class="metric-value" id="events-sec">0</span>
</div>
<div class="metric">
<span class="metric-label">DB writes/sec</span>
<span class="metric-value" id="db-writes">0</span>
</div>
<div class="metric">
<span class="metric-label">CPU</span>
<span class="metric-value" id="cpu">0%</span>
</div>
<div class="metric">
<span class="metric-label">RAM</span>
<span class="metric-value" id="ram">0MB</span>
</div>
<div class="metric">
<span class="metric-label">P99 Latency</span>
<span class="metric-value" id="p99">0ms</span>
</div>
</div>
</div>
<p class="timestamp" id="timestamp">Last updated: --</p>
<script>
async function fetchStats() {
try {
const res = await fetch('http://localhost:3001/stats');
const data = await res.json();
document.getElementById('total-objects').textContent = data.objects || 0;
document.getElementById('active-zoomers').textContent = data.zoomers || 0;
document.getElementById('timestamp').textContent = 'Last updated: ' + new Date().toISOString();
} catch (e) {
console.error('Failed to fetch stats:', e);
}
}
fetchStats();
setInterval(fetchStats, 5000);
</script>
</body>
</html>