Watchdog: Embeds statt Textzeilen, dazu eine Uebersicht im Panel
Die DM-Alarme waren als einzige Meldung noch reiner Text — direkt neben dem Raid-Alarm, der ein Embed ist. Jetzt beide im selben Look, mit Ausfalldauer bzw. Fehlergrund und Antwortzeit als Felder. Uebersicht im Panel (System, unter den Watchdog-URLs): je Adresse ein Erreichbarkeits-Balken ueber 7 Tage, gruen/rot/grau wie bei den Game-Servern, dazu Status, Antwortzeit und seit wann etwas weg ist. Dafuer schreibt der Waechter jetzt mit — vorher lebte sein Zustand nur im Speicher und war nach jedem Neustart weg. Neue Tabelle watchdog_history, gleiche Bauart und gleiche 7-Tage-Aufbewahrung wie player_history, stundenweise zusammengefasst statt roh ausgeliefert. Wichtig dabei: aufgezeichnet wird jeder Check, nicht nur die Wechsel. Sonst saehen ruhige Stunden im Balken aus wie Messluecken. Der Balken ist aus Server.jsx in components/UptimeTrack.jsx gewandert, damit oeffentliche Seite und Panel denselben benutzen. Er zeigt die Antwortzeit im Tooltip nur, wo sie erhoben wird — bei Game-Servern gibt es keine. Der Endpunkt /api/watchdog liegt hinter der Rechtepruefung, nicht oeffentlich: in der Adressliste koennen interne Dienste stehen. Zwei fehlende Importe in api.js gefunden und ergaenzt (moduleEnabled, tuning) — der erste Aufruf der Route waere sonst mit ReferenceError gestorben. Geprueft: alle 171 SQL-Abfragen gegen das Schema, die drei neuen inklusive. Im Browser mit drei Faellen — laeuft, ist weg, noch nie geprueft: Punktfarbe, Quote, Ausfallstunden und Messluecken stimmen, die ungepruefte Adresse zeigt korrekt gar keinen Balken. Oeffentliche Server-Seite nach dem Umbau gegengeprueft. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -712,6 +712,35 @@ export const playerHistory = (serverId, hours = 24) => playerHistoryStmt.all(ser
|
||||
export const uptimeBuckets = (serverId, hours = 168) => uptimeBucketsStmt.all(serverId, `-${hours} hours`);
|
||||
export const prunePlayerHistory = () => prunePlayerHistoryStmt.run();
|
||||
|
||||
// Watchdog: Erreichbarkeit der überwachten Adressen — gleiche Bauart wie oben,
|
||||
// damit die Übersicht denselben Balken benutzen kann. Adresse als Schlüssel:
|
||||
// die Liste steht als Einstellung und hat keine IDs.
|
||||
db.exec(`
|
||||
CREATE TABLE IF NOT EXISTS watchdog_history (
|
||||
url TEXT NOT NULL,
|
||||
ts TEXT NOT NULL DEFAULT (datetime('now')),
|
||||
ok INTEGER NOT NULL,
|
||||
ms INTEGER
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_wd_url_ts ON watchdog_history (url, ts);
|
||||
`);
|
||||
const insertWatchdogSample = db.prepare('INSERT INTO watchdog_history (url, ok, ms) VALUES (?, ?, ?)');
|
||||
const watchdogBucketsStmt = db.prepare(`
|
||||
SELECT strftime('%Y-%m-%dT%H', ts) AS stunde,
|
||||
COUNT(*) AS proben,
|
||||
SUM(ok) AS an,
|
||||
CAST(AVG(ms) AS INTEGER) AS schnitt
|
||||
FROM watchdog_history
|
||||
WHERE url = ? AND ts >= datetime('now', ?)
|
||||
GROUP BY stunde ORDER BY stunde
|
||||
`);
|
||||
// Adressen, die aus der Einstellung entfernt wurden, sollen nicht ewig bleiben
|
||||
const pruneWatchdogStmt = db.prepare(`DELETE FROM watchdog_history WHERE ts < datetime('now', '-7 days')`);
|
||||
export const recordWatchdogSample = (url, ok, ms) =>
|
||||
insertWatchdogSample.run(url, ok ? 1 : 0, Number.isFinite(ms) ? Math.round(ms) : null);
|
||||
export const watchdogBuckets = (url, hours = 168) => watchdogBucketsStmt.all(url, `-${hours} hours`);
|
||||
export const pruneWatchdogHistory = () => pruneWatchdogStmt.run();
|
||||
|
||||
// Moderation: Verwarnungen + Sticky-Roles
|
||||
db.exec(`
|
||||
CREATE TABLE IF NOT EXISTS warns (
|
||||
|
||||
Reference in New Issue
Block a user