コンテンツにスキップ
use-cases / a-live-metrics-dashboard-no-backend / hero
PIPE · SSE · NO BACKEND

メトリクスバックエンドなしのライブダッシュボード

20 個のエージェントが curl -T で 1 つのパイプ URL にメトリクスを送ります。ダッシュボードは ?progress を付けて同じ URL を読み、SSE ストリームを直接ページにレンダリングします。InfluxDB なし、Prometheus なし、スクレイプ間隔なし。ただのワイヤー。

Pipe ドキュメントを読む
use-cases / a-live-metrics-dashboard-no-backend / mechanism

1 つの URL、2 つの側

すべてのエージェントが自分の行を同じパイプパスに curl で送ります。ダッシュボードのブラウザはそのパスに ?progress 付きで EventSource を開きます。Hoody Pipe サーバーは何も保持しません — 一方の側に到着したバイトはもう一方の側から出ていきます。

agent · monitor.sh
PUT · 送信者
#!/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
ワイヤーは何も保持しない
dashboard.html · ブラウザ内
GET ?progress · 読者
// 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;
  ]);
]);

エージェントは curl します。ブラウザは EventSource します。パイプは転送します。間にスケール、再起動、支払うものは何もありません。ダッシュボードを閉じるとストリームは終了します。再度開けば、1 秒以内にライブデータが見えます。

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

蒸発するダッシュボードの 3 つの力

バックエンドを削除することで諦めるものは、よりシンプルなものとして取り戻せます。

レイテンシ

構造的にサブセカンド

待つスクレイプ間隔はありません。エージェントの最後の書き込みがダッシュボードの現在のフレームです。パイプは直接転送します — 中間フラッシュなし。

オペレーション

保持するものなし、失敗するものなし

ストレージがないので、保持ポリシーもありません。ディスクが満杯になることも、コンパクションウィンドウも、破損する時系列インデックスもありません。メトリクスは読者が見ている間だけ存在します。

経済性

1 つの静的 HTML ファイルで出荷

ダッシュボードはどこでもホストできる、あるいはディスクから開ける HTML ファイルです。インストールするエージェントも、実行するデーモンも、プロビジョニングする DataDog シートもありません。パイプ URL がスタック全体です。

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

蒸発するもの

標準的なエージェントからダッシュボードへのスタックには 4 つの可動部分があります。パイプモデルにはゼロです。同じワイヤー、画面の半分の curl。

ビフォア · 4 つの世話を焼くパーツ典型的なスタック
  • statsd / telegraf
  • InfluxDB / TimescaleDB
  • Grafana / Datadog
  • スクレイプ設定ファイル
4 つの設定 · 4 つのアップグレード · 4 つの請求
アフター · 1 本のワイヤー2 つの 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
ストレージなし · スクレイパーなし · デーモンなし

データベースをスキップすると、管理していたものが存在しなくなります。ワイヤーには保持ポリシーはありません。

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

パイプが提供するもの

パイプパスは小さいですが本物のインフラです。数値は捏造されたベンチマークではなく、Hoody Pipe API の保証から来ています。

  1. パスあたりの受信者256

    ?n を付けて最大 256 のダッシュボードまたは curl の tail が同じパスにサブスクライブできます。最も遅い読者がバックプレッシャーを適用しますが、他をブロックすることはありません。

  2. プログレス観戦者50

    パスあたり最大 50 の ?progress SSE ビューア。受信者スロットを消費しません — ダッシュボードタブとターミナルが並行して見ることができます。

  3. ストレージレイテンシ0 ms

    サーバーはディスクに書き込みません。送信者側に到着したバイトは読者側から出ていきます。両者の間にフラッシュウィンドウはありません。

Hoody Pipe API による制限: 受信者数 1–256、プログレス観戦者はパスあたり 50 で上限、30 分のプログレスコネクション TTL、転送後 30 秒のリンガー。

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

ダッシュボードはデータベースに問い合わせませんでした。バイトはただ到着しました。

金曜にライブで観戦土曜に蒸発
古いアーキテクチャはこう見えたagent → statsd → InfluxDB → Grafana4 つの可動部分 · 4 つの設定ファイル · 4 つの請求
今はこう見えるecho $line | curl -T - pipe/metrics1 行 — そしてダッシュボードはただの HTML ファイル
SSE プログレス仕様を読む
use-cases / a-live-metrics-dashboard-no-backend / replaces

これが置き換えるもの

メトリクスダッシュボードが欲しいときに手を伸ばす標準的なツール。それぞれがデータベースとデーモンを請求します。パイプはどちらも請求しません。

  • AWS Lambda + CloudWatchただの curl に対する呼び出し単位の課金
  • カスタムルーティングサービスすでに URL を持っているバイトを転送するためだけのマイクロサービス全体
  • Prometheus + Grafana スタック2 つのデーモン、スクレイプループ、自分でホストするダッシュボード
  • InfluxDB + Telegraf画面を超えて保持しないデータのための時系列データベース
  • DataDog メトリクス収集一度見たい数字のためのホストごとの価格設定
  • カスタムメトリクス取り込みパイプラインエージェントが押すだけでよかった値のための Kafka + コンシューマー + シンク
use-cases / a-live-metrics-dashboard-no-backend / cta

スクレイピングをやめましょう。保存をやめましょう。ワイヤーを見守りましょう — 見るのをやめれば、ワイヤーは空になります。

Pipe ドキュメントを読む
use-cases / a-live-metrics-dashboard-no-backend / related

他のユースケースを読む