لماذا تستبدلون Promtail بـ Alloy الآن
صفحة Promtail الرسمية واضحة: انتهى دعم الوكيل منذ 2 مارس 2026، وتوقّف الدعم التجاري، ويستمر كل التطوير في Grafana Alloy. ووكيل الجمع عملية ذات صلاحيات مرتفعة تعمل باستمرار: تركه دون تصحيحات أمر لا يمكن الاستمرار فيه.
ليس Alloy مجرد Promtail باسم جديد. إنه جامع واحد يُضبط عبر مكوّنات: مصدر للسجلات، وexporter لمقاييس النظام، ووجهة إرسال نحو Loki وأخرى نحو Prometheus. على خادم VPS كان يشغّل Promtail وnode_exporter جنبًا إلى جنب، تكفي الآن خدمة واحدة. ويستطيع أيضًا تمرير OTLP إذا كنتم تُجهّزون تطبيقاتكم بالقياس، وهو موضوع نتناوله في دليلنا عن Tempo وOpenTelemetry.
لا يعيد هذا الدليل تثبيت Loki ولا Prometheus: الجانب الخادمي موصوف في دليل Loki وGrafana وفي دليل Grafana وPrometheus. هنا نهتم بالوكيل وحده.
ما الذي يغيّره وكيل واحد على خادمكم
- خدمة واحدة للمراقبة — تمر السجلات والمقاييس عبر العملية نفسها
alloy، مع سجل واحد تقرؤونه عند حدوث عطل. - تحديثات لا تزال تصل — يُنشر Alloy في مستودعات apt وrpm الخاصة بـ Grafana: يكفي
apt upgradeلإبقائه محدّثًا مثل باقي النظام. - انتقال مزوّد بالأدوات — يترجم الأمر
alloy convertإعدادات Promtail القائمة وينتج تقريرًا بما لم يتمكن من تحويله. - مقاييس النظام مدمجة — يحلّ المكوّن
prometheus.exporter.unixمحلّ node_exporter دون ملف تنفيذي إضافي ولا منفذ يجب فتحه. - واجهة تصحيح محلية — تعرض الواجهة على المنفذ 12345 مخطط المكوّنات وقيمها، ويمكن الوصول إليها عبر نفق SSH.
- إرسال نحو منظومتكم أو نحو Grafana Cloud — الملف نفسه يرسل إلى Loki مستضاف ذاتيًا أو إلى خدمة مُدارة بتغيير عنوان URL واحد.
متطلبات Alloy على VPS بالأرقام
يُثبَّت Alloy على Debian وUbuntu وAlmaLinux وRocky Linux من مستودعات Grafana الرسمية. تُنشئ الحزمة مستخدم نظام باسم alloy، وخدمة systemd بالاسم نفسه، وملف الإعدادات /etc/alloy/config.alloy.
من حيث الموارد، تعطي وثائق Alloy رتبتين تقريبيتين: نحو نواة واحدة و120 MiB من الذاكرة لكل MiB/s من السجلات المستقبَلة، ونحو 11 GiB من الذاكرة لكل مليون سلسلة Prometheus نشطة. يعرض خادم VPS منفرد بضعة آلاف من السلاسل، ونادرًا ما يكتب أكثر من بضع مئات KiB من السجلات في الثانية. توصيتنا التحريرية: خصّصوا للوكيل نصف vCPU و256 إلى 512 ميغابايت من الذاكرة، وبضعة غيغابايتات من القرص تحت /var/lib/alloy لمواضع القراءة ومخزن الإرسال المؤقت.
وتحتاجون أخيرًا إلى وجهة: Loki يمكن بلوغه على /loki/api/v1/push، وPrometheus مُشغَّل بالخيار --web.enable-remote-write-receiver الذي يفتح نقطة النهاية /api/v1/write. لا حاجة لفتح أي منفذ وارد على خادم الوكيل: Alloy يدفع البيانات ولا يُستعلَم.
تثبيت Alloy وربط السجلات والمقاييس
إضافة مستودع Grafana على Debian أو Ubuntu
sudo mkdir -p /etc/apt/keyringssudo wget -O /etc/apt/keyrings/grafana.asc https://apt.grafana.com/gpg-full.keysudo chmod 644 /etc/apt/keyrings/grafana.ascecho "deb [signed-by=/etc/apt/keyrings/grafana.asc] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.listsudo apt-get update && sudo apt-get install alloyأو تثبيته على AlmaLinux وRocky Linux
استوردوا المفتاح بالأمر
wget -q -O gpg.key https://rpm.grafana.com/gpg.keyثمsudo rpm --import gpg.key. أنشئوا/etc/yum.repos.d/grafana.repoمعbaseurl=https://rpm.grafana.comوrepo_gpgcheck=1وgpgcheck=1وenabled=1كما تبيّن صفحة تثبيت Alloy على Linux، ثم نفّذواsudo dnf install alloy.تشغيل الخدمة والتحقق من مستخدمها
sudo systemctl enable --now alloysudo systemctl status alloysystemctl cat alloy | grep Userيجب أن يعرض الأمر الأخير
User=alloy. لا تحدّد الحزمة أيGroup=: لذا تأتي صلاحيات القراءة من المجموعات الثانوية لهذا المستخدم، وهي نقطة أساسية لما يلي.تحديد وجهة السجلات
افتحوا
/etc/alloy/config.alloyوأضيفوا وجهة الإرسال نحو Loki:loki.write "default" {endpoint {url = "http://127.0.0.1:3100/loki/api/v1/push"}}استبدلوا العنوان بعنوان Loki لديكم. وإن كان بعيدًا، فاستعملوا HTTPS وكتلة
basic_auth.جمع journald وملفات السجلات
loki.source.journal "system" {forward_to = [loki.write.default.receiver]labels = {"job" = "systemd-journal"}}local.file_match "nginx" {path_targets = [{"__path__" = "/var/log/nginx/*.log", "job" = "nginx"}]}loki.source.file "nginx" {targets = local.file_match.nginx.targetsforward_to = [loki.write.default.receiver]}افتراضيًا، يقرأ مصدر journal المسارين
/var/log/journalو/run/log/journal، ولا يعود إلا سبع ساعات إلى الوراء عند أول تشغيل.جمع مقاييس النظام
prometheus.exporter.unix "node" { }prometheus.scrape "node" {targets = prometheus.exporter.unix.node.targetsforward_to = [prometheus.remote_write.default.receiver]}prometheus.remote_write "default" {endpoint {url = "http://127.0.0.1:9090/api/v1/write"}}إن كان node_exporter يعمل مسبقًا على الجهاز، فأوقفوه بعد الانتقال كي لا تُجمع السلاسل نفسها مرتين.
التحقق قبل إعادة التحميل
sudo alloy validate /etc/alloy/config.alloysudo systemctl reload alloysudo journalctl -u alloy -fيكشف
validateخطأ الصياغة أو المكوّن المُشار إليه خطأً قبل أن تحمّل الخدمة الإعدادات.منح صلاحيات القراءة
يجب أن يعرض
id alloyالمجموعتينadmوsystemd-journal. تضيفهما الحزمة عند وجودهما؛ وبعد تثبيت من ملف تنفيذي أو حذف مجموعة، أعيدوهما بالأمرsudo usermod -aG adm,systemd-journal alloyثمsudo systemctl restart alloy. ولمجلد تطبيق يملكه مستخدم آخر، تفضّل الوثائق قائمة ACL على إضافة مجموعة:sudo setfacl -R -m u:alloy:rx /var/log/monappوsudo setfacl -R -d -m u:alloy:rx /var/log/monapp.التحقق من البداية إلى النهاية ثم ربط لوحات المتابعة
اكتبوا سطرًا شاهدًا بالأمر
logger -t alloy-test "ligne de test alloy"، ثم ابحثوا عنه في Grafana، تبويب Explore، بالاستعلام{job="systemd-journal"} |= "ligne de test alloy". أما المقاييس، فيجب أن يعيد الاستعلامnode_load1سلسلة لخادمكم. إن استجاب الاثنان، فأعيدوا استخدام لوحات دليلنا عن Grafana وPrometheus التي تقرأ السلاسل نفسهاnode_*.
Alloy وDocker: قراءة الحاويات دون فتح كل شيء
لقراءة سجلات حاوياتكم، يجمع Alloy المثبّت على المضيف بين discovery.docker وloki.source.docker، وكلاهما موجّه إلى unix:///var/run/docker.sock. يجب عندها أن يتمكن المستخدم alloy من فتح هذا المقبس، وهو ما يتم عمليًا عبر sudo usermod -aG docker alloy. افعلوا ذلك عن دراية: تذكّر وثائق Docker بأن المجموعة docker تمنح صلاحيات تعادل صلاحيات root. يصبح وكيل السجلات عمليًا مديرًا للجهاز.
يمكنكم أيضًا تشغيل Alloy نفسه داخل حاوية، بالصورة grafana/alloy، مع ربط الملف على /etc/alloy/config.alloy والوسيط --storage.path=/var/lib/alloy/data على وحدة تخزين دائمة. ربط المقبس بخيار :ro لا يحدّ من استدعاءات واجهة Docker البرمجية: المقبس يبقى مقبسًا. ولمقاييس المضيف، يجب أن تتلقى الحاوية نظام ملفات الجهاز و/proc و/sys كنقاط ربط.
على خادم VPS واحد، تبقى حزمة systemd الأسهل في التدقيق.
الانتقال من Promtail: الخطر الحقيقي في المواضع
يحتفظ Promtail بملف مواضع يسجّل، لكل ملف متابَع، النقطة التي توقف عندها عن القراءة. أما Alloy فيحفظ مواضعه في مكان آخر، داخل المجلد الذي يحدده --storage.path. والتحويل يأخذ ذلك في الحسبان: تحمل كتلة loki.source.file الناتجة عن alloy convert وسيطًا legacy_positions_file يشير إلى الملف القديم، لاستئناف القراءة من النقطة الصحيحة.
لهذه الآلية نقطة ضعف موثّقة. في البلاغ grafana/alloy #5493، يصف مستخدم الخطأ error reading legacy positions file متبوعًا بـ permission denied: لم يتمكن Alloy من قراءة الملف القديم، فتجاهله وأعاد إرسال كل سجلات الخادم من البداية. رأى المشرف على المشروع أن إيقاف Alloy في هذه الحالة مشروع، وقد أُغلق البلاغ، لكن لا تراهنوا على نسختكم: تحققوا من الصلاحيات قبل أول تشغيل.
والخطر الآخر معاكس: Promtail وAlloy إن عملا معًا يرسلان كل سطر مرتين. الترتيب التالي يتجنب الخطرين.
نقل إعدادات Promtail دون فقدان ولا تكرار
تحديد ملف الإعدادات وملف المواضع
افتحوا إعدادات Promtail، وغالبًا ما تكون
/etc/promtail/config.yml، وسجّلوا قيمةpositions.filename. في تثبيت عبر Docker Compose، يقع هذا الملف داخل وحدة تخزين: سجّلوا مساره الحقيقي على المضيف.التحويل مع تقرير
alloy convert --source-format=promtail --report=/tmp/promtail-report.txt --output=/tmp/promtail.alloy /etc/promtail/config.ymlاقرؤوا التقرير قبل أي شيء. يفرض الخيار
--bypass-errorsتحويلًا جزئيًا، لكن الوثائق تحذّر من أن السلوك قد يختلف حينها عن الأصل.التحقق من أن المستخدم alloy يقرأ الملف القديم
grep legacy_positions_file /tmp/promtail.alloysudo -u alloy cat /var/lib/promtail/positions.yamlعدّلوا المسار وفق ما سجّلتموه سابقًا. إن فشل الأمر الثاني، فانسخوا الملف إلى مجلد يقرؤه
alloyوصحّحوا المسار في الإعدادات المحوّلة.إيقاف Promtail قبل تشغيل Alloy
sudo systemctl stop promtail، أوdocker compose stop promtailلمنظومة حاويات. يكتب Promtail حينها آخر مواضعه، ولا يُرسل أي سطر مرتين أثناء الانتقال.تبديل الإعدادات
انقلوا الكتل المحوّلة إلى
/etc/alloy/config.alloy، ونفّذواsudo alloy validate /etc/alloy/config.alloyثمsudo systemctl restart alloy. تحققوا فورًا منsudo journalctl -u alloy | grep -i positions: يجب ألا يظهر أي سطرerror reading legacy positions file.المراقبة أسبوعًا ثم الإزالة
قارنوا حجم السجلات في Grafana قبل الانتقال وبعده، وتابعوا العدّاد
loki_write_sent_entries_totalفي Alloy. احتفظوا بإعدادات Promtail بضعة أيام، ثمsudo systemctl disable promtailوأزيلوا الحزمة أو خدمة Compose.
Promtail وAlloy جنبًا إلى جنب
مرّر الجدول أفقيًا
| المعيار | Promtail | Grafana Alloy |
|---|---|---|
| الحالة | انتهى دعمه منذ 2 مارس 2026، ولا تحديثات بعد ذلك | تطوير نشط، والخلف الذي اعتمدته Grafana |
| الإشارات المجمّعة | السجلات فقط | السجلات والمقاييس وتتبعات OTLP والملفات التحليلية |
| مقاييس النظام | node_exporter يُثبَّت على حدة | المكوّن `prometheus.exporter.unix` مدمج |
| الإعدادات | YAML | صياغة Alloy بالمكوّنات، والتحويل عبر `alloy convert` |
| مواضع القراءة | ملف يُحدَّد في الإعدادات | المجلد `--storage.path`، والاستئناف عبر `legacy_positions_file` |
| التصحيح | سجل الخدمة | سجل الخدمة وواجهة محلية على المنفذ 12345 |
| مستخدم الخدمة | حسب طريقة التثبيت | `alloy`، مع المجموعتين `adm` و`systemd-journal` اللتين تضيفهما الحزمة |
الإعداد بعد التثبيت: الواجهة والأسرار والتخزين
تستمع واجهة التصحيح افتراضيًا على 127.0.0.1:12345. أبقوها كذلك وافتحوها عبر نفق: ssh -L 12345:127.0.0.1:12345 [email protected]، ثم http://localhost:12345 في المتصفح. وإن أردتم كشفها رغم ذلك، فأضيفوا --server.http.listen-addr=0.0.0.0:12345 إلى CUSTOM_ARGS، ولكن فقط خلف جدار حماية يرشّح هذا المنفذ.
توجد خيارات التشغيل في /etc/default/alloy على Debian وUbuntu، وفي /etc/sysconfig/alloy على AlmaLinux وRocky. وهناك أيضًا تضعون الأسرار: عرّفوا متغيرًا LOKI_PASSWORD، واقرؤوه في الإعدادات بـ sys.env("LOKI_PASSWORD")، وأبقوا كلمة المرور خارج config.alloy.
إن كان Loki بعيدًا، فلا ترسلوا أبدًا عبر HTTP غير مشفّر على الإنترنت: ضعوا Loki خلف وكيل عكسي TLS مع مصادقة، كما هو موصوف في دليلنا عن Loki. وأخيرًا، راقبوا المساحة في /var/lib/alloy: إذا تعذّر بلوغ Loki، فهناك تتراكم البيانات التي تنتظر الإرسال.
تحصين الخدمة دون تعطيل الجمع
تقترح وثائق Alloy ملف drop-in يُنشأ بالأمر sudo systemctl edit alloy كي يصمد أمام تحديثات الحزمة: NoNewPrivileges=yes وProtectSystem=strict وProtectHome=yes وPrivateTmp=yes وReadWritePaths=/var/lib/alloy. مع ProtectSystem=strict، أضيفوا ReadOnlyPaths=/var/log/journal وReadOnlyPaths=/run/log/journal، وإلا توقف مصدر journal عن القراءة. اختموا بـ sudo systemctl daemon-reload وsudo systemctl restart alloy. فضّلوا قائمة ACL لكل مجلد على إضافة مجموعات، ولا تمنحوا المجموعة docker إلا إذا كنتم تجمعون سجلات الحاويات فعلًا.
استكشاف الأعطال: الأخطاء التي لا يصرخ بها Alloy
معظم أعطال Alloy على خادم VPS ليست انهيارات. الخدمة نشطة، والواجهة خضراء، وGrafana يبقى فارغًا. والسبب يوثّقه المشرفون على المشروع أنفسهم في البلاغ grafana/alloy #2994، الذي أُغلق لصالح البلاغ #6340: صحة المكوّن تعني أنه يعمل، لا أنه يرسل.
يكفي إجراءان للخروج من هذا الضباب. اقرؤوا سجل الخدمة بالأمر sudo journalctl -u alloy --since "10 min ago"، واستعلموا عن المقاييس الداخلية للوكيل بالأمر curl -s http://127.0.0.1:12345/metrics | grep loki_write. يجب أن يرتفع العدّاد loki_write_sent_entries_total؛ أما loki_write_dropped_entries_total فيعدّ الأسطر المهمَلة بعد استنفاد كل محاولات الإرسال.
رسائل الخطأ وحلولها
- مصدر journal يبدأ، لكن لا يصل أي سطر — تقول وثائق
loki.source.journalذلك صراحة: دون المجموعتينadmوsystemd-journal، يبدأ المكوّن دون خطأ ولا يجمع شيئًا. صحّحوا ذلك بالأمرsudo usermod -aG adm,systemd-journal alloy، ثم أعيدوا تشغيل الخدمة، لأن المجموعة المضافة لا تسري إلا عند التشغيل التالي. failed to tail the file: open /var/log/…: permission denied— الملف موجود لكنalloyلا يستطيع قراءته. امنحوا قائمة ACL على المجلد بالأمرsetfacl -R -m u:alloy:rxوبصيغته-dللملفات التي يُنشئها التدوير لاحقًا.- لا رسالة ولا سطر لمجلد كامل — يصف البلاغ grafana/alloy #6542 سجلات لم تُرسل قط دون أي خطأ. ويؤكد فيه أحد المشرفين أن الملف غير المقروء يُسجَّل، أما المجلد الذي يتعذّر الوصول إليه فلا. اختبروا ذلك بالأمر
sudo -u alloy ls /var/log/monapp. error reading legacy positions file … permission denied— لم يقرأ Alloy مواضع Promtail وقد يعيد إرسال كل شيء من البداية (البلاغ #5493). أوقفوا الخدمة، واجعلوا الملف مقروءًا لـalloy، ثم أعيدوا التشغيل.failed to identify the read-write layer ID … mount-id: permission denied— خطأ من المكوّن cAdvisor تحت systemd (البلاغ #4068). المجموعةdockerلا تكفي؛ ويذكر مستخدمون أن ملف drop-in يتضمنAmbientCapabilities=CAP_DAC_READ_SEARCHوCapabilityBoundingSet=CAP_DAC_READ_SEARCHيحلّ المشكلة دون تشغيل الخدمة بصلاحيات root. إنه حلّ مجتمعي، اختبروه قبل تعميمه.- الواجهة خضراء لكن Grafana يبقى فارغًا — تحققوا من
loki_write_sent_entries_totalومن سطر الاختبار الذي كتبهlogger. إن توقف العدّاد، فالعطل في مرحلة سابقة، عند المصدر.
وكيل محدَّث على خادم تملكونه
يحتاج Alloy إلى ما لا تمنحه الاستضافة المشتركة: خدمة systemd، وقراءة /var/log وسجل journal، وأحيانًا مقبس Docker. على خادم VPS، تختارون توزيعتكم، وتحتفظون بمنظومة Loki وPrometheus، وتقرّرون الصلاحيات الممنوحة للوكيل. وإن فضّلتم عدم إدارة النظام بأنفسكم، فخيار إدارة VPS متاح للخادم.
تبقى الوثائق الرسمية المرجع لكل مكوّن: الانتقال من Promtail، والصلاحيات على Linux، وصفحة انتهاء دعم Promtail. ولتتبّع التطبيقات، تابعوا مع دليلنا عن Tempo وOpenTelemetry.