Laravel - Health Check

Search for a command to run...

No comments yet. Be the first to comment.
Now that we have set up all the tools to create blocks on both Twill and Vue sides, let's create some generic blocks. Each block will be created in the Common namespace and will be manually added as an allowed block in the controller of our PageConte...

Now that we can create pages, it's time to leverage Twill's powerful content management features and construct reusable blocks. In this article, we will focus on creating a basic Title Twill Block (with a translatable Twill Text Input in a Common nam...

You are probably already familiar with the work of Spatie and its contributors in the Laravel and Open Source ecosystem. For many years, we have been using their Backup package (https://spatie.be/docs/laravel-backup) to back up our applications (data...

If a Twill module uses Revisions, you can benefit from an awesome Twill feature: preview your changes before publishing and compare old revisions. By default, it uses Blade views, so working with Inertia needs some adjustments. The principle For now,...

In this article, we will see the creation and customization of a Twill singleton module to provide a Homepage for our application. Singleton module creation In Twill terminology, a Singleton Module is globally like a classic module except that it man...

Ce n'est pas une surprise, il existe de nombreux packages Laravel permettant de contrôler la santé de votre application : accès à la base de données, écriture dans des dossiers de stockage, validité du certificat SSL, services Mail, Redis, ... et qui peuvent être étendus pour créer des contrôles spécifiques à votre application.
Mais pour des petits projets avec peu de fonctionnalités, ces packages nous semblent légèrement surdimensionnés (toujours un peu de scrupules à installer un package pour n'en utiliser qu'une infime partie).
Pour ceux-là, nous utilisons généralement un simple contrôleur Laravel qui va vérifier que l'accès à la base de données fonctionne et que l'écriture dans un dossier de stockage de l'application est possible.
/app/Http/Controllers/HealthcheckController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Storage;
class HealthcheckController extends Controller
{
private bool $displayError = false;
public function check(): \Illuminate\Http\Response
{
try {
$healthcheck =
$this->checkDatabase()
&& $this->checkStorage();
return $this->makeResponse($healthcheck);
} catch (\Exception $e) {
return $this->makeResponse(false, $e->getMessage());
}
}
private function makeResponse(bool $healthcheck = false, string $message = ''): \Illuminate\Http\Response
{
return response($message, ($healthcheck) ? 200 : 500);
}
private function checkDatabase(string $table = null): bool
{
if (null === $table) {
$table = 'migrations';
}
try {
DB::table($table)->take(1)->get();
} catch (\Exception $e) {
report($e);
if ($this->displayError) {
throw new \Exception($e);
} else {
return false;
}
}
return true;
}
private function checkStorage(string $disk = 'local'): bool
{
try {
$filename = 'healthcheck.txt';
$date = now()->toDatetimeString();
if (!Storage::disk($disk)->put($filename, $date)) {
return false;
}
if (!Storage::disk($disk)->delete($filename)) {
return false;
}
} catch (\Exception $e) {
report($e);
if ($this->displayError) {
throw new \Exception($e);
} else {
return false;
}
}
return true;
}
}
Les erreurs sont traitées par le logger par défaut de Laravel (par défaut, écriture dans le fichier
laravel...log) et aucune information d'erreur n'est renvoyée par le contrôleur, simplement un code HTTP 500 au lieu de 200. Si vous souhaitez que le contrôleur affiche les erreurs, passez le booléen$displayErroràtrue.
Pour rendre le contrôleur accessible (https://monsite.com/healthcheck), pensez à ajouter la route Web associée (l'appel à la fonction name est facultatif) :
/routes/web.php
use App\Http\Controllers\HealthcheckController;
Route::get('/healthcheck', [HealthcheckController::class, 'check'])->name('healthcheck');
Avoir une URL accessible sur son application c'est bien, mais à moins que vous n'ayez envie de passer votre temps devant votre navigateur à rafraîchir la page ou de développer un script d'appel de l'URL qui va ensuite vous notifier par le moyen de votre choix, il existe là aussi de nombreuses solutions qui peuvent s'en charger pour vous :
Actuellement, nous utilisons la solution UptimeRobot qui propose une offre gratuite (jusqu'à 50 contrôleurs, notification par e-mail uniquement) suffisante pour de la surveillance de premier niveau. Vous pourrez en plus créer des pages publiques de statut, personnalisables avec la sélection des contrôleurs de votre choix à afficher, la protection par mot de passe, que vous pourrez ensuite afficher sur un écran en mode tableau de bord, communiquer à vos équipes ou vos clients.
Exemple de page publique de statut UptimeRobot
