my own status page
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

feat: fix overall status bar

+40 -17
+32 -13
src/db.ts
··· 130 130 export async function getOverallUptimeDays( 131 131 db: D1Database, 132 132 days: number, 133 + serviceIds?: string[], 133 134 ): Promise<{ date: string; status: "up" | "degraded" | "down" | "none" }[]> { 134 135 const since = Math.floor(Date.now() / 1000) - days * 24 * 60 * 60; 135 - const rows = await db 136 - .prepare( 137 - `SELECT 138 - (timestamp / 86400) AS day_bucket, 139 - status, 140 - COUNT(*) AS cnt 141 - FROM pings 142 - WHERE timestamp >= ? 143 - GROUP BY day_bucket, status 144 - ORDER BY day_bucket ASC`, 145 - ) 146 - .bind(since) 147 - .all(); 136 + let rows; 137 + if (serviceIds && serviceIds.length > 0) { 138 + const placeholders = serviceIds.map(() => "?").join(", "); 139 + rows = await db 140 + .prepare( 141 + `SELECT 142 + (timestamp / 86400) AS day_bucket, 143 + status, 144 + COUNT(*) AS cnt 145 + FROM pings 146 + WHERE timestamp >= ? AND service_id IN (${placeholders}) 147 + GROUP BY day_bucket, status 148 + ORDER BY day_bucket ASC`, 149 + ) 150 + .bind(since, ...serviceIds) 151 + .all(); 152 + } else { 153 + rows = await db 154 + .prepare( 155 + `SELECT 156 + (timestamp / 86400) AS day_bucket, 157 + status, 158 + COUNT(*) AS cnt 159 + FROM pings 160 + WHERE timestamp >= ? 161 + GROUP BY day_bucket, status 162 + ORDER BY day_bucket ASC`, 163 + ) 164 + .bind(since) 165 + .all(); 166 + } 148 167 149 168 const bucketMap = new Map<number, Map<string, number>>(); 150 169 for (const row of rows.results) {
+1 -1
src/overall.ts
··· 24 24 const activeIncidents = prefetched?.activeIncidents ?? await getActiveIncidents(env.DB); 25 25 26 26 const servers = Object.entries(manifest).filter( 27 - ([, m]) => m.type === "server" && m.services.length > 0, 27 + ([, m]) => m.type === "server" && m.services.some((s) => s.health_url), 28 28 ); 29 29 30 30 const statuses: string[] = [];
+7 -3
src/routes/index.ts
··· 6 6 import { COMMIT_SHA } from "../version"; 7 7 8 8 export async function handleIndex(env: Env): Promise<Response> { 9 - const [manifest, latestPings, uptimes, lastCheck, uptimeDays, activeIncidentsWithUpdates, activeIncidentsList, resolvedIncidents] = await Promise.all([ 10 - getManifest(env), 9 + const manifest = await getManifest(env); 10 + const serverServiceIds = Object.values(manifest) 11 + .filter((m) => m.type === "server" && m.services.some((s) => s.health_url)) 12 + .flatMap((m) => m.services.filter((s) => s.health_url).map((s) => s.name)); 13 + 14 + const [latestPings, uptimes, lastCheck, uptimeDays, activeIncidentsWithUpdates, activeIncidentsList, resolvedIncidents] = await Promise.all([ 11 15 getAllLatestPings(env.DB), 12 16 getAllUptime7d(env.DB), 13 17 getLastCheckTime(env.DB), 14 - getOverallUptimeDays(env.DB, 90), 18 + getOverallUptimeDays(env.DB, 90, serverServiceIds), 15 19 getActiveIncidentsWithUpdates(env.DB), 16 20 getActiveIncidents(env.DB), 17 21 getRecentResolvedIncidentsWithUpdates(env.DB, 7),