لو عندك 12 خدمة شغّالة في الإنتاج، وكل ما طلب يفشل بتقعد ساعتين تقفز بين 5 dashboards علشان توصل لمين بالظبط اتسبّب في الخطأ، إنت محتاج تحوّل الـ logs المتفرّقة لـ trace واحد بيمشي عبر كل الخدمات. OpenTelemetry بيعمل ده في 30 دقيقة، وبيخلّيك تنقل بين Datadog و Jaeger و Grafana Tempo بدون ما تعدّل سطر واحد من كود التطبيق.
OpenTelemetry: المعيار اللي بيوحّد Traces و Metrics و Logs في SDK واحد
المشكلة باختصار
تخيّل dashboards عندك كده: AWS CloudWatch لـ logs، Prometheus لـ metrics، Jaeger لـ traces. كل خدمة جديدة بتيجي مع SDK مختلف، وكل tool بياخد بيانات بصيغة مختلفة. لمّا الفاتورة الشهرية لـ Datadog تتجاوز 4,800 دولار وتقرّر تنقل لحل أرخص، تكتشف إن نص الـ instrumentation الـ vendor-specific لازم تعيد كتابته من الأول.
الـ vendor lock-in هنا مش بس فلوس. هو لحظة بطء في كل قرار تقني، وفي وقت الأزمات بيخلّيك مكبّل.
مثال بسيط للمبتدئ: زي طلب الديليفري
تخيّل إنك طلبت عشاء من تطبيق ديليفري. الطلب بيمر بـ 5 محطّات: التطبيق الموبايل ← خدمة الدفع ← بنك المعاملات ← المطعم ← السائق. لو وصلك العشاء بارد، إنت عايز تعرف فين بالظبط حصل التأخير. هل البنك أخد 8 ثواني يأكّد الدفع؟ ولا المطعم استلم الطلب متأخر؟ ولا السائق لف 20 دقيقة في الزحمة؟
بدون نظام يربط الخطوات الخمس ببعض، إنت بتفتح 5 سجلات منفصلة وتحاول تطابق الأوقات يدوياً. مع نظام Distributed Tracing، كل طلب بياخد رقم تعريفي فريد، وكل محطة بتسجّل وقت دخول وخروج الطلب بنفس الرقم. تفتح dashboard واحد، وتشوف خط زمني كامل بيقولك بالظبط الخدمة اللي ضيّعت 3.2 ثانية.
التعريف العلمي الدقيق
OpenTelemetry (اختصارها OTel) هي مواصفة CNCF graduated من 2024 بتوحّد ثلاث أنواع بيانات تحت SDK واحد: traces, metrics, logs. المواصفة مبنية على ورقة Dapper من Google 2010 اللي عرّفت أساسيات الـ tracing الموزّع، وعلى W3C Trace Context spec اللي بيحدّد ازاي الـ trace_id بينتقل بين الخدمات في HTTP headers تحت اسم traceparent.
الـ SDK بيكتب البيانات بصيغة OTLP (OpenTelemetry Protocol)، ويبعتها لـ Collector عبر gRPC أو HTTP. الـ Collector بيعمل buffering و sampling ثم يوزّع البيانات على أي backend: Datadog، Jaeger، Honeycomb، Grafana Tempo، Splunk، Elastic. لمّا تقرّر تنقل من Datadog لـ Tempo، بتغيّر سطر واحد في إعداد الـ Collector فقط، وكود التطبيق ميتلمسش.
الحل في 60 سطر: Instrumentation كامل لخدمة Node.js
- ركّب SDK والـ instrumentation packages.
- ابدأ بـ auto-instrumentation للمكتبات الشائعة (Express، Fastify، PostgreSQL، Redis، AWS SDK).
- أضف custom spans للـ business logic المهم اللي مش مغطى auto.
- شغّل OTel Collector محلياً ووجّه البيانات لـ backend واحد على الأقل.