انتقل إلى المحتوى
use-cases / a-live-metrics-dashboard-no-backend / hero
PIPE · SSE · NO BACKEND

لوحة معلومات حية بلا خلفية تخزين للقياسات

عشرون وكيلًا يدفعون قياساتهم إلى عنوان pipe واحد عبر curl -T. لوحة معلوماتك تقرأ العنوان نفسه مع ?progress وتعرض بثّ SSE مباشرة في الصفحة. لا InfluxDB، لا Prometheus، لا فترة جمع. مجرّد سلك.

اقرأ توثيق pipe
use-cases / a-live-metrics-dashboard-no-backend / mechanism

عنوان واحد، طرفان

كل وكيل يضخّ سطره عبر curl إلى مسار الأنبوب نفسه. متصفّح لوحة المعلومات يفتح EventSource على ذلك المسار مع ?progress. خادم Hoody Pipe لا يحتفظ بشيء — البايتات التي تصل من جهة تخرج من الجهة الأخرى.

agent · monitor.sh
PUT · sender
#!/bin/sh
# حلقة مراقب الوكيل — سطر واحد لكل ثانية.
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 · reader
// <script> واحد في ملف HTML واحد. بلا خادم.
const tiles = document.querySelectorAll('[data-agent]');

tiles.forEach((tile) => [
  const id = tile.dataset.agent;
  // ?progress يحول مسار الأنبوب إلى تدفق SSE.
  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. الأنبوب يمرّر. لا يوجد بينهما ما يحتاج إلى تمدّد، أو إعادة تشغيل، أو دفع. أغلق لوحة المعلومات وتنتهي البثوث. افتحها مجدّدًا فترى بيانات حيّة خلال الثانية.

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

ثلاث قوى للوحة معلومات تتبخّر

ما تتخلّى عنه بحذف الخلفية تستعيده شيئًا أبسط.

الكُمون

أقل من ثانية بحكم البناء

لا توجد فترة جمع لانتظارها. آخر كتابة للوكيل هي إطار لوحة المعلومات الحالي. الأنبوب يمرّر مباشرة — بلا تفريغ وسيط.

العمليات

لا شيء للاحتفاظ به، لا شيء للفشل

لا سياسة احتفاظ لأنه لا يوجد تخزين. لا قرص يمتلئ، ولا نافذة ضغط، ولا فهرس سلاسل زمنية للتلف. القياس موجود ما دام قارئ يشاهد.

الاقتصاد

ملف HTML ثابت واحد يشحنها

لوحة المعلومات ملف HTML يمكنك استضافته في أيّ مكان — أو فتحه من القرص. لا وكيل لتثبيته، ولا خدمة دائمة لتشغيلها، ولا مقعد DataDog لتخصيصه. عنوان الأنبوب هو الحزمة بأكملها.

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

ما الذي يتبخّر

الحزمة المعيارية من وكيل إلى لوحة معلومات لها أربعة أجزاء متحرّكة. نموذج الأنبوب صفر. السلك نفسه، نصف شاشة من curl.

BEFORE · أربعة أجزاء للعناية بهاالحزمة النموذجية
  • statsd / telegraf
  • InfluxDB / TimescaleDB
  • Grafana / Datadog
  • ملفات إعداد جمع
أربعة إعدادات · أربع ترقيات · أربع فواتير
AFTER · سلك واحدأمرا curl
# كل وكيل: سطر واحد لكل مقياس.echo "cpu=64 mem=42" | curl -T - https://pipe.hoody.com/api/v1/pipe/metrics-$ID# كل عارض: curl واحد، أو new EventSource() في HTML.curl -N https://pipe.hoody.com/api/v1/pipe/metrics-$ID?progress
بلا تخزين · بلا جامع · بلا خدمة دائمة

حين تتخطّى قاعدة البيانات، تتوقف الأشياء التي كنت تديرها عن الوجود. لا توجد سياسة احتفاظ على سلك.

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

ما الذي يمنحك إيّاه الأنبوب

مسار الأنبوب بنية تحتية صغيرة لكن حقيقية. الأرقام تأتي من ضمانات واجهة Hoody Pipe، لا من معايير مخترعة.

  1. RECEIVERS PER PATH256

    حتى 256 لوحة معلومات أو ذيل curl يمكنها الاشتراك في المسار نفسه مع ?n. القارئ الأبطأ يطبّق ضغطًا عكسيًا لكنه لا يحجب الآخرين أبدًا.

  2. PROGRESS SPECTATORS50

    حتى 50 مشاهد SSE بـ ?progress لكل مسار. لا يستهلكون خانة مستقبِل — علامات تبويب لوحة معلوماتك وطرفيتك يمكنها المشاهدة بالتوازي.

  3. STORAGE LATENCY0 ms

    الخادم لا يكتب على القرص. البايتات التي تصل من جهة المُرسِل تخرج من جهة القارئ. لا توجد نافذة تفريغ بينهما.

حدود وفقًا لواجهة Hoody Pipe: عدد المستقبِلين 1–256، مشاهدو ?progress محدّدون بـ 50 لكل مسار، TTL لاتصال ?progress يبلغ 30 دقيقة، تمديد بعد النقل 30 ثانية.

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

لوحة المعلومات لم تستعلم عن قاعدة بيانات. البايتات وصلت ببساطة.

شُوهِدت حية · الجمعةتبخّرت · السبت
كيف بدت العمارة القديمةagent → statsd → InfluxDB → Grafanaأربعة أجزاء متحرّكة · أربعة ملفات إعداد · أربع فواتير
كيف تبدو الآنecho $line | curl -T - pipe/metricsسطر واحد — ولوحة المعلومات مجرّد ملف HTML
اقرأ مواصفات SSE progress
use-cases / a-live-metrics-dashboard-no-backend / replaces

ما يحلّ هذا محلّه

الأدوات المعيارية التي تلجأ إليها حين تريد لوحة قياسات. كلٌّ منها يفرض عليك قاعدة بيانات وخدمة دائمة. الأنبوب لا يفرض أيًّا منهما.

  • AWS Lambda + CloudWatchفوترة لكل استدعاء لما هو مجرّد curl
  • خدمات توجيه مخصصةخدمة مصغّرة كاملة لتمرير بايتات لها عنوان أصلًا
  • حزمة Prometheus + Grafanaخدمتان دائمتان، حلقة جمع، ولوحة معلومات يجب استضافتها ذاتيًا
  • InfluxDB + Telegrafقاعدة بيانات سلاسل زمنية لبيانات لا تحتفظ بها بعد الشاشة
  • جمع قياسات DataDogتسعير لكل مضيف لرقم أردت رؤيته مرّة واحدة
  • خطوط استيعاب قياسات مخصصةKafka + مستهلك + مصبّ لقيمة يستطيع الوكيل دفعها مباشرة
use-cases / a-live-metrics-dashboard-no-backend / cta

كفّ عن الجمع. كفّ عن التخزين. شاهد السلك — وحين تتوقف عن المشاهدة، يكون السلك فارغًا.

اقرأ توثيق pipe
use-cases / a-live-metrics-dashboard-no-backend / related

اقرأ الآخرين