From 43c3443e3f12e27cbb240bafd3ca62f257359452 Mon Sep 17 00:00:00 2001 From: nate Date: Fri, 10 Apr 2026 02:43:52 +0400 Subject: [PATCH] update: monitor display --- apps/status/src/data.ts | 8 ++++---- apps/status/src/static/app.css | 1 + apps/status/src/views/page.ejs | 30 +++++++++++++++++++++++------- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/apps/status/src/data.ts b/apps/status/src/data.ts index 4605a53..4388dcb 100644 --- a/apps/status/src/data.ts +++ b/apps/status/src/data.ts @@ -635,10 +635,10 @@ function redactGroupsAndMonitors( name: g.name, position: g.position, })); - const publicMonitors = monitors.map((m) => ({ - ...m, - group_id: m.group_id ? (idMap.get(m.group_id) ?? null) : null, - })); + const publicMonitors = monitors.map((m) => { + const { uptime, ...rest } = m; + return { ...rest, group_id: m.group_id ? (idMap.get(m.group_id) ?? null) : null }; + }); return { groups: publicGroups, monitors: publicMonitors }; } diff --git a/apps/status/src/static/app.css b/apps/status/src/static/app.css index 3a46431..49c8b18 100644 --- a/apps/status/src/static/app.css +++ b/apps/status/src/static/app.css @@ -165,6 +165,7 @@ h1 { font-size: 1.75rem; font-weight: 700; margin: 0 0 0.5rem; } .past-update-body p { display: inline; margin: 0; } .past-update-body code { background: var(--bg); padding: 0.05em 0.3em; border-radius: 3px; font-size: 0.85em; } .past-update-time { color: var(--muted); font-size: 0.7rem; margin-top: 0.15rem; } +.page-uptime { margin-top: 2rem; } footer { padding-top: 2rem; border-top: 1px solid var(--border); color: var(--muted); font-size: 0.8rem; text-align: center; } a { color: var(--accent); text-decoration: none; } a:hover { text-decoration: underline; } diff --git a/apps/status/src/views/page.ejs b/apps/status/src/views/page.ejs index 429db84..c167f83 100644 --- a/apps/status/src/views/page.ejs +++ b/apps/status/src/views/page.ejs @@ -94,6 +94,20 @@ const dotGlow = overall === 'up' ? 'rgba(16,185,129,0.4)' : overall === 'degraded' ? 'rgba(245,158,11,0.4)' : 'rgba(239,68,68,0.4)'; + + // Page-wide aggregate uptime - average across active monitors + const pageUptimeAcc = { d24: { sum: 0, n: 0 }, d7: { sum: 0, n: 0 }, d30: { sum: 0, n: 0 }, d90: { sum: 0, n: 0 } }; + for (const m of monitors) { + if (m.current_state === 'paused') continue; + const u = m.uptime || {}; + for (const key of ['d24', 'd7', 'd30', 'd90']) { + if (u[key] != null) { pageUptimeAcc[key].sum += u[key]; pageUptimeAcc[key].n++; } + } + } + function pageUptimePct(key) { + const a = pageUptimeAcc[key]; + return a.n > 0 ? (a.sum / a.n) : null; + } %> @@ -239,7 +253,6 @@ <% list.forEach(function(m) { const buckets = m.buckets || []; const hasData = buckets.some(b => b.total > 0); - const u = m.uptime || { d24: null, d7: null, d30: null, d90: null }; const startsOpen = m.display_mode !== 'compact'; %> <% if (inGroup) { %> @@ -292,12 +305,6 @@ <%= windowLabel %> <%= hasData ? 'uptime over window' : 'awaiting data' %> -
-
24h
<%= fmtUptime(u.d24) %>
-
7d
<%= fmtUptime(u.d7) %>
-
30d
<%= fmtUptime(u.d30) %>
-
90d
<%= fmtUptime(u.d90) %>
-
<% } %> @@ -354,6 +361,15 @@ <% } %> +
+
+
24h
<%= fmtUptime(pageUptimePct('d24')) %>
+
7d
<%= fmtUptime(pageUptimePct('d7')) %>
+
30d
<%= fmtUptime(pageUptimePct('d30')) %>
+
90d
<%= fmtUptime(pageUptimePct('d90')) %>
+
+
+