From 338e767c274cb628da261ebf71d6338c85616937 Mon Sep 17 00:00:00 2001 From: Kieran Klukas Date: Sun, 15 Mar 2026 18:25:28 -0400 Subject: [PATCH] feat: fix overall status bar --- src/db.ts | 45 ++++++++++++++++++++++++++++++++------------- src/overall.ts | 2 +- src/routes/index.ts | 10 +++++++--- 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/db.ts b/src/db.ts index ba9dd36..8b40fb2 100644 --- a/src/db.ts +++ b/src/db.ts @@ -130,21 +130,40 @@ export async function getUptimeBuckets( export async function getOverallUptimeDays( db: D1Database, days: number, + serviceIds?: string[], ): Promise<{ date: string; status: "up" | "degraded" | "down" | "none" }[]> { const since = Math.floor(Date.now() / 1000) - days * 24 * 60 * 60; - const rows = await db - .prepare( - `SELECT - (timestamp / 86400) AS day_bucket, - status, - COUNT(*) AS cnt - FROM pings - WHERE timestamp >= ? - GROUP BY day_bucket, status - ORDER BY day_bucket ASC`, - ) - .bind(since) - .all(); + let rows; + if (serviceIds && serviceIds.length > 0) { + const placeholders = serviceIds.map(() => "?").join(", "); + rows = await db + .prepare( + `SELECT + (timestamp / 86400) AS day_bucket, + status, + COUNT(*) AS cnt + FROM pings + WHERE timestamp >= ? AND service_id IN (${placeholders}) + GROUP BY day_bucket, status + ORDER BY day_bucket ASC`, + ) + .bind(since, ...serviceIds) + .all(); + } else { + rows = await db + .prepare( + `SELECT + (timestamp / 86400) AS day_bucket, + status, + COUNT(*) AS cnt + FROM pings + WHERE timestamp >= ? + GROUP BY day_bucket, status + ORDER BY day_bucket ASC`, + ) + .bind(since) + .all(); + } const bucketMap = new Map>(); for (const row of rows.results) { diff --git a/src/overall.ts b/src/overall.ts index 81a3a3e..c3c7e2c 100644 --- a/src/overall.ts +++ b/src/overall.ts @@ -24,7 +24,7 @@ export async function getOverallStatus( const activeIncidents = prefetched?.activeIncidents ?? await getActiveIncidents(env.DB); const servers = Object.entries(manifest).filter( - ([, m]) => m.type === "server" && m.services.length > 0, + ([, m]) => m.type === "server" && m.services.some((s) => s.health_url), ); const statuses: string[] = []; diff --git a/src/routes/index.ts b/src/routes/index.ts index 55486bb..77aa45a 100644 --- a/src/routes/index.ts +++ b/src/routes/index.ts @@ -6,12 +6,16 @@ import { getOverallStatus } from "../overall"; import { COMMIT_SHA } from "../version"; export async function handleIndex(env: Env): Promise { - const [manifest, latestPings, uptimes, lastCheck, uptimeDays, activeIncidentsWithUpdates, activeIncidentsList, resolvedIncidents] = await Promise.all([ - getManifest(env), + const manifest = await getManifest(env); + const serverServiceIds = Object.values(manifest) + .filter((m) => m.type === "server" && m.services.some((s) => s.health_url)) + .flatMap((m) => m.services.filter((s) => s.health_url).map((s) => s.name)); + + const [latestPings, uptimes, lastCheck, uptimeDays, activeIncidentsWithUpdates, activeIncidentsList, resolvedIncidents] = await Promise.all([ getAllLatestPings(env.DB), getAllUptime7d(env.DB), getLastCheckTime(env.DB), - getOverallUptimeDays(env.DB, 90), + getOverallUptimeDays(env.DB, 90, serverServiceIds), getActiveIncidentsWithUpdates(env.DB), getActiveIncidents(env.DB), getRecentResolvedIncidentsWithUpdates(env.DB, 7), -- 2.51.2