diff --git a/pb_hooks/status.pb.js b/pb_hooks/status.pb.js
index c2eb7a6..420b879 100644
--- a/pb_hooks/status.pb.js
+++ b/pb_hooks/status.pb.js
@@ -191,7 +191,11 @@ routerAdd("GET", "/api/status", (e) => {
const stats = fetchJson(base.replace(/\/+$/, "") + "/v1/admin/stats",
{ "x-amber-admin": secret }, 8)
return { configured: true, probe: stats.probe, queue: stats.queue,
- metadata: stats.metadata, health: stats.health }
+ metadata: stats.metadata, health: stats.health,
+ // Upstream liveness rides along on the same call rather than a
+ // second round trip: it is produced by the same service and read
+ // by the same screen.
+ upstreams: stats.upstreams }
})
return e.json(200, {
diff --git a/pb_public/status.html b/pb_public/status.html
index a370c4c..bd0deb6 100644
--- a/pb_public/status.html
+++ b/pb_public/status.html
@@ -366,6 +366,57 @@ function panelApi(a){
"";
}
+// Which of the services we depend on are alive, and how much of the time they
+// have been.
+//
+// This section exists because AniList was down for days and nothing said so:
+// the app fell back, the fallback was quietly wrong, and the first anyone knew
+// was a family member reporting a rail of stale episodes. What makes it useful
+// rather than decorative is the two columns beside the light — what breaks when
+// this one is out, and since when — because "anilist: down" only says to go and
+// look, while "anilist: down since pátek, anime katalog" is the whole answer.
+function panelUpstreams(a){
+ var u = a && a.upstreams;
+ if (!u || !u.length) return ' zatím žádné měřeníCizí služby
' +
+ '
| služba | na čem záleží | beze změny od | " + + '24 h | 7 dní | odezva |
|---|
Měří se každých pět minut. Sloupce 24 h a 7 dní jsou podíl měření, ' + + "kdy služba odpovídala.