veilletech.fr
15 sept. Feed du jour
#06 POSTGRES Article

Vacuum surveille Postgres depuis Laravel

Un index manquant ne coûte rien le jour où on l'oublie.

Vacuum est un paquet Laravel de Rati Rukhadze qui lit les vues de statistiques que PostgreSQL tient déjà (pg_stat_user_tables, pg_stat_activity, pg_stat_statements) et affiche les problèmes détectés avec la requête SQL qui les corrige. Treize règles couvrent le wraparound, le bloat, les tuples morts, les index inutilisés et les requêtes lentes, avec une note sur 100. Deux commandes s'intègrent en CI : vacuum:check fait échouer un build sur constat critique, vacuum:lint signale les clés étrangères non indexées dans les migrations.

2 min de lectureintermédiairevidéo 1:17
Partager
Sommaire4 sections
  1. Ce qui se passe
  2. La partie qui rentabilise : la CI
  3. Installer
  4. À retenir

Ce qui se passe

PostgreSQL tient déjà la comptabilité de sa propre santé, dans des vues comme pg_stat_user_tables, pg_stat_activity et pg_stat_statements. Le problème n'a jamais été la donnée : c'est que personne ne va la lire avant l'incident.

Vacuum, paquet Laravel de Rati Rukhadze, lit ces vues et liste les problèmes trouvés avec la requête SQL qui les corrige. Treize règles de conseil couvrent le wraparound des identifiants de transaction, le bloat, les tuples morts, les index jamais utilisés et les requêtes lentes. Chaque constat porte une sévérité, et l'ensemble donne une note sur 100. Un tableau de bord s'ouvre sur /vacuum, en Blade ou en plugin Filament 4 ou 5.

La partie qui rentabilise : la CI

Le tableau de bord est l'accessoire ; les deux commandes sont l'essentiel.

Terminal
php artisan vacuum:check                      # les mêmes règles, au terminal
php artisan vacuum:check --fail-on=warning    # critical, warning, info ou never
php artisan vacuum:check --format=json        # score, note, déductions, constats
php artisan vacuum:lint                       # schéma : clés étrangères non indexées

vacuum:lint attrape dans les migrations ce qui coûtera cher plus tard — une clé étrangère sans index rend une suppression en cascade lente des mois après la mise en production. Sur une tâche planifiée contre la préproduction, vacuum:check fait échouer le build quand l'âge de gel d'une table franchit le seuil critique.

Les seuils se règlent dans config/vacuum.php, notamment dead_tuple_ratio (0.20) et slow_query_milliseconds (500).

Installer

Terminal
composer require heyosseus/vacuum
php artisan vacuum:install

Vacuum 1.2.0 demande PostgreSQL 14 et Laravel 11+. L'extension pg_stat_statements reste optionnelle : sans elle, le tableau de bord signale son absence. Celui-ci ne s'ouvre qu'en environnement local ; ailleurs, il faut déclarer un rappel :

PHP
use Heyosseus\Vacuum\Vacuum;

Vacuum::auth(fn (Request $request) => $request->user()?->isAdmin() === true);

À retenir

L'intérêt n'est pas de voir sa base notée sur 100, c'est de déplacer le moment où on apprend le problème : avant la fusion, dans la CI, plutôt que pendant l'incident. Le paquet expose aussi un endpoint /learn qui explique chaque classe de problème sur vos propres tables — utile pour transmettre le sujet dans une équipe où Postgres est administré par défaut plutôt que par choix.