Le blog

Ember : Le monitoring temps réel pour Caddy et FrankenPHP est disponible

Publié le 30 mars 2026

Nous sommes ravis de vous annoncer la sortie de Ember dans sa première version, un outil d'observabilité taillé pour FrankenPHP et Caddy. En tant que mainteneurs de ces différents projets open-source, nous souhaitons proposer à tous la meilleure expérience de monitoring et la plus intégrée possible à travers ce nouveau compagnon. FrankenPHP et Ember avancent main dans la main pour une toute nouvelle synergie dans l'écosystème. Nous connaissons tous ce moment où vous voulez juste savoir ce qui se passe sur notre serveur Caddy, et on se retrouve à scroller dans un mur de texte Prometheus ou à configurer un énième dashboard Grafana.

C'est exactement pour cette raison que Ember a été créé : un dashboard temps réel dans votre terminal, zero-config, qui se lance en une commande. Un htop pour votre serveur Caddy, si vous voulez. Et si vous utilisez FrankenPHP, Ember va encore plus loin. Aujourd'hui, la v1.0.0 est disponible.

Looking for the English version of this article? It's right here! 🇬🇧

Ember : Le monitoring temps réel pour Caddy et FrankenPHP" class="wp-image-12449"/><figcaption class="wp-element-caption#

