Pular para o conteúdo
use-cases / a-live-metrics-dashboard-no-backend / hero
PIPE · SSE · NO BACKEND

Um dashboard ao vivo sem backend de métricas

Vinte agentes empurram suas métricas para uma URL de pipe com curl -T. Seu dashboard lê a mesma URL com ?progress e renderiza o stream SSE direto na página. Sem InfluxDB, sem Prometheus, sem intervalo de scrape. Só um fio.

use-cases / a-live-metrics-dashboard-no-backend / mechanism

Uma URL, dois lados

Cada agente faz curl da própria linha pro mesmo caminho de pipe. O navegador do dashboard abre um EventSource nesse caminho com ?progress. O servidor do Hoody Pipe não segura nada — bytes que chegam de um lado saem do outro.

agent · monitor.sh
PUT · sender
#!/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
o fio não segura nada
dashboard.html · no seu navegador
GET ?progress · reader
// 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;
  ]);
]);

Os agentes fazem curl. O navegador faz EventSource. O pipe encaminha. Não há nada no meio para escalar, reiniciar ou pagar. Feche o dashboard e os streams terminam. Abra de novo e você vê dados ao vivo dentro do segundo.

use-cases / a-live-metrics-dashboard-no-backend / powers

Três poderes de um dashboard que evapora

O que você abre mão deletando o backend, recebe de volta como algo mais simples.

LATÊNCIA

Sub-segundo por construção

Não há intervalo de scrape pra esperar. A última escrita do agente é o frame atual do dashboard. O pipe encaminha direto — sem flush intermediário.

OPERAÇÕES

Nada pra reter, nada pra falhar

Sem política de retenção porque não há armazenamento. Sem disco pra encher, sem janela de compactação, sem índice de séries temporais pra corromper. A métrica existe enquanto um leitor está olhando.

ECONOMIA

Um arquivo HTML estático embarca tudo

O dashboard é um arquivo HTML que você pode hospedar em qualquer lugar — ou abrir do disco. Não há agente pra instalar, daemon pra rodar, assento de DataDog pra provisionar. A URL do pipe é a stack inteira.

use-cases / a-live-metrics-dashboard-no-backend / evaporates

O que evapora

A stack padrão agente-pra-dashboard tem quatro peças móveis. O modelo do pipe tem zero. Mesmo fio, meia tela de curl.

ANTES · QUATRO PEÇAS PRA CUIDARa stack típica
  • statsd / telegraf
  • InfluxDB / TimescaleDB
  • Grafana / Datadog
  • arquivos de configuração de scrape
quatro configs · quatro upgrades · quatro contas
DEPOIS · UM FIOdois comandos curl
# Each agent: one line per metric.echo "cpu=64 mem=42" | curl -T - https://pipe.hoody.com/api/v1/pipe/metrics-$ID# Each viewer: one curl, or new EventSource() in HTML.curl -N https://pipe.hoody.com/api/v1/pipe/metrics-$ID?progress
sem armazenamento · sem scraper · sem daemon

Quando você pula o banco de dados, as coisas que você gerenciava deixam de existir. Não há política de retenção em um fio.

use-cases / a-live-metrics-dashboard-no-backend / capacity

O que o pipe te dá

Um caminho de pipe é infraestrutura pequena, mas real. Os números vêm das garantias da API do Hoody Pipe, não de benchmarks inventados.

  1. RECEIVERS POR CAMINHO256

    Até 256 dashboards ou tails de curl podem se inscrever no mesmo caminho com ?n. O leitor mais lento aplica backpressure mas nunca bloqueia os outros.

  2. ESPECTADORES DE PROGRESS50

    Até 50 viewers SSE de ?progress por caminho. Eles não consomem um slot de receiver — suas abas de dashboard e seu terminal podem assistir em paralelo.

  3. LATÊNCIA DE ARMAZENAMENTO0 ms

    O servidor não escreve em disco. Bytes que chegam pelo lado do remetente saem pelo lado do leitor. Não há janela de flush entre eles.

Limites pela API do Hoody Pipe: contagem de receivers 1–256, espectadores de progress limitados a 50 por caminho, TTL de conexão de progress de 30 minutos, linger de 30 segundos pós-transferência.

use-cases / a-live-metrics-dashboard-no-backend / punchline

O dashboard não consultou um banco de dados. Os bytes simplesmente chegaram.

assistido ao vivo · sextaevaporado · sábado
COMO A ARQUITETURA ANTIGA ERAagent → statsd → InfluxDB → Grafanaquatro peças móveis · quatro arquivos de config · quatro contas
COMO É AGORAecho $line | curl -T - pipe/metricsuma linha — e o dashboard é só um arquivo HTML
use-cases / a-live-metrics-dashboard-no-backend / replaces

O que isso substitui

As ferramentas padrão pra quando você quer um dashboard de métricas. Cada uma te cobra por um banco e um daemon. O pipe não te cobra nenhum dos dois.

  • AWS Lambda + CloudWatchCobrança por invocação pelo que é só curl
  • serviços de roteamento customUm microserviço inteiro pra encaminhar bytes que já tinham uma URL
  • stack Prometheus + GrafanaDois daemons, um loop de scrape e um dashboard pra você self-hostar
  • InfluxDB + TelegrafUm banco de séries temporais pra dados que você não guarda além da tela
  • coleta de métricas DataDogPreço por host por um número que você queria ver uma vez
  • pipelines de ingestão de métricas customKafka + consumer + sink pra um valor que o agente podia só empurrar
use-cases / a-live-metrics-dashboard-no-backend / cta

Pare de fazer scrape. Pare de armazenar. Olhe pro fio — e quando você parar de olhar, o fio fica vazio.

use-cases / a-live-metrics-dashboard-no-backend / related

Leia os outros