// Overview — minimal, focused on what matters at a glance
const { Drawer, RequestDetailContent, Sparkline, BarChart, fmtAgo, StatusCode, RegionPill } = window.UI;
function isTrafficSuccess(row) {
return row.status > 0 && row.status < 400 && !row.error;
}
function isTrafficError(row) {
return row.status === 0 || row.status >= 400 || !!row.error;
}
function RecentTrafficCard({ title, rows, empty, detail, onSelect }) {
return (
{title}
{rows.length} in window
{rows.length === 0
?
{empty}
:
| Time | Region | Pool | Status | Detail |
{rows.map(r => (
onSelect?.(r)} style={{cursor: onSelect ? "pointer" : "default"}}>
| {fmtAgo(r.ts)} ago |
|
{r.pool} |
|
{detail(r)} |
))}
}
);
}
function PageOverview({ state }) {
const { pools, traffic, regionGroups, stats } = state;
const [open, setOpen] = React.useState(null);
const totalNodes = pools.flatMap(p => p.nodes || []).length;
const onlineNodes = pools.flatMap(p => p.nodes || []).filter(n => n.alive && n.enabled).length;
const recent = traffic.requests;
const ok = recent.filter(isTrafficSuccess).length;
const successRate = traffic.metrics?.requests ? (traffic.metrics.success_rate * 100).toFixed(1) : (recent.length ? (ok / recent.length * 100).toFixed(1) : "100.0");
const p95 = traffic.metrics?.p95_latency_ms || Math.round(traffic.series.slice(-10).reduce((a,b) => a + b.p95, 0) / 10);
const successes = recent.filter(isTrafficSuccess).slice(0, 5);
const errs = recent.filter(isTrafficError).slice(0, 5);
const uptime = stats?.uptime ? stats.uptime.replace(/(\.\d+)?s$/, "s") : "—";
return (
Overview
Real-time signals from the egress fleet.
Uptime
{uptime}
since last reload
Online nodes
{onlineNodes}/ {totalNodes}
across {pools.length} pools
Success rate
{successRate}%
last 60 minutes
P95 latency
{p95}ms
all egress
P95 latency
last 60m
s.p95)} width={500} height={120}/>
Region groups
{regionGroups.length} active
{regionGroups.map(g => (
{g.online}/{g.count}
{g.minLatency ? `${g.minLatency}ms · ` : ""}{g.templateBackup ? "tpl backup" : "no fallback"}
))}
r.url || r.node || "—"}
onSelect={setOpen}
/>
r.error || r.url || r.node || "—"}
onSelect={setOpen}
/>
setOpen(null)} title="Request detail">
);
}
window.PageOverview = PageOverview;