From 14a864d5481718bbf3e56165802b1006c771db53 Mon Sep 17 00:00:00 2001
From: Marien Fressinaud
Date: Thu, 11 Dec 2025 10:53:47 +0100
Subject: [PATCH] fix: Fix alarms for domain heartbeat failures
---
src/controllers/Domains.php | 6 ------
src/jobs/CheckAlarms.php | 2 +-
src/models/Domain.php | 20 +++++++++++++++++++-
src/models/Heartbeat.php | 21 +++++++++++++++++++++
src/views/domains/show.phtml | 6 ++++--
5 files changed, 45 insertions(+), 10 deletions(-)
diff --git a/src/controllers/Domains.php b/src/controllers/Domains.php
index 367eb78..34d99da 100644
--- a/src/controllers/Domains.php
+++ b/src/controllers/Domains.php
@@ -94,14 +94,8 @@ public function show(Request $request): Response
$domain = models\Domain::requireFromRequest($request);
- $alarms = models\Alarm::listByDomainIdOrderByDescCreatedAt($domain->id);
- $last_heartbeat = models\Heartbeat::findLastHeartbeatByDomainId($domain->id);
- $last_heartbeat_at = $last_heartbeat->created_at ?? null;
-
return Response::ok('domains/show.phtml', [
'domain' => $domain,
- 'last_heartbeat_at' => $last_heartbeat_at,
- 'alarms' => $alarms,
]);
}
diff --git a/src/jobs/CheckAlarms.php b/src/jobs/CheckAlarms.php
index 356c99d..75969d7 100644
--- a/src/jobs/CheckAlarms.php
+++ b/src/jobs/CheckAlarms.php
@@ -38,7 +38,7 @@ public function perform(): void
$results = [];
foreach ($domains as $domain) {
- $heartbeat = models\Heartbeat::findLastHeartbeatByDomainId($domain->id);
+ $heartbeat = $domain->lastHeartbeat();
if (!$heartbeat) {
continue;
}
diff --git a/src/models/Domain.php b/src/models/Domain.php
index f55b085..972ea03 100644
--- a/src/models/Domain.php
+++ b/src/models/Domain.php
@@ -40,7 +40,7 @@ public function setId(string $url): void
public function status(): string
{
- $last_heartbeat = Heartbeat::findLastHeartbeatByDomainId($this->id);
+ $last_heartbeat = $this->lastHeartbeat();
if ($last_heartbeat) {
if ($last_heartbeat->created_at <= \Minz\Time::ago(5, 'minutes')) {
return 'unknown';
@@ -54,6 +54,24 @@ public function status(): string
}
}
+ /**
+ * @return Alarm[]
+ */
+ public function alarms(): array
+ {
+ return Alarm::listByDomainIdOrderByDescCreatedAt($this->id);
+ }
+
+ public function lastHeartbeat(): ?Heartbeat
+ {
+ return Heartbeat::findLastHeartbeatByDomainId($this->id);
+ }
+
+ public function lastSuccessfulHeartbeat(): ?Heartbeat
+ {
+ return Heartbeat::findLastSuccessfulHeartbeatByDomainId($this->id);
+ }
+
/**
* @return self[]
*/
diff --git a/src/models/Heartbeat.php b/src/models/Heartbeat.php
index 9be7989..4dc24ce 100644
--- a/src/models/Heartbeat.php
+++ b/src/models/Heartbeat.php
@@ -51,6 +51,27 @@ public static function initError(string $domain_id, string $details): self
}
public static function findLastHeartbeatByDomainId(string $domain_id): ?self
+ {
+ $sql = <<<'SQL'
+ SELECT * FROM heartbeats
+ WHERE domain_id = ?
+ ORDER BY created_at DESC
+ LIMIT 1
+ SQL;
+
+ $database = Database::get();
+ $statement = $database->prepare($sql);
+ $statement->execute([$domain_id]);
+
+ $result = $statement->fetch();
+ if (is_array($result)) {
+ return self::fromDatabaseRow($result);
+ } else {
+ return null;
+ }
+ }
+
+ public static function findLastSuccessfulHeartbeatByDomainId(string $domain_id): ?self
{
$sql = <<<'SQL'
SELECT * FROM heartbeats
diff --git a/src/views/domains/show.phtml b/src/views/domains/show.phtml
index 3a0731b..8443a58 100644
--- a/src/views/domains/show.phtml
+++ b/src/views/domains/show.phtml
@@ -25,9 +25,10 @@
-
+lastSuccessfulHeartbeat(); ?>
+
- = _f('Last ping on %s', _d($last_heartbeat_at, 'EEE d MMM YYYY, HH:mm:ss')) ?>
+ = _f('Last ping on %s', _d($last_successful_heartbeat->created_at, 'EEE d MMM YYYY, HH:mm:ss')) ?>
@@ -37,6 +38,7 @@
+alarms(); ?>
= _('Alarms') ?>