Show 90-day uptime bars on the status page
Every check is also counted in a per-day table that outlives the raw checks, so the public page can draw one bar per UTC day with a tooltip, as most hosted status pages do. Existing databases are backfilled once from the checks they still have. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
73f45fb3ae
commit
4ea4fe5289
7 files changed
+221
-14
No files matched your search
+17
-6
@@ -802,10 +802,11 @@ func (s *Server) heartbeat(w http.ResponseWriter, r *http.Request) {
|
||||
// statusJSON feeds the public status page: only monitors and incidents marked public.
|
||||
func (s *Server) statusJSON(w http.ResponseWriter, r *http.Request) {
|
||||
type mon struct {
|
||||
Name string `json:"name"`
|
||||
Status string `json:"status"`
|
||||
Uptime float64 `json:"uptime"`
|
||||
Since int64 `json:"since"`
|
||||
Name string `json:"name"`
|
||||
Status string `json:"status"`
|
||||
Uptime float64 `json:"uptime"`
|
||||
Since int64 `json:"since"`
|
||||
Days [][2]int `json:"days"` // [checks, failed] per UTC day, oldest first, ending today
|
||||
}
|
||||
type inc struct {
|
||||
Title string `json:"title"`
|
||||
@@ -819,14 +820,24 @@ func (s *Server) statusJSON(w http.ResponseWriter, r *http.Request) {
|
||||
Monitors []mon `json:"monitors"`
|
||||
Incidents []inc `json:"incidents"`
|
||||
Overall string `json:"overall"`
|
||||
}{[]mon{}, []inc{}, "operational"}
|
||||
Today string `json:"today"` // the UTC date of the last bar
|
||||
}{[]mon{}, []inc{}, "operational", s.now().UTC().Format("2006-01-02")}
|
||||
mons, _ := listOf[Monitor](s.st, "monitor")
|
||||
for _, m := range mons {
|
||||
if !m.Public || !m.Enabled {
|
||||
continue
|
||||
}
|
||||
st := s.monitorState(m.ID)
|
||||
out.Monitors = append(out.Monitors, mon{m.Name, st.Status, st.Uptime30, st.Since})
|
||||
days := s.dailyUptime(m.ID, uptimeDays, s.now())
|
||||
var checks, fails int
|
||||
for _, d := range days {
|
||||
checks, fails = checks+d[0], fails+d[1]
|
||||
}
|
||||
uptime := -1.0 // no checks yet
|
||||
if checks > 0 {
|
||||
uptime = float64(checks-fails) * 100 / float64(checks)
|
||||
}
|
||||
out.Monitors = append(out.Monitors, mon{m.Name, st.Status, uptime, st.Since, days})
|
||||
if st.Status == "down" {
|
||||
out.Overall = "outage"
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user