
Soixante conteneurs sur un seul serveur
Une machine bare-metal exécute des dizaines à des centaines de conteneurs Hoody. La dédupplication KSM et BTRFS rend le coût marginal quasi nul.
Vingt agents poussent leurs métriques vers une seule URL pipe avec curl -T. Votre tableau de bord lit la même URL avec ?progress et rend le flux SSE directement dans la page. Pas d'InfluxDB, pas de Prometheus, pas d'intervalle de scrape. Juste un câble.
pas de Prometheus, pas d'InfluxDB, pas de service de métriques — juste du SSE sur un pipe
Chaque agent envoie sa ligne avec curl dans le même chemin de pipe. Le navigateur du tableau de bord ouvre un EventSource sur ce chemin avec ?progress. Le serveur Hoody Pipe ne retient rien — les octets qui arrivent d'un côté repartent de l'autre.
#!/bin/sh
# Agent monitor loop — one line per second.
while true; do
cpu=$(top -bn1 | awk '/Cpu/ [print $2]')
mem=$(free | awk '/Mem:/ [printf "%.0f", $3/$2*100]')
line="cpu=$cpu mem=$mem qps=$(cat /tmp/qps) ts=$(date +%s)"
echo "$line" | curl -T - https://pipe.hoody.com/api/v1/pipe/metrics-$AGENT_ID
sleep 1
done// One <script> in one HTML file. No backend.
const tiles = document.querySelectorAll('[data-agent]');
tiles.forEach((tile) => [
const id = tile.dataset.agent;
// ?progress turns the pipe path into an SSE stream.
const sse = new EventSource(
`https://pipe.hoody.com/api/v1/pipe/metrics-$[id]?progress`,
);
sse.addEventListener('metric', (e) => [
const [ cpu, mem, qps ] = JSON.parse(e.data);
tile.querySelector('.cpu').textContent = `$[cpu]%`;
tile.querySelector('.mem').textContent = `$[mem]%`;
tile.querySelector('.qps').textContent = qps;
]);
]);Les agents font curl. Le navigateur ouvre des EventSource. Le pipe transfère. Il n'y a rien entre les deux à mettre à l'échelle, redémarrer ou payer. Fermez le tableau de bord et les flux s'arrêtent. Rouvrez-le et vous voyez des données en direct dans la seconde.
Ce que vous abandonnez en supprimant le backend, vous le récupérez sous une forme plus simple.
Il n'y a pas d'intervalle de scrape à attendre. La dernière écriture de l'agent est l'image actuelle du tableau de bord. Le pipe transfère directement — aucun flush intermédiaire.
Pas de politique de rétention parce qu'il n'y a pas de stockage. Pas de disque à remplir, pas de fenêtre de compaction, pas d'index de séries temporelles à corrompre. La métrique existe tant qu'un lecteur regarde.
Le tableau de bord est un fichier HTML que vous pouvez héberger n'importe où — ou ouvrir depuis le disque. Pas d'agent à installer, pas de daemon à faire tourner, pas de siège DataDog à provisionner. L'URL du pipe est toute la stack.
La stack standard agent-vers-tableau-de-bord a quatre pièces mobiles. Le modèle pipe en a zéro. Même câble, un demi-écran de curl.
Quand vous sautez la base de données, les choses que vous gériez cessent d'exister. Il n'y a pas de politique de rétention sur un câble.
Un chemin de pipe est une infrastructure petite mais réelle. Les chiffres viennent des garanties de l'API Hoody Pipe, pas de benchmarks inventés.
Jusqu'à 256 tableaux de bord ou tails curl peuvent s'abonner au même chemin avec ?n. Le lecteur le plus lent applique de la backpressure mais ne bloque jamais les autres.
Jusqu'à 50 viewers SSE ?progress par chemin. Ils ne consomment pas de slot de destinataire — vos onglets de tableau de bord et votre terminal peuvent regarder en parallèle.
Le serveur n'écrit pas sur disque. Les octets qui arrivent côté expéditeur repartent côté lecteur. Il n'y a aucune fenêtre de flush entre les deux.
Limites selon l'API Hoody Pipe : nombre de destinataires 1–256, spectateurs progress plafonnés à 50 par chemin, TTL de connexion progress de 30 minutes, linger post-transfert de 30 secondes.
Le tableau de bord n'a pas interrogé de base de données. Les octets sont juste arrivés.
Les outils standards qu'on attrape quand on veut un tableau de bord de métriques. Chacun vous facture une base de données et un daemon. Le pipe ne vous facture ni l'un ni l'autre.
Arrêtez de scraper. Arrêtez de stocker. Regardez le câble — et quand vous arrêtez de regarder, le câble est vide.