logbrew-flask 0.1.6 أو أحدث. فهو يلتقط Spans الطلبات والاستثناءات غير
المعالَجة. ويربط معالج السجلات الاختياري سجلات Python بتتبّع الطلب. ومقاييس مدة
الطلبات اختيارية أيضًا.
تتطلب الحزمة Python 3.10 أو أحدث وFlask 3.1 أو أحدث.
استخدم في التطبيق مفتاح استيعاب للخادم خاصًا بالمشروع. لا تستخدم بيانات اعتماد
الحساب التي تأذن للـ CLI.
<project_id> و<trace_id> و<issue_id> بمعرّفات من LogBrew. استخدم
مشروعًا للتطوير في الطلبات التجريبية. تستخدم أمثلة الطرفية Bash.
أرسل الطلب الأول
1
أنشئ مفتاحًا للمشروع أو اختره
سجّل الدخول باستخدام الـ CLI. ثم استخدم مشروعًا جديدًا أو
مشروعًا موجودًا. لا تشغّل المثالين كليهما. للمشروع الجديد، خزّن مفتاح
الاستيعاب الخاص به في ملف جديد لا يقرؤه إلا مالكه:للمشروع الموجود، احصل على معرّفه من يخزّن الـ CLI مفتاح الاستيعاب بصلاحيات تقصر الوصول على المالك. ولا يطبع
المفتاح ولا مسار ملفه. في بيئة الإنتاج، استخدم مدير الأسرار في منصة النشر
لديك بدلًا من هذا الملف المحلي.إذا كانت نتيجة طلب الإنشاء غير مؤكدة، فشغّل الأمر نفسه تمامًا مرة أخرى.
logbrew projects --json. ثم أنشئ
مفتاحًا منفصلًا للخادم:2
ثبّت التكامل المنشور
أنشئ البيئة الافتراضية للتطبيق أو فعّلها، ثم ثبّت حزمة إطار العمل. فهي تثبّت
حزمة الـ SDK الأساسية المتوافقة بوصفها اعتمادية.
3
اضبط هوية النشر
حمّل مفتاح المشروع محليًا دون أن تطبعه. اضبط خدمة وبيئة وإصدارًا ثابتة حتى
تحمل كل إشارة سياق نشر مفيدًا.يفحص
init_logbrew() الوسيطات الصريحة أولًا، ثم إعدادات تطبيق Flask، ثم
متغيرات البيئة هذه. إذا لم يُضبط اسم للخدمة، فإنه يستخدم اسم الاستيراد في
Flask.4
هيّئ Flask مرة واحدة
لتطبيق جديد، احفظ المثال باسم تُرجع الاستدعاءات المتكررة لـ
app.py. أضف المُهيّئ بعد أن تنشئ تطبيق
Flask. معالج السجلات اختياري. وهو يسمح لسجلات التطبيق بمشاركة تتبّع الطلب
النشط والـ Span النشط.init_logbrew(app) امتداد Flask نفسه. ولا
تثبّت خطافات مكررة للطلبات أو الاستثناءات. لا يضيف المُهيّئ معالجات سجلات.
أضف المعالج إلى المسجِّل (logger) الذي يملكه التطبيق مرة واحدة.5
شغّل طلبًا واحدًا
شغّل التطبيق واستدعِ المسار من طرفية أخرى. استبدل يجري الإرسال في عامل في الخلفية، ولا يُبقي الاستجابة مفتوحة.
app في الأمر إذا كان
تطبيقك يستخدم اسم وحدة مختلفًا.6
تحقّق من الأدلة المستضافة
اقرأ نطاق المشروع والنشر نفسه تمامًا. ابحث عن تتبّع طلب فحص السلامة وعن السجل
المرتبط به الصادر عن معالج السجلات في المثال.انسخ معرّف التتبّع المُرجَع إلى أمر التحقيق المحدود:القراءة المطابقة تؤكد أن LogBrew خزّن الإشارة. أما الاستجابة المحلية
200
فلا تُثبت إلا أن Flask عالج الطلب.اختر الإشارات التي تحتاجها
يبدأ المُهيّئ وقد فُعّلت تتبّعات الطلبات والاستثناءات غير المعالَجة. أما مقاييس الطلبات وتمرير سجلات Python فخياران منفصلان.
ابدأ بالإعدادات الافتراضية. أضف مقاييس الطلبات عندما تحتاج إلى عرض لزمن
الاستجابة. ولا تضف معالج السجلات إلا إلى المسجِّلات التي تفيد التحقيق.
افتراضيًا، يملك المُهيّئ وسيلة نقل HTTP. فهو يضع كل حدث في طابور، ويبدأ عامل
في الخلفية الإرسال بمجرد وجود حدث واحد في القائمة. لا يُبقي الإرسال الاستجابة
مفتوحة. ولا تُفسد إخفاقات النقل استجابة Flask.
يرسل
flush_on_response=True الأحداث المنتظرة في مسار الاستجابة بدلًا من ذلك.
ومع هذا الخيار، يرفع raise_flush_errors=True أخطاء الإرسال. لا تستخدم الخيارين
إلا لتشخيص مضبوط.
تحكّم في محتوى السجلات
أضفLogBrewLoggingHandler واحدًا إلى المسجِّل الذي يملك الرسائل التي تحتاجها.
لا يحل المعالج محل معالجات وحدة التحكم أو الملفات في التطبيق. ولا يعدّل Flask أو
وحدة السجلات في Python. إضافة المعالج نفسه مرتين تكرّر السجلات. إذا كان التطبيق
يستخدم المسجِّل الجذري أيضًا، فتحقّق من انتشار السجلات (propagation) قبل أن ترفق
معالجًا ثانيًا.
يرث السجل داخل الطلب التتبّع والـ Span النشطين. أما السجل خارج الطلب فليس له تتبّع
طلب.
يرسل المعالج الرسالة المنسَّقة واسم المسجِّل ومستوى LogBrew. ويرسل أيضًا اسم
الملف المصدري، والوحدة، والدالة، والسطر، وأسماء الخيط والعملية، لكن ليس المسار
المصدري الكامل. تصبح القيم البسيطة من extra={...} بيانات وصفية. راجع هذه القيم
قبل أن تسجّل من طلب يواجه المستخدم.
تصبح قيود Python بالمستوى DEBUG بالمستوى info في LogBrew. ويصبح WARNING
warning، ويصبح CRITICAL critical. ويبقى اسم مستوى Python الأصلي ورقمه في
البيانات الوصفية. لإرسال قيود أقل، امنح المعالج مستواه الخاص، مثل
LogBrewLoggingHandler(logbrew.client, level=logging.WARNING).
يمكن أن تستقبل وحدة التحكم وLogBrew القيد نفسه. مثلًا، اضبط وحدة التحكم قبل أن
تنشئ تطبيق Flask:
exc_info نوع الاستثناء ورسالته. ولا يُرسَل نص
الاستثناء الكامل إلا عندما يحمل المعالج include_exception_text=True. وهذا منفصل
عن الالتقاط التلقائي للاستثناءات، الذي لا يرسل رسالة الاستثناء أبدًا. لا تضع
بيانات الاعتماد أو البيانات الشخصية أو نصوص الطلبات في رسائل السجلات أو
الاستثناءات.
ما يلتقطه التكامل
تستخدم أسماء الـ Spans طريقة HTTP وقالب المسار المطابق. مثلًا، يشترك
/orders/100 و/orders/200 في GET /orders/<int:order_id>. ويستخدم الطلب غير
المطابق التسمية الثابتة <unmatched>. ويبدأ traceparent المفقود أو غير الصالح
تتبّعًا جديدًا.
تحتوي البيانات الوصفية للـ Span على الطريقة وقالب المسار ونقطة النهاية ورمز الحالة
والمدة. ولا تحتوي على المسار الفعلي أو سلسلة الاستعلام.
في الإصدار 0.1.6 والأحدث، يغطي Span الطلب عملية التوجيه الكاملة في Flask. وتشترك
خطافات ما قبل الطلب ومعالجات الأخطاء وخطافات الإنهاء (teardown) في تتبّع الطلب.
وتنهي الاستجابة المتدفقة الـ Span الخاص بها عندما ينتهي نص الاستجابة أو يُغلق.
اختبر التقاط الاستثناءات
تظهر الحالة4xx أو 5xx على Span الطلب. والحالة وحدها لا تُثبت أن استثناءً وقع.
اقرأ التتبّعات والمشكلات كلتيهما قبل أن تشخّص الإخفاق. لا يحل LogBrew محل معالجات
الأخطاء في Flask، ولا يغيّر حالة الاستجابة.
في مشروع للتطوير، أضف مسارًا مؤقتًا. استدعه مرة واحدة. أزِله قبل أن تنشر:
500. اعثر على المشكلة الجديدة ومقياس الطلب:
local capture check.
اربط العمل الصادر بالطلب
يحتوي SDK الخاص بـ Python على دوال مساعدة يملكها التطبيق لعملياتrequests
وurllib وhttpx وaiohttp وقواعد البيانات وذاكرة التخزين المؤقت وقوائم
الانتظار. تنشئ كل دالة مساعدة Span فرعيًا لتتبّع الطلب النشط. ولا يعدّل الـ SDK
هذه المكتبات على المستوى العام. وتعرض
حزمة logbrew-flask أمثلة على ذلك.
امنح كل دالة مساعدة اسم عملية ثابتًا وقالبًا للمسار أو للاستعلام. لا تضع في هذه
الأسماء معرّفات القيود أو قيم العملاء أو قيم الربط في SQL أو حمولات الرسائل. لا
تضف Spans فرعية إلا حيث تهم الاعتمادية للطلب. فإنشاء Span لكل استدعاء صغير يجعل
قراءة التتبّع أصعب. تضيف الدوال المساعدة لطلبات HTTP الصادرة ترويسة traceparent
واحدة بمعيار W3C. ولا تلتقط عناوين URL الكاملة أو سلاسل الاستعلام أو نصوص الطلبات أو
ملفات تعريف الارتباط أو الترويسات العشوائية. ولا تلتقط الدوال المساعدة لقواعد
البيانات وذاكرة التخزين المؤقت والطوابير قيم الربط أو النتائج أو القيم
المخزّنة مؤقتًا أو حمولات الطوابير.
الخصوصية ودورة حياة العملية
يحذف الالتقاط التلقائي في Flask مسارات الطلبات الفعلية، وسلاسل الاستعلام، ونصوص الطلبات والاستجابات، وملفات تعريف الارتباط، والترويسات العشوائية، وقيمtraceparent الخام، وbaggage، وtracestate.
لا يقرأ الالتقاط التلقائي للاستثناءات str(error) ولا يرسله أبدًا. فهو يستخدم
الملخص الثابت Unhandled exception، ويضع على كل رسالة في سلسلة الاستثناءات علامة
«محجوب». تحتوي الإطارات على الاسم الأساسي للملف وهوية محدودة للشيفرة. ولا تحتوي
على نص traceback الخام أو الشيفرة المصدرية أو المتغيرات المحلية أو المسارات
المطلقة.
أنشئ التطبيق وعميل LogBrew داخل كل عملية عامل. يعمل التحميل الافتراضي للتطبيق لكل
عامل في Gunicorn. لا تستخدم --preload في Gunicorn مع عميل أُنشئ في العملية
الأم. وفي uWSGI، استخدم تحميل التطبيق لكل عامل، مثل --lazy-apps. يرفض عميل
Python إعادة استخدامه بعد تفرّع العملية (fork).
استدعِ logbrew.client.shutdown() من خطاف الإيقاف لكل عامل في مدير العمليات.
فهو يرسل الأحداث المتبقية في الطابور ويغلق العميل. لا تستدعه بعد كل طلب.
بعد الإيقاف، يرفض العميل الأحداث الجديدة من ذلك العامل.
قد تنتهي الاستجابة قبل أن يرسل العامل آخر الأحداث في الطابور. أثناء النشر
أو تقليص عدد العمال، يمنح الإيقاف السلس هذه الأحداث محاولة إرسال أخيرة.
الاستعادة من مشكلات الإعداد
لأخطاء الوصول إلى الحساب والمفاتيح وقراءة البيانات المُرسَلة، راجع
استكشاف الأخطاء وإصلاحها. ولبيئات التشغيل الأخرى،
راجع دمج SDK.
