$hostnames Hostnamen der Website * @param array $domains Domains aus DomainWarn, je Hostname * @param list $incidents * @return array{state: string, monitored: list, missing: list, incidents: list>, counts: array{monitored: int, missing: int, incidents: int, critical: int}} */ public static function build(array $hostnames, array $domains, array $incidents): array { $monitored = []; $missing = []; foreach ($hostnames as $host) { $domain = $domains[$host] ?? null; if ($domain === null) { $missing[] = $host; continue; } $monitored[] = [ 'name' => $host, 'health' => (string) ($domain['health_status'] ?? 'unknown'), 'paused' => (bool) ($domain['is_paused'] ?? false), ]; } // nur Vorfälle der eigenen Domains, die schwersten zuerst $own = array_values(array_filter($incidents, static fn (array $incident) => $incident['domain'] !== null && in_array($incident['domain'], $hostnames, true))); usort($own, static fn (array $a, array $b) => [self::rank($b['severity']), $b['started_at'] ?? ''] <=> [self::rank($a['severity']), $a['started_at'] ?? '']); $critical = count(array_filter($own, static fn (array $incident) => $incident['severity'] === 'critical')); return [ 'state' => self::state($monitored, $own, $missing), 'monitored' => $monitored, 'missing' => $missing, 'incidents' => array_slice($own, 0, 20), 'counts' => ['monitored' => count($monitored), 'missing' => count($missing), 'incidents' => count($own), 'critical' => $critical], ]; } /** * Der Gesamtzustand fürs Auge: kritisch schlägt alles, eine nicht überwachte Domain ist eine Warnung (sie wäre * sonst unsichtbar), pausiert allein ist kein Alarm. * * @param list $monitored * @param list> $incidents * @param list $missing */ private static function state(array $monitored, array $incidents, array $missing): string { if ($monitored === [] && $missing === []) { return 'unknown'; } foreach ($incidents as $incident) { if (($incident['severity'] ?? '') === 'critical') { return 'critical'; } } foreach ($monitored as $domain) { if ($domain['health'] === 'critical' && ! $domain['paused']) { return 'critical'; } } if ($incidents !== [] || $missing !== []) { return 'warning'; } foreach ($monitored as $domain) { if ($domain['health'] === 'warning' && ! $domain['paused']) { return 'warning'; } } return $monitored === [] ? 'unknown' : 'ok'; } private static function rank(string $severity): int { return ['critical' => 3, 'warning' => 2, 'info' => 1][$severity] ?? 0; } }