${max}ms
${min}ms
+ ${regions.length > 1 ? `
${legend}
` : ''}
`;
}
@@ -131,7 +177,7 @@ export const dashboard = new Elysia()
if (monitorIds.length > 0) {
const allPings = await sql`
SELECT * FROM (
- SELECT p.*, ROW_NUMBER() OVER (PARTITION BY p.monitor_id ORDER BY p.checked_at DESC) as rn
+ SELECT p.*, ROW_NUMBER() OVER (PARTITION BY p.monitor_id, COALESCE(p.region,'__none__') ORDER BY p.checked_at DESC) as rn
FROM pings p WHERE p.monitor_id = ANY(${monitorIds})
) sub WHERE rn <= 20 ORDER BY monitor_id, checked_at ASC
`;
@@ -243,12 +289,11 @@ export const dashboard = new Elysia()
if (!monitor) return new Response("Not found", { status: 404 });
const pings = await sql`
- SELECT latency_ms FROM pings
+ SELECT latency_ms, region FROM pings
WHERE monitor_id = ${params.id} AND latency_ms IS NOT NULL
- ORDER BY checked_at DESC LIMIT 20
+ ORDER BY checked_at DESC LIMIT 40
`;
- const latencies = pings.map((p: any) => p.latency_ms).reverse();
- return new Response(sparklineSSR(latencies), {
+ return new Response(sparklineSSR(pings.slice().reverse()), {
headers: { "content-type": "text/html; charset=utf-8" },
});
})
diff --git a/apps/web/src/utils/sparkline.ts b/apps/web/src/utils/sparkline.ts
index 6aa076c..bec8386 100644
--- a/apps/web/src/utils/sparkline.ts
+++ b/apps/web/src/utils/sparkline.ts
@@ -1,4 +1,4 @@
-export function sparkline(values: number[], width = 120, height = 32): string {
+export function sparkline(values: number[], width = 120, height = 32, color = '#60a5fa'): string {
if (!values.length) return '';
const max = Math.max(...values, 1);
const min = Math.min(...values, 0);
@@ -9,5 +9,38 @@ export function sparkline(values: number[], width = 120, height = 32): string {
const y = height - ((v - min) / range) * (height - 4) - 2;
return `${x},${y}`;
}).join(' ');
- return `