التوصيل باستخدام OTel
التوصيل باستخدام OTel
يمنحك OpenTelemetry مسارَين مختلفَين لإضافة التتبع إلى خدمة ما: التوصيل التلقائي، الذي يعمل دون أي تغيير في الكود، والتوصيل اليدوي، حيث تكتب استدعاءات SDK صريحة لإنشاء الامتدادات وإرفاق السمات وتسجيل الأحداث. في أنظمة الإنتاج بمقياس Google، تستخدم دائمًا تقريبًا الأسلوبَين معًا — التلقائي للأجزاء الروتينية (HTTP وقاعدة البيانات وgRPC)، واليدوي للمنطق التجاري الحرج الذي لا يستطيع الإطار رؤيته. يعلّمك هذا الدرس متى تستخدم كل منهما بالضبط، وكيف تفعل ذلك بالشكل الصحيح.
التوصيل التلقائي: المراقبة بدون تعديل الكود
يعمل التوصيل التلقائي عن طريق تغليف المكتبات المعروفة عند وقت التحميل. يعترض وكيل OTel (JVM، وPython، وNode.js) أو خطافات SDK استدعاءات الأطر الشائعة — Django وFlask وExpress وSpring Boot وgRPC وpsycopg2 وredis-py — وينشئ امتدادات تلقائيًا بإعدادات افتراضية معقولة. تحصل على امتدادات لكل طلب HTTP وكل استعلام DB وكل استدعاء خارجي دون لمس كود التطبيق.
مثال Python — تفعيل التوصيل التلقائي بدون تغيير الكود:
هذا الأمر الواحد يُغلّف العملية. كل مُعالج مسار Flask، وكل استعلام SQLAlchemy، وكل استدعاء Redis يُصدر الآن امتدادات — دون أي تغيير في المصدر. يحقن الوكيل ترويسة traceparent بمعيار W3C في جميع استدعاءات HTTP الصادرة تلقائيًا، مما يضمن انتشار التتبعات عبر حدود الخدمات.
checkout تضمّن طلبًا عالي القيمة، أو أن حالة الفقدان في الذاكرة المؤقتة أطلقت بديلًا مكلفًا. هنا يُثبت التوصيل اليدوي قيمته.
التوصيل اليدوي: توصيف ما يهم
يتيح لك التوصيل اليدوي إنشاء امتدادات لكتل كود اعتباطية، وإرفاق سمات منظمة بتنسيق مفتاح-قيمة، وتسجيل أحداث الامتداد في لحظات زمنية محددة. فكّر في الامتداد كساعة إيقاف حول وحدة من العمل؛ والسمات كتسميات على تلك الساعة؛ والأحداث كملاحظات مؤرّخة تُكتب أثناء دوران العقارب.
إليك مثالًا واقعيًا بلغة Python لدالة معالجة الدفع — النوع من الكود الذي يهم فيه فهم توزيع الكمون فعلًا في الإنتاج:
يمنحك هذا شلالًا من التتبع يُظهر: امتداد payments.process الكامل مع مدة فحص الاحتيال مرئية كفوارق أحداث، وامتداد الطفل المتداخل gateway.charge مع بيانات وصفية خاصة بـ Stripe، وكل سمة متاحة كمرشّح في واجهة Jaeger أو Tempo — إجابة فورية على: "أرِني كل التتبعات التي فيها payment.amount_cents > 100000 وfraud.decision == allow واستغرقت أكثر من ثانيتين."
السمات: التصميم من أجل القابلية للاستعلام
السمات هي جوهر التصحيح القائم على التتبع. يُعرّف OTel اتفاقيات دلالية — مفردات مشتركة تجعل الامتدادات من أي خدمة، بأي لغة، تبدو متماثلة في الخلفية. اتبعها بدقة.
الاتفاقيات الدلالية الأساسية التي يجب حفظها (من opentelemetry-semantic-conventions):
http.request.method، وhttp.response.status_code، وurl.path— امتدادات HTTPdb.system، وdb.name، وdb.operation.name، وdb.query.text— امتدادات قاعدة البياناتmessaging.system، وmessaging.destination.name— Kafka وSQS وRabbitMQrpc.system، وrpc.service، وrpc.method— امتدادات gRPCservice.name، وservice.version، وdeployment.environment— سمات الموارد (تُضبط مرة واحدة، وتُطبَّق على جميع الامتدادات من تلك العملية)
OTEL_RESOURCE_ATTRIBUTES أو فئة SDK المسماة Resource. أما سمات الامتداد فتصف هذه العملية المحددة. لا تكرر أبدًا بيانات الموارد على كل امتداد — فهذا يُضخّم التخزين وهو زائد عن الحاجة لأن الخلفية تربطها تلقائيًا.
أحداث الامتداد مقابل السجلات: النموذج الذهني الصحيح
حدث الامتداد هو إدخال سجل منظّم ومؤرَّخ مرتبط تلقائيًا بالتتبع — تحصل على جدول زمني دقيق لما حدث داخل الامتداد دون الحاجة إلى ربط السجلات يدويًا. استخدم الأحداث لـ: انتقالات الحالة داخل الامتداد، وقرارات الإصابة/الفقدان في الذاكرة المؤقتة، وإعادة المحاولة، ونقاط الفرع الهامة. استخدم سجلًا عاديًا (مع حقن trace_id) للضجيج التشغيلي عالي الحجم الذي لا ينبغي أن يكون جزءًا من حمولة التتبع.
user.id، أو order.id) وابحث عن المعلومات الشخصية بشكل منفصل في قاعدة بيانات التطبيق عند الحاجة. هذا متطلب من متطلبات اللائحة الأوروبية لحماية البيانات GDPR ومتطلب أمني في الوقت ذاته: خلفية التتبع عادةً لديها سطح تحكم وصول أوسع بكثير من قاعدة بيانات الإنتاج.
تهيئة SDK: موفّر التتبع
قبل أن يُصدَر أي امتداد، يجب أن تُهيّئ عمليتك TracerProvider مع مُصدِّر ومورد. افعل هذا مرة واحدة عند بدء التطبيق — في main() الخاص بك، أو نقطة دخول WSGI، أو إقلاع الإطار. في Python مع تصدير OTLP gRPC إلى Collector:
يُخزّن BatchSpanProcessor الامتدادات في الذاكرة ويُفرغها بشكل غير متزامن — الخيار الوحيد الآمن للإنتاج. أما SimpleSpanProcessor المتزامن فيُعيق الخيط الاستدعائي عند كل تصدير ويُستخدم فقط في الاختبارات أو أدوات سطر الأوامر.
تجميع كل شيء: ما تفعله فرق كبرى الشركات فعلًا
في الشركات التي تُشغّل مئات من الخدمات المصغّرة، يكون النمط دائمًا: التوصيل التلقائي يتعامل مع طبقة النقل، والتوصيل اليدوي يُعلّق على العمليات التجارية، ومكتبة داخلية مشتركة تُغلّف تمهيد SDK حتى تُهيَّأ كل خدمة باتساق. تُعرّف الفرق تصنيفًا للسمات على مستوى الشركة بأكملها (مفاتيح user.* وorder.* وpayment.* المعتمدة) يُطبَّق بقواعد lint على استدعاءات التتبع. المهندسون الجدد لا يكتبون استدعاءات OTel SDK الخام — بل يستخدمون الغلاف الداخلي الذي يتضمن بالفعل سمات الموارد الصحيحة، ونقطة نهاية المُصدِّر الصحيحة، وتكوين أخذ العينات الصحيح. هذا الاتساق هو ما يجعل التتبعات مفيدة على نطاق واسع: يمكنك كتابة استعلام Jaeger واحد عبر 300 خدمة والحصول على نتائج متسقة لأن كل امتداد يتبع نفس مخطط السمات.