مراقبة وتتبع الأخطاء في تطبيقات بايثون باستخدام Sentry

مراقبة وتتبع الأخطاء في تطبيقات بايثون باستخدام Sentry: دليل عملي شامل

إذا كنت تبني تطبيقات بايثون أو Django على بيئة إنتاج (Production)، فمجرد ظهور Traceback في الـConsole لم يعد كافيًا. تحتاج إلى أداة مركزية تجمع الأخطاء، تحللها، تربطها بسلوك المستخدم، وتخبرك فورًا عند حدوث مشكلة. هنا يأتي دور Sentry كواحدة من أقوى منصات مراقبة أخطاء Sentry Python وتتبع الأداء (APM).

في هذا المقال من افهم صح سنشرح خطوة بخطوة:

  • ما هو Sentry ولماذا تحتاجه في تطبيقات بايثون وDjango؟
  • كيفية إعداد Sentry في بايثون ودمجه مع Django.
  • تصنيف الأخطاء وعرض الـ Stack Trace.
  • إعداد التنبيهات Notifications بطريقة ذكية.
  • مراقبة الأداء (Performance Monitoring) وتحسين سرعة التطبيق.
  • أفضل الممارسات لتقليل الضوضاء والاستفادة القصوى من Sentry.

ما هو Sentry ولماذا هو مهم لمطوري بايثون؟

Sentry منصة سحابية (مع إمكانية تثبيتها ذاتيًا Self-Hosted) متخصصة في:

  • تتبع الأخطاء (Error Tracking) في الوقت الفعلي.
  • تجميع (Grouping) الأخطاء المتشابهة في Issue واحد.
  • عرض تفاصيل دقيقة عن الخطأ: Stack Trace، المتغيرات، Request Data، المستخدم، النسخة (Release)…
  • مراقبة الأداء (APM): زمن الاستجابة، البطء في الاستعلامات، عنق الزجاجة في الكود.
  • إرسال تنبيهات عبر البريد، Slack، Webhook… عند حدوث مشاكل مهمة.

بدلًا من انتظار المستخدمين ليبلغوك عن خطأ بشكل غامض، يقوم Sentry بالتقاط الاستثناء (Exception) لحظة حدوثه، مع كامل التفاصيل اللازمة لإصلاحه بسرعة.

إذا كنت مهتمًا بتحسين جودة كودك في بايثون، يمكنك أيضًا الاطلاع على: أهم الأخطاء الشائعة في بايثون التي يرتكبها المطورون الجدد.

تهيئة مشروعك في Sentry والحصول على DSN

قبل دمج Sentry مع تطبيق بايثون أو Django، تحتاج إلى:

  1. إنشاء حساب في Sentry (الخطة المجانية تكفي للبداية).
  2. إنشاء Project جديد واختيار منصة Python أو Django.
  3. الحصول على DSN (Data Source Name) وهو عبارة عن رابط يمثل Credential لربط تطبيقك بالمشروع في Sentry.

الـ DSN سيكون بالشكل (تقريبي):

https://<PUBLIC_KEY>@o<ORG_ID>.ingest.sentry.io/<PROJECT_ID>

من الأفضل تخزين الـ DSN في متغير بيئة Environment Variable مثل:

SENTRY_DSN="https://..."

إعداد Sentry في تطبيق بايثون عادي (بدون Framework)

إذا كان لديك سكربت بايثون أو خدمة (Service) بسيطة تريد مراقبتها، يمكنك استخدام حزمة sentry-sdk.

1. تثبيت مكتبة Sentry SDK

باستخدام pip:

pip install --upgrade sentry-sdk

2. تهيئة Sentry في بداية البرنامج

في ملف main.py أو نقطة دخول التطبيق:

import os
import sentry_sdk

sentry_sdk.init(
dsn=os.getenv("SENTRY_DSN"),
traces_sample_rate=0.2, # نسبة تتبع الأداء (0 إلى 1)
environment="production",
release="[email protected]",
)

def divide(a, b):
return a / b

if __name__ == "__main__":
# خطأ متعمد لاختبار Sentry
divide(10, 0)

عند تشغيل السكربت سيتسبب القسمة على صفر في Exception سيتم إرساله مباشرة إلى مشروعك في Sentry، حيث يمكنك مشاهدة:

  • اسم الخطأ (ZeroDivisionError)
  • الملف والدالة ورقم السطر
  • Stack Trace كامل

دمج Sentry مع Django: التتبع المتكامل للأخطاء والأداء

مع Django، التكامل أعمق لأن Sentry يدعم:

  • التقاط الأخطاء على مستوى الـ Views والـ Middleware.
  • جمع معلومات الطلب (Request): URL, Method, Headers, User.
  • تحليل أداء الـ Views والاستعلامات في ORM.

1. تثبيت وإعداد Sentry في Django

