مُجمِّع OpenTelemetry
مُجمِّع OpenTelemetry
كل خدمة تُضيف إليها أدوات القياس ستحتاج في نهاية المطاف إلى إيصال بياناتها إلى مكان مفيد — backend للتتبع، أو مخزن مقاييس، أو نظام تجميع سجلات. يمكنك توصيل كل SDK مباشرةً بكل backend، لكن هذا النهج ينهار أمام واقع التشغيل: بيانات اعتماد مبعثرة عبر كل pod، ولا طريقة لإثراء البيانات أو تصفيتها قبل مغادرتها التطبيق، وإعادة نشر في كل مرة تغيّر فيها backend. يحل مُجمِّع OpenTelemetry المشكلات الثلاث دفعةً واحدة. إنه خط أنابيب بيانات قياس محايد من الموردين ومصمم للإنتاج: يستقبل الإشارات من تطبيقاتك ويحوّلها ويوجّهها إلى backend واحد أو أكثر — دون لمس كود التطبيق.
في منظمات بحجم Google، المُجمِّع ليس خياراً. إنه الجهاز العصبي المركزي لمنظومة المراقبة: المستوى الواحد الذي تُطبَّق فيه حوكمة البيانات (أخذ العينات، وحذف PII، والتحكم في التكلفة) قبل وصول أي شيء إلى backend مدفوع.
المعمارية: المُستقبِلات والمُعالِجات والمُصدِّرات
المُجمِّع هو خط أنابيب قابل للتركيب. كل خط أنابيب له ثلاث مراحل بالترتيب:
- المُستقبِلات (Receivers) — تستوعب بيانات القياس من المصادر. يقبل مُستقبِل
otlpبيانات OTLP عبر gRPC (المنفذ 4317) وHTTP (المنفذ 4318). تسحب مُستقبِلات أخرى من نقاط Prometheus ومن Jaeger وZipkin وKafka وFluent Bit وغيرها. يمكن لمثيل المُجمِّع الواحد تشغيل مُستقبِلات متعددة في آنٍ واحد. - المُعالِجات (Processors) — تحوّل البيانات وتصفّيها وتُجمّعها وتُثريها أثناء التدفق. إنها العضلة التشغيلية لخط الأنابيب: تحذف الامتدادات غير الضرورية، وتضيف بيانات وصفية من Kubernetes، وتُحدِّد عدد السمات، وتُجمّع عمليات التصدير لتحسين الإنتاجية.
- المُصدِّرات (Exporters) — ترسل البيانات المحوّلة إلى backends. يتحدث مُصدِّر OTLP مع Grafana Tempo وHoneycomb وأي backend يدعم OTel. يعرض مُصدِّر Prometheus نقطة جمع بيانات (scrape). أما مُصدِّر
debugفيطبع على stdout — لا غنى عنه أثناء التطوير.
تُعلَن خطوط الأنابيب لكل نوع إشارة (traces وmetrics وlogs) ويمكنها التشعب إلى مُصدِّرات متعددة في آنٍ واحد. ربط نفس المُعالِج بخطوط أنابيب متعددة يتيح تطبيق قاعدة تطبيع واحدة على جميع أنواع الإشارات.
health_check)، ونقطة pprof للتنميط (pprof)، وواجهة zPages للتصحيح (zpages). تعمل الامتدادات جنباً إلى جنب مع خطوط الأنابيب لكنها ليست جزءاً من تدفق البيانات.
تهيئة مُجمِّع متكاملة للإنتاج
فيما يلي ملف otelcol-config.yaml واقعي ستنشره كـ DaemonSet أو sidecar في Kubernetes. يغطي أهم المُعالِجات وإعداد تصدير متعدد الـ backends.
memory_limiter دائماً في أول كل خط أنابيب. إذا اجتاحت موجة مرور كبيرة الطابور الداخلي للمُجمِّع، سيُعيق المُصدِّر وسيُسقط البيانات في نهاية المطاف. بدون memory_limiter، تقتل العملية نفسها بسبب نفاد الذاكرة وتُسقط كل ما في طابورها. بوجوده، يرفض المُجمِّع البيانات الجديدة بشكل لطيف (يُعيد خطأً قابلاً للإعادة إلى SDK) قبل نفاد الذاكرة. إغفال هذا المُعالِج هو أكثر أخطاء تهيئة مُجمِّع الإنتاج شيوعاً.
أنماط النشر
طريقة نشر المُجمِّع تُحدد خصائصه التشغيلية. ثلاثة أنماط تسود في بيئات الإنتاج:
- DaemonSet (وضع الوكيل) — pod واحد للمُجمِّع لكل node. يستقبل كل pod بيانات القياس من جميع التطبيقات على تلك الـ node. مسافات شبكة قصيرة، يمكنه إثراء الامتدادات ببيانات وصفية على مستوى الـ node، ويتحمل إعادة تشغيل المُجمِّع مع تأثير محدود. هو الخيار الافتراضي الموصى به في Kubernetes، ويُدار بواسطة مُشغِّل OpenTelemetry عبر CRD باسم
OpenTelemetryCollectorمعmode: daemonset. - وضع Sidecar — حاوية مُجمِّع واحدة لكل pod تطبيق. أقصى عزل؛ مثالي لكلاسترات متعددة المستأجرين حيث لا يجب أن تشترك الفرق في خط أنابيب واحد. تكلفة موارد أعلى. استخدمه للأعباء الحساسة أمنياً أو عند الحاجة إلى سياسات أخذ عينات لكل خدمة.
- وضع البوابة (Deployment) — أسطول مُجمِّع مركزي وقابل للتوسع أفقياً. تُعيد جميع مُجمِّعات مستوى الـ node إرسال بياناتها إليه عبر OTLP. تُطبِّق البوابة أخذ العينات على مستوى الكلاستر وحذف PII والتشعب إلى backends متعددة. تتيح استخدام مُعالِجات ذات حالة كـ
tail_samplingالتي تحتاج لرؤية جميع امتدادات التتبع قبل اتخاذ قرار الأخذ. في الكلاسترات الكبيرة (100 node أو أكثر)، هذا التوبولوجي ثنائي المستوى — وكيل + بوابة — هو المعيار.
أهم المُعالِجات التي يجب معرفتها
إلى جانب الأساسيات، ثلاثة مُعالِجات تُعرِّف خطوط الأنابيب ذات الجودة الإنتاجية:
k8sattributes— يُثري تلقائياً كل امتداد وسجل بـk8s.pod.nameوk8s.namespace.nameوk8s.deployment.nameوتسميات مثلapp.version. يتطلبClusterRoleبصلاحياتget/list/watchعلى الـ pods. بدونه، ربط تتبع Tempo بعبء Kubernetes الذي أنتجه يستلزم مراجعة متقاطعة يدوية مُضنية.tail_sampling— يتخذ قرارات أخذ العينات بعد رؤية التتبع كاملاً (على عكس الأخذ القائم على الرأس الذي يقرر عند أول امتداد). أنواع السياسات تشمل:latency(احتفظ بأي تتبع يتجاوز 200ms)، وerror(احتفظ بجميع التتبعات التي تحتوي على امتداد خطأ واحد على الأقل)، وprobabilistic(احتفظ بـ 1% من التتبعات السريعة السليمة). يجب أن يعمل في وضع البوابة حتى يتمكن المُجمِّع من تخزين جميع امتدادات التتبع قبل اتخاذ القرار. هذا أكثر المُعالِجات قوةً تشغيلياً.spanmetrics(connector وليس processor) — يشتق مقاييس RED (المعدل، ومعدل الخطأ، ومدرج تكراري للمدة) مباشرةً من امتدادات التتبع دون أدوات قياس إضافية في التطبيق. يُصدرtraces_spanmetrics_calls_totalوtraces_spanmetrics_duration_milliseconds. هكذا تحصل الفرق الكبيرة على مقاييس مستوى الخدمة مجاناً من خط أنابيب التتبع.
otelcol validate --config otelcol-config.yaml محلياً أو في CI. سيخرج المُجمِّع برسالة خطأ واضحة في حالة الأخطاء الإملائية أو أسماء المكونات غير المعروفة أو أخطاء توصيل خط الأنابيب. إضافة هذه الخطوة إلى CI يمنع طرح خط أنابيب معطوب إلى الإنتاج — المُجمِّع المُهيَّأ بشكل خاطئ يُسقط جميع بيانات القياس بصمت، وقد لا تكتشف ذلك إلا أثناء حادثة حين تبحث عن التتبعات.
مُجمِّع OpenTelemetry خادع في بساطته — ثنائي واحد وملف YAML — وبالغ القوة عند تشغيله على نطاق واسع. إتقان سلسلة المُعالِجات وتوبولوجي النشر هو مهارة DevOps جوهرية: هو الفارق بين منظومة مراقبة تتدهور تحت الحمل وأخرى تظل المصدر الأخير الموثوق للحقيقة في اللحظة التي تحتاجها فيها أشد ما يكون.