L'observabilité, c'est obligatoire et (c'était) compliqué

Caddy expose des métriques riches via son API d'administration et son endpoint Prometheus. C'est une excellente base. Mais dans la pratique, deux options s'offrent à vous : lire du texte Prometheus brut (bonne chance pour repérer un problème dans un mur de caddy_http_request_duration_seconds_bucket{le="0.025"} 1847), ou monter un stack Grafana + Prometheus complet, avec sa configuration, ses dashboards à importer, et son infrastructure à maintenir.

Pour jeter un œil rapide au trafic en développement ou pour les projets qui se veulent simple et/ou léger, c'est disproportionné.

Et côté FrankenPHP, le constat était encore plus frappant : il n'existait tout simplement aucun outil pour observer en temps réel ce que faisaient les threads PHP. Combien sont occupés ? Lequel traite quelle requête ? Depuis combien de temps ? Quelle consommation mémoire ? Ces questions restaient sans réponse simple.

C'est un véritable challenge, surtout quand la performance est au coeur de votre vision. Comment connaitre de manière rapide les meilleurs paramètres d'autoscaling de FrankenPHP pour votre infrastructure ?

L'idée derrière Ember : rendre l'observabilité accessible, visuelle, et même agréable. Que ça donne envie de lancer l'outil pour comprendre ce qui se passe immédiatement, avec des mesures dérivées prêtes à lire plutôt que des compteurs bruts.

#

Zero-config : ember init et c'est parti

Pas de fichier de configuration à écrire, pas de YAML, pas d'infrastructure supplémentaire. Deux commandes suffisent :

$ ember init

Ce wizard vérifie votre configuration Caddy, détecte si les métriques sont activées, et les active automatiquement via l'API d'administration si besoin, le tout sans redémarrer Caddy.

Capture d'écran de la configuration" class="wp-image-12388" style="aspect-ratio:1.7152861952861953;width:552px;height:auto

Il détecte également la présence de FrankenPHP et vous prévient si quelque chose manque.

Ensuite :

$ ember

C'est tout. Ember se connecte à l'API d'administration de Caddy, auto-détecte FrankenPHP si présent, et affiche un dashboard interactif dans votre terminal.

" class="wp-image-12397" style="width:552px

Et si votre serveur est distant, Ember propose le flag --addr pour vous permettre de donner l'URL du serveur.

#

Un dashboard qui donne envie

Que vous utilisiez Caddy seul ou avec FrankenPHP, le dashboard principal affiche un tableau de trafic par host avec des métriques dérivées calculées en temps réel :

  • RPS (requêtes par seconde) avec des sparklines montrant la tendance sur les 8 derniers échantillons
  • Latence moyenne et percentiles (P50, P90, P95, P99) calculés à partir des buckets d'histogramme Prometheus
  • Time-to-First-Byte (TTFB) par host
  • Status codes ventilés : 2xx, 3xx, 4xx, 5xx par seconde, avec un code couleur immédiatement lisible
  • Requêtes en cours (in-flight) par host

Il est possible de trier sur n'importe quelle colonne, de filtrer par nom de host, et de basculer en graphes ASCII plein écran pour visualiser l'évolution du CPU, des RPS et de la mémoire RSS sur les 300 derniers échantillons. Ember détecte aussi automatiquement les redémarrages de Caddy et réinitialise ses compteurs en conséquence.

" class="wp-image-12394" style="width:552px

Ce ne sont pas des métriques brutes : ce sont des mesures dérivées, calculées par Ember, prêtes à être lues et comprises instantanément.

#

Aller plus loin avec FrankenPHP

Si vous utilisez FrankenPHP, Ember débloque une fonctionnalité phare, difficilement réalisable jusqu'à aujourd'hui. Quand FrankenPHP est détecté, un second onglet apparaît automatiquement et offre une visibilité totale sur chaque thread PHP :

  • État de chaque thread : occupé, inactif, en attente
  • Méthode HTTP et URI de la requête en cours de traitement
  • Durée de la requête en cours, avec un code couleur qui passe au jaune puis au rouge
  • Mémoire utilisée par le thread, avec des indicateurs de variation (hausse/baisse pour les changements de plus de 100 Ko)
  • Nombre total de requêtes traitées par chaque thread

Les threads sont groupés intelligemment : threads workers d'abord (regroupés par script), puis les threads classiques. Pour les workers, Ember affiche en plus la profondeur de la file d'attente, le nombre de crashs et de redémarrages. Vous pouvez même redémarrer les workers directement depuis le dashboard avec la touche r.

" class="wp-image-12395" style="width:552px


Pour rendre tout cela possible, nous avons contribué une PR upstream dans FrankenPHP (à partir de la prochaine version 1.13) pour exposer les informations par thread nécessaires. Nous profitons également de cette occasion pour ajouter une page dédiée à l'observabilité dans la documentation de FrankenPHP, où Ember sera recommandé comme outil de monitoring.

#

Du terminal à la production

Ember n'est pas qu'un dashboard interactif : l'outil est aussi adapté à une utilisation dans un environnement cloud. Un seul binaire, plusieurs modes d'utilisation :

  • TUI interactif (mode par défaut) : idéal en développement, avec navigation clavier, tri, filtrage, graphes.
  • JSON streaming (--json) : chaque cycle de poll produit une ligne JSON sur stdout. Parfait pour alimenter des pipelines, des scripts, ou du logging structuré. Combinez avec --once pour un snapshot ponctuel.
  • Mode daemon (--daemon --expose :9191) : Ember tourne en arrière-plan et expose un endpoint /metrics compatible Prometheus, ainsi qu'un endpoint /healthz pour les probes de readiness Kubernetes. Une limitation d'erreurs est intégrée pour éviter de noyer les logs.
  • Health check (ember status) : une ligne, un résultat. Caddy OK | 5 hosts | 450 rps | P99 12ms | CPU 3.2% | RSS 48MB | up 3d 2h. Disponible aussi en JSON.
  • Readiness gate (ember wait) : bloque jusqu'à ce que Caddy réponde. Idéal dans un script de déploiement : ember wait && ./deploy.sh.
  • Validation de déploiement (ember diff before.json after.json) : compare deux snapshots et détecte les régressions de performance. Code de sortie 1 si une dégradation supérieure à 10% est détectée.
" class="wp-image-12400" style="width:552px#

Prêt pour la production

Côté performances, Ember reste très léger : ~15 Mo de RSS et ~0.3 ms par cycle de poll, même avec 100 threads FrankenPHP et 10 hosts Caddy. L'outil de monitoring ne ralentira pas ce qu'il est censé monitorer. Ajoutez à cela :

  • TLS et mTLS : certificat CA custom, certificats client, ou skip de vérification
  • Basic auth sur l'endpoint de métriques Prometheus
  • SIGHUP pour recharger les certificats TLS à chaud, sans redémarrage
  • SIGUSR1 pour dumper l'état complet en JSON sur stderr (debug en production)
  • Image Docker multi-architecture (amd64/arm64), publiée sur ghcr.io
  • Variables d'environnement (EMBER_ADDR, EMBER_INTERVAL, EMBER_EXPOSE, EMBER_METRICS_PREFIX, EMBER_METRICS_AUTH) pour la configuration en conteneur
  • Support de NO_COLOR pour l'accessibilité
#

Installez Ember dès aujourd'hui

Avec Homebrew :

$ brew install alexandre-daubois/tap/ember

Avec Go :

$ go install github.com/alexandre-daubois/ember/cmd/ember@latest

Avec Docker (mode démon par défaut) :

$ docker run --rm --network host ghcr.io/alexandre-daubois/ember

Les binaires sont disponibles pour Linux, macOS et Windows, en amd64 et arm64.

#

Contribuez et apportez vos idées !

Que serait un outil pareil s'il n'était pas open-source, comme le sont nos autres contributions à l'écosystème PHP ? Ember est open source sous licence MIT. C'est la v1.0.0 et ce n'est que le début.

Si vous utilisez Caddy ou FrankenPHP, nous vous invitons à tester Ember, à ouvrir des issues si vous rencontrez des problèmes, et à proposer des pull-requests si l'envie vous prend. Chaque retour compte pour faire d'Ember l'outil de référence pour le monitoring de l'écosystème Caddy.

Le code source et la documentation complète sont disponibles sur GitHub : alexandre-daubois/ember. L'outil vous plaît ? N'oubliez pas d'ajouter une star sur GitHub. Nous attendons vos retours avec impatience !

Alexandre Daubois

Alexandre Daubois

Principal Developer

Mots-clésEmber, FrankenPHP, go, PHP

Le blog

Pour aller plus loin