Erreichbarkeits-Balken auf der Server-Seite
Ein Strich pro Stunde ueber 7 Tage, gruen/gelb/rot je nachdem, ob in der Stunde alle, ein Teil oder keine Messung erreichbar war. Die Daten lagen laengst da: player_history haelt 7 Tage vor, die API schnitt aber auf 24 Stunden ab. Statt Rohdaten (ueber eine Woche rund 5000 Zeilen pro Server) fasst uptimeBuckets() in SQL stundenweise zusammen — hoechstens 168 Zeilen. - Stunden ohne Messung werden als Luecke gezeichnet, nicht als "online". Sonst saehe eine Bot-Auszeit aus wie ein einwandfrei laufender Server. - Die alte 24h-Uptime-Zahl neben dem Peak ist raus: zweimal dieselbe Groesse ueber verschiedene Zeitraeume verwirrt nur. - Tooltip zeigt Ortszeit. Die Eimer werden in UTC abgeglichen (SQLite rechnet so), angezeigt wird lokal — sonst stuende dort eine Stunde, die niemand wiedererkennt. Zwei Fehler beim Bauen gefunden und behoben: - .srv-card ist ein Grid-Item mit min-width:auto und wuchs durch die 168 Striche auf 724 statt 335 px, die Karte sprengte auf dem Handy das Raster. - "Uhr" stand hart deutsch im Tooltip. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -695,9 +695,21 @@ const playerHistoryStmt = db.prepare(`
|
||||
WHERE server_id = ? AND ts >= datetime('now', ?) ORDER BY ts
|
||||
`);
|
||||
const prunePlayerHistoryStmt = db.prepare(`DELETE FROM player_history WHERE ts < datetime('now', '-7 days')`);
|
||||
// Erreichbarkeit stundenweise zusammengefasst — für den Uptime-Balken.
|
||||
// Die Rohdaten (alle 2 min) wären über eine Woche rund 5000 Zeilen pro Server;
|
||||
// als Stundeneimer sind es höchstens 168 und die Seite bleibt schlank.
|
||||
const uptimeBucketsStmt = db.prepare(`
|
||||
SELECT strftime('%Y-%m-%dT%H', ts) AS stunde,
|
||||
COUNT(*) AS proben,
|
||||
SUM(online) AS an
|
||||
FROM player_history
|
||||
WHERE server_id = ? AND ts >= datetime('now', ?)
|
||||
GROUP BY stunde ORDER BY stunde
|
||||
`);
|
||||
export const recordPlayerSample = (serverId, online, players) =>
|
||||
insertPlayerSample.run(serverId, online ? 1 : 0, players);
|
||||
export const playerHistory = (serverId, hours = 24) => playerHistoryStmt.all(serverId, `-${hours} hours`);
|
||||
export const uptimeBuckets = (serverId, hours = 168) => uptimeBucketsStmt.all(serverId, `-${hours} hours`);
|
||||
export const prunePlayerHistory = () => prunePlayerHistoryStmt.run();
|
||||
|
||||
// Moderation: Verwarnungen + Sticky-Roles
|
||||
|
||||
+4
-1
@@ -15,7 +15,7 @@ import {
|
||||
saveWebAdmin, webAdminScopes, listWebAdmins, deleteWebAdmin,
|
||||
saveTemplate, listTemplates, deleteTemplate,
|
||||
getLevelRow, isPlaytester, saveWish, toggleWishVote, myWishVotes,
|
||||
logAudit, listAudit, playerHistory, deleteUserData,
|
||||
logAudit, listAudit, playerHistory, uptimeBuckets, deleteUserData,
|
||||
saveSsoApp, listSsoApps, deleteSsoApp, getSsoApp,
|
||||
createService, updateService, listServices, deleteService,
|
||||
savePage, getPage, listPages, listPublishedPages, deletePage,
|
||||
@@ -182,6 +182,9 @@ export function registerApiRoutes(app, client) {
|
||||
ping: r?.ping ?? null,
|
||||
checkedAt: r?.checkedAt ?? null,
|
||||
history: playerHistory(s.id, 24),
|
||||
// Erreichbarkeit der letzten 7 Tage, stundenweise. Länger geht
|
||||
// nicht: prunePlayerHistory räumt alles Ältere weg.
|
||||
uptime: uptimeBuckets(s.id, 168),
|
||||
};
|
||||
}),
|
||||
}));
|
||||
|
||||
Reference in New Issue
Block a user