-- Migration 014: Supervisor-Befunde -- -- Additive Migration. Der Migrator toleriert 1050/1060/1061/1062/1091. -- -- Ein Befund ist keine Fehlermeldung. Er behauptet nicht, dass etwas kaputt -- ist, sondern dass etwas ungewoehnlich ist. Die Einstufung trifft die -- empfangende Seite, die den Flottenblick hat - deshalb heisst das Feld -- severity_hint und nicht severity. -- -- Siehe docs/SUPERVISOR_MCP_DESIGN.md, Abschnitte 1 und 2. CREATE TABLE IF NOT EXISTS supervisor_findings ( id BIGINT AUTO_INCREMENT PRIMARY KEY, project_slug VARCHAR(64) NOT NULL, -- Welche Installation? Bei serverseitigen Detektoren die Quelle des -- Monitors, bei clientseitigen die vom Beobachter gemeldete Kennung. instance VARCHAR(100) NOT NULL DEFAULT 'default', -- Name aus dem Katalog, Form "familie.sache". Wandert nie mehr; kommt etwas -- dazu, bekommt es einen neuen Namen. Nur so bleiben Befunde aus -- verschiedenen Projekten vergleichbar. detector VARCHAR(64) NOT NULL, -- Worauf bezieht sich der Befund - eine Metrik, ein Jobname, eine -- Fehlersignatur, eine Zusicherung. subject VARCHAR(190) NOT NULL, -- Kam der Befund von einer Installation oder aus einem Detektorlauf hier? -- Serverseitige Detektoren arbeiten auf Daten, die ohnehin hereinkommen, -- und brauchen keinen neuen Client. origin ENUM('client','server') NOT NULL DEFAULT 'client', severity_hint ENUM('idea','wishlist','low','medium','high','critical') NULL, -- Was wurde gemessen, und wogegen? Bewusst als JSON: jeder Detektor bringt -- andere Groessen mit, und eine Spalte je Detektor waere nach dem dritten -- unhaltbar. observed_json JSON NULL, baseline_json JSON NULL, build VARCHAR(64) NULL, commit_sha VARCHAR(64) NULL, environment ENUM('production','development','staging','testing') NOT NULL DEFAULT 'production', -- open - frisch, ungesichtet -- acknowledged- angesehen, kein Handlungsbedarf im Moment -- promoted - daraus wurde ein Bugtracker-Item (siehe bug_item_id) -- resolved - Ursache behoben -- ignored - dauerhaft uninteressant, zaehlt aber weiter hoch status ENUM('open','acknowledged','promoted','resolved','ignored') NOT NULL DEFAULT 'open', bug_item_id BIGINT NULL, occurrence_count INT NOT NULL DEFAULT 1, -- Aus Detektor, Gegenstand und Fassung gebaut, nicht zufaellig: derselbe -- Befund darf beliebig oft gemeldet werden, ohne ein Duplikat anzulegen. -- Ein Beobachter, der minuetlich nachsieht, wuerde sonst 1.440 Eintraege am -- Tag erzeugen. client_ref VARCHAR(190) NOT NULL, first_seen_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, last_seen_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, acknowledged_at DATETIME NULL, acknowledged_by VARCHAR(100) NULL, UNIQUE KEY ux_finding (project_slug, client_ref), KEY ix_find_detector (detector, status), KEY ix_find_project (project_slug, status, last_seen_at), KEY ix_find_instance (instance, last_seen_at), KEY ix_find_cleanup (last_seen_at) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; -- --------------------------------------------------------------------------- -- Zu welchem Projekt gehoert ein Monitor? -- --------------------------------------------------------------------------- -- Der Watchdog kannte bisher nur Quelle und Instanz. Fuer den Flottenvergleich -- reicht das nicht: verglichen werden darf nur, was vergleichbar ist, und -- "Fassung 1.0" zweier verschiedener Produkte hat nichts miteinander zu tun. -- Die Kohorte ist deshalb (Projekt, app_version). -- -- Bewusst NICHT vom Agenten gesetzt, sondern administrativ. Sonst braeuchte -- diese Etappe einen Rollout neuer Agentenskripte auf jede Maschine - und der -- ganze Punkt der serverseitigen Detektoren ist, dass sie auf Daten arbeiten, -- die ohnehin schon hereinkommen. -- -- Bleibt das Feld leer, laufen die monitorbezogenen Detektoren trotzdem; ihre -- Befunde landen dann unter dem Projekt aus supervisor.default_project. -- Flotten- und Regressionsvergleich setzen dagegen eine Zuordnung voraus und -- ueberspringen nicht zugeordnete Monitore. ALTER TABLE watchdog_monitors ADD COLUMN project_slug VARCHAR(64) NULL AFTER group_key; ALTER TABLE watchdog_monitors ADD KEY ix_wd_project (project_slug, app_version); -- Taktgeber fuer die serverseitigen Detektoren. Sie haengen im minuetlichen -- Cron, sollen aber nicht minuetlich laufen - ein Flottenvergleich alle zehn -- Minuten sagt dasselbe wie einer jede Minute und kostet ein Zehntel. INSERT INTO watchdog_cron_jobs (name, interval_sec, enabled) VALUES ('supervisor_detectors', 600, 1) ON DUPLICATE KEY UPDATE interval_sec = VALUES(interval_sec);