Distributed Tracing بـ OpenTelemetry: لو الـ API بطيء وأنت مش عارف فين بالظبط
لو عندك خدمة بترد في 8 ثواني والـ logs بتقولك إن كل service شغّال، المشكلة مش في service واحد — هي في التنقل بين 4 خدمات. Distributed tracing بيوريك بالظبط أي خطوة هي السبب، بدون تخمين، وبدون ما تطفّي الـ production علشان تعمل debug.
المشكلة باختصار
في أي نظام فيه أكتر من 3 خدمات بتتكلم مع بعض، الـ logs لوحدها مبتجاوبش على السؤال الأهم: "اللي بطّأ الطلب ده فين بالظبط؟". بتفضل تطابق timestamps يدوي بين 5 ملفات log في 5 سيرفرات، وتخمّن. النتيجة: incident بياخد نص ساعة بدل 5 دقايق، و capacity planning مبني على شعور.
تخيّل الموضوع كده الأول (مثال للمبتدئين)
متخيّل إنك طلبت أكل من تطبيق توصيل. الطلب عدى على 5 محطات: التطبيق، السيرفر، المطعم، السواق، والـ GPS. الأكل وصلك متأخر ساعة، فبتسأل: "اللي تأخر فين؟". لو معندكش طريقة تعرف كل محطة أخدت كام دقيقة، هتفضل تخمّن.
Distributed tracing هو الـ "stopwatch" اللي بيركّب على كل محطة وبيقولك: "السواق صرف 47 دقيقة في الزحمة، المطعم خد 8 دقايق، الباقي ثواني". خلاص عرفت السبب وتقدر تتصرف.
في عالم البرمجيات: الطلب الواحد ممكن يعدي على API gateway، ثم authentication service، ثم database، ثم cache، ثم external API. لو الرد بياخد 2.4 ثانية، Distributed tracing بيوريك "الـ DB أخدت 1.9 ثانية، باقي الخدمات أخدوا 500ms". ركّز على المكان اللي مهم.
المفهوم بشكل دقيق: Span و Trace
Trace هي الرحلة الكاملة لطلب واحد عبر النظام. Span هي وحدة عمل واحدة داخل الرحلة (مثلًا: استعلام DB، استدعاء HTTP، حسبة معينة). كل Span ليه:
- trace_id: رقم موحّد لكل الرحلة بيتمرّر بين الخدمات.
- span_id: رقم الـ unit نفسها.
- parent_span_id: علشان نبني الشجرة.
- start_time / end_time: لقياس المدة.
- attributes: metadata زي اسم الـ DB query أو الـ HTTP status.
الـ trace هي شجرة من الـ spans، والـ visualization المعروف بيظهر كـ "waterfall" — كل عمود بيوريك span، وقت بدايتها، وطولها. لو شفت عمود واحد طويل وسط أعمدة قصيرة، خلاص لقيت الـ bottleneck.
ليه الـ logs لوحدها مش كفاية
الـ logs بتقولك "حصل كذا في الوقت ده". مش بتقولك علاقة الحدث ده بطلب معيّن في خدمة تانية. لو فيه 1000 طلب في الثانية، إزاي تعرف إن log entry في service A جه نتيجة لطلب اتعمل في service B؟ بدون trace_id موحّد بيتمرّر بين الخدمات (اللي اسمه context propagation)، هتقعد ساعات تطابق timestamps. OpenTelemetry بيعمل ده تلقائي في معظم الـ HTTP libraries.