
ستون حاوية على خادم واحد
صندوق معادن عارية واحد يشغل عشرات إلى مئات حاويات Hoody. يجعل KSM و BTRFS dedup التكلفة الإضافية قريبة من الصفر.
عشرون وكيلًا يدفعون قياساتهم إلى عنوان pipe واحد عبر curl -T. لوحة معلوماتك تقرأ العنوان نفسه مع ?progress وتعرض بثّ SSE مباشرة في الصفحة. لا InfluxDB، لا Prometheus، لا فترة جمع. مجرّد سلك.
لا Prometheus، لا InfluxDB، لا خدمة قياسات — مجرّد SSE على أنبوب
كل وكيل يضخّ سطره عبر curl إلى مسار الأنبوب نفسه. متصفّح لوحة المعلومات يفتح EventSource على ذلك المسار مع ?progress. خادم Hoody Pipe لا يحتفظ بشيء — البايتات التي تصل من جهة تخرج من الجهة الأخرى.
#!/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// <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. الأنبوب يمرّر. لا يوجد بينهما ما يحتاج إلى تمدّد، أو إعادة تشغيل، أو دفع. أغلق لوحة المعلومات وتنتهي البثوث. افتحها مجدّدًا فترى بيانات حيّة خلال الثانية.
ما تتخلّى عنه بحذف الخلفية تستعيده شيئًا أبسط.
لا توجد فترة جمع لانتظارها. آخر كتابة للوكيل هي إطار لوحة المعلومات الحالي. الأنبوب يمرّر مباشرة — بلا تفريغ وسيط.
لا سياسة احتفاظ لأنه لا يوجد تخزين. لا قرص يمتلئ، ولا نافذة ضغط، ولا فهرس سلاسل زمنية للتلف. القياس موجود ما دام قارئ يشاهد.
لوحة المعلومات ملف HTML يمكنك استضافته في أيّ مكان — أو فتحه من القرص. لا وكيل لتثبيته، ولا خدمة دائمة لتشغيلها، ولا مقعد DataDog لتخصيصه. عنوان الأنبوب هو الحزمة بأكملها.
الحزمة المعيارية من وكيل إلى لوحة معلومات لها أربعة أجزاء متحرّكة. نموذج الأنبوب صفر. السلك نفسه، نصف شاشة من curl.
حين تتخطّى قاعدة البيانات، تتوقف الأشياء التي كنت تديرها عن الوجود. لا توجد سياسة احتفاظ على سلك.
مسار الأنبوب بنية تحتية صغيرة لكن حقيقية. الأرقام تأتي من ضمانات واجهة Hoody Pipe، لا من معايير مخترعة.
حتى 256 لوحة معلومات أو ذيل curl يمكنها الاشتراك في المسار نفسه مع ?n. القارئ الأبطأ يطبّق ضغطًا عكسيًا لكنه لا يحجب الآخرين أبدًا.
حتى 50 مشاهد SSE بـ ?progress لكل مسار. لا يستهلكون خانة مستقبِل — علامات تبويب لوحة معلوماتك وطرفيتك يمكنها المشاهدة بالتوازي.
الخادم لا يكتب على القرص. البايتات التي تصل من جهة المُرسِل تخرج من جهة القارئ. لا توجد نافذة تفريغ بينهما.
حدود وفقًا لواجهة Hoody Pipe: عدد المستقبِلين 1–256، مشاهدو ?progress محدّدون بـ 50 لكل مسار، TTL لاتصال ?progress يبلغ 30 دقيقة، تمديد بعد النقل 30 ثانية.
لوحة المعلومات لم تستعلم عن قاعدة بيانات. البايتات وصلت ببساطة.
الأدوات المعيارية التي تلجأ إليها حين تريد لوحة قياسات. كلٌّ منها يفرض عليك قاعدة بيانات وخدمة دائمة. الأنبوب لا يفرض أيًّا منهما.
كفّ عن الجمع. كفّ عن التخزين. شاهد السلك — وحين تتوقف عن المشاهدة، يكون السلك فارغًا.