コンテンツにスキップ
タイプアンロック
ステージフリート
難易度中程度
ジョブサービスを監視
対象AI ビルダー
対象開発チーム
サービスパイプ
Hoody の利点HTTP ネイティブ
Hoody の利点コンテナ経済学
タイプアンロック
ステージフリート
難易度中程度
ジョブサービスを監視
対象AI ビルダー
対象開発チーム
サービスパイプ
Hoody の利点HTTP ネイティブ
Hoody の利点コンテナ経済学
タイプアンロック
ステージフリート
難易度中程度
ジョブサービスを監視
対象AI ビルダー
対象開発チーム
サービスパイプ
Hoody の利点HTTP ネイティブ
Hoody の利点コンテナ経済学
タイプアンロック
ステージフリート
難易度中程度
ジョブサービスを監視
対象AI ビルダー
対象開発チーム
サービスパイプ
Hoody の利点HTTP ネイティブ
Hoody の利点コンテナ経済学
PIPE · SSE · バックエンド不要

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

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

Pipe ドキュメントを読む

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 秒以内にライブデータが見えます。

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

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

レイテンシ

構造的にサブセカンド

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

オペレーション

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

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

経済性

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

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

蒸発するもの

標準的なエージェントからダッシュボードへのスタックには 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
ストレージなし · スクレイパーなし · デーモンなし

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

パイプが提供するもの

パイプパスは小さいですが本物のインフラです。数値は捏造されたベンチマークではなく、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 秒のリンガー。

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

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

これが置き換えるもの

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

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

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

Pipe ドキュメントを読む

他のユースケースを読む