قم بالتثبيت:

pip install --upgrade sentry-sdk[django]

ثم في settings.py:

import os
import sentry_sdk
from sentry_sdk.integrations.django import DjangoIntegration

sentry_sdk.init(
dsn=os.getenv("SENTRY_DSN"),
integrations=[DjangoIntegration()],
traces_sample_rate=0.3, # تتبع 30% من الطلبات لتحليل الأداء
send_default_pii=True, # يرسل بيانات المستخدم (اختياري – انتبه للخصوصية)
environment="production",
release="[email protected]",
)

يفضل وضع هذا الكود في أعلى ملف settings.py بعد ضبط متغيرات البيئة، أو في ملف إعدادات منفصل يتم استيراده في بيئة الإنتاج فقط.

2. اختبار التقاط الأخطاء في Django

يمكنك إضافة View لاختبار Sentry:

from django.http import HttpResponse

def trigger_error(request):
division_by_zero = 1 / 0
return HttpResponse("This will never be reached")

ثم أضف المسار في urls.py وادخل على الرابط في المتصفح. يجب أن يظهر الخطأ في لوحة تحكم Sentry خلال ثواني.

فهم واجهة Sentry: Issues، Events و Stack Traces

بعد إرسال أول خطأ، ستشاهد في لوحة التحكم:

  • Issues: كل نوع خطأ يتم تجميعه في بطاقة واحدة، مثل ZeroDivisionError أو IntegrityError.
  • Events: كل حدث (Occurrence) للخطأ نفسه، مع بياناته الخاصة (من أي مستخدم؟ من أي Endpoint؟).
  • Stack Trace: المسار الذي مر به التنفيذ حتى وصل إلى الاستثناء.

قراءة Stack Trace بفعالية

الـ Stack Trace في Sentry يعرض:

  • الملف (File)
  • رقم السطر (Line Number)
  • اسم الدالة أو الـ View
  • الكود المصدر في هذا السطر

حاول التركيز على أول Frame يخص كودك أنت (وليس مكتبات الطرف الثالث). في Sentry يمكنك تمييز كودك على أنه In-App ليظهر بشكل أوضح.

تصنيف الأخطاء وإدارتها داخل Sentry

للاستفادة القصوى من مراقبة أخطاء Sentry Python، يجب أن تتعامل مع Issues بشكل منظم:

  • Resolve: عند إصلاح المشكلة في الكود وطرح إصدار جديد، قم بتعليم الـ Issue كـ Resolved.
  • Ignore: تجاهل الأخطاء غير المهمة أو المتوقعة (مثلاً محاولات Bot لروابط غير موجودة).
  • Assign: يمكنك تعيين الخطأ لمطور معين في الفريق.
  • Tags: إضافة وسوم مثل module:payments أو severity:high لسهولة الفلترة.

يمكنك أيضًا استخدام Breadcrumbs، وهي سجل للأحداث التي حدثت قبل الاستثناء (Logs، Requests أخرى، استدعاءات وظائف) لتفهم تسلسل الأحداث الذي أدى إلى الخطأ.

إعداد التنبيهات الذكية في Sentry

التنبيهات (Alerts) جزء مهم من المنظومة: لا تريد أن تمتلئ بريدك بالإشعارات لكل Exception بسيط، لكن في نفس الوقت تحتاج تنبيه فوري عند وجود خطأ حاد يؤثر على المستخدمين.

أمثلة لقواعد تنبيه عملية

  • إرسال بريد عند ظهور Issue جديد لأول مرة.
  • تنبيه Slack إذا تجاوز عدد الأحداث من Issue معين عددًا معينًا خلال فترة زمنية.
  • إرسال Webhook إلى نظام مراقبة آخر عند حدوث Error من نوع معين (مثلاً أخطاء الدفع).

يمكنك ضبط هذه القواعد من تبويب Alerts داخل المشروع في Sentry، واستخدام Conditions مثل:

  • Level >= Error
  • Environment = production
  • Event attributes contain tag: payment

مراقبة الأداء (APM) في Sentry لتطبيقات بايثون وDjango

إلى جانب مراقبة الأخطاء، يقدم Sentry أيضًا Performance Monitoring الذي يسمح لك بـ:

  • قياس زمن استجابة الـ Views أو الـ Endpoints.
  • اكتشاف الاستعلامات البطيئة في قاعدة البيانات.
  • تحديد عنق الزجاجة في الكود (Functions أو Blocks بطيئة).

لقد فعلنا تتبع الأداء مسبقًا بإعداد traces_sample_rate في sentry_sdk.init. يمكنك التحكم في:

  • العينة (Sampling): لا يُنصح بإرسال 100% من الطلبات، يكفي 10–30% في كثير من الحالات.
  • البيئة: غالبًا تريد تفعيل تتبع الأداء في staging وproduction فقط.

تتبع معاملات (Transactions) مخصصة في بايثون

يمكنك إنشاء Transaction يدويًا حول جزء معين من الكود تريد تحليله:

import sentry_sdk

with sentry_sdk.start_transaction(name="data_import_job"):
run_heavy_import()

سيسمح لك هذا برؤية زمن التنفيذ، وتقسيمه إلى Spans فرعية إذا استخدمت Integrations إضافية (مثل Requests أو SQLAlchemy).

للمزيد عن تحسين الأداء في العالم غير المتزامن، يمكن الرجوع إلى:
البرمجة غير المتزامنة في بايثون: تحسين الأداء باستخدام async و await.

تخصيص البيانات المرسلة إلى Sentry

أحيانًا تحتاج لإرسال معلومات إضافية تساعدك في تحليل الخطأ، مثل ID المستخدم في النظام الخارجي، أو حالة سلة الشراء. يمكن عمل ذلك عبر:

1. إضافة Context مخصص

مثال في بايثون:

import sentry_sdk

sentry_sdk.set_context("cart", {
"items_count": 3,
"total_price": 120.5,
})

2. إضافة Tags

الـ Tags مفيدة للفصل بين أنواع الأخطاء:

sentry_sdk.set_tag("module", "checkout")
sentry_sdk.set_tag("region", "sa")

3. ربط المستخدم (User)

في Django، يمكن ربط مستخدم Auth الحالي تلقائيًا عند تفعيل send_default_pii=True. أو يمكنك ضبطه يدويًا:

from sentry_sdk import set_user

set_user({
"id": request.user.id,
"email": request.user.email
})

كن حذرًا من إرسال أي بيانات حساسة (Passwords، Tokens، أرقام بطاقات) إلى Sentry، حفاظًا على الخصوصية والالتزام بالسياسات.

أفضل الممارسات لاستخدام Sentry مع بايثون وDjango

  • استخدم بيئات (Environments) مختلفة: production، staging، development لفصل الأخطاء.
  • اضبط الـ Sampling بعناية: لتقليل استهلاك الكوتا والضوضاء.
  • قم بربط الإصدارات (Releases): حتى تعرف هل ظهر الخطأ بعد إصدار معين من التطبيق.
  • ادمج Sentry مع نظام الـ Logging: مثل logging في بايثون لالتقاط الرسائل المهمة.
  • عيّن مسؤول لكل Module أو Service: باستخدام ميزة Ownership في Sentry.
  • تجاهل الاستثناءات المتوقعة: مثل 404 الناتج عن Bots، أو Requests معطوبة من مصادر معروفة.

لتحسين جودة كود Django وأمانه، يمكنك مراجعة:
أهم ممارسات الأمن السيبراني في بناء تطبيقات باستخدام جانقو.

دمج Sentry مع أدوات وبرامج أخرى

Sentry لا يعمل في عزلة، بل يمكن دمجه مع:

  • GitHub / GitLab / Bitbucket: لربط الأخطاء بالكوميت أو الـ Pull Request.
  • Jira, Trello: لإنشاء تذاكر Tasks مباشرة من الـ Issue.
  • Slack / Microsoft Teams: لاستقبال التنبيهات في قنوات الفريق.
  • CI/CD: لتحديث Releases تلقائيًا عند كل نشر (Deploy).

هذا التكامل يساعدك على جعل مراقبة أخطاء Sentry Python جزءًا من دورة التطوير DevOps بالكامل، وليس مجرد نظام إشعارات منفصل.

خاتمة

استخدام Sentry مع تطبيقات بايثون وDjango يختصر الكثير من الوقت والجهد في:

  • كشف الأخطاء فور وقوعها.
  • فهم السياق الكامل للـ Exception عبر Stack Traces وBreadcrumbs وContext.
  • تنبيه الفريق المناسب في الوقت المناسب.
  • تحليل الأداء واكتشاف عنق الزجاجة في الكود وقاعدة البيانات.

ابدأ الآن بتجربة الخطة المجانية، قم بإعداد مشروع لـ Django أو بايثون، أضف الـ DSN، واختبر أول خطأ، ثم وسّع الإعدادات تدريجيًا (تنبيهات، Tags، Context، Performance) حتى يصبح Sentry جزءًا أساسيًا من بنية المراقبة في تطبيقاتك.

بهذه الخطوات، تتحول معالجة الأخطاء من رد فعل متأخر إلى نظام مراقبة استباقي يساعدك على تحسين استقرار التطبيق وتجربة المستخدم بشكل مستمر.

حول المحتوى:

كيفية إعداد Sentry لتتبع الأخطاء والأداء في تطبيقات بايثون وDjango: تكامل، تصنيف الأخطاء، إعداد التنبيهات، وتحليل stack traces لحل المشاكل أسرع.

هل كان هذا مفيدًا لك؟

أضف تعليقك