مراقبة تطبيقات PHP: المقاييس والتنبيهات المتقدمة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: من الفحص الصحي الأساسي إلى المراقبة العميقة

\n

المراقبة الأساسية لتطبيقات PHP، والتي تشمل التحقق من التوفر (healthcheck) وحمل وحدة المعالجة المركزية (CPU)، هي الحد الأدنى الذي يجب إعداده أولاً. ومع ذلك، بالنسبة لأنظمة الإنتاج ذات الأحمال العالية والمنطق التجاري المعقد، فإن هذا غير كافٍ. المراقبة المتقدمة تحول التركيز من "حي/ميت" إلى المراقبة العميقة (observability) وتسمح بالإجابة على أسئلة مثل: "لماذا انخفض معدل التحويل؟"، "أي نقطة نهاية تحديدًا تسببت في التباطؤ؟"، "كم عدد المستخدمين الذين لم يتمكنوا من إتمام عملية الدفع؟".

\n

في هذه المقالة، سنناقش بنية المراقبة المتقدمة لتطبيقات PHP، ونتعلم كيفية جمع المقاييس المخصصة (بما في ذلك مقاييس الأعمال)، وإعداد التنبيهات بناءً على الحالات الشاذة، ودمج كل شيء في لوحة Grafana واحدة. جميع أمثلة الكود مكتوبة بلغة PHP وجاهزة للتطبيق.

\n\n

1. بنية جمع المقاييس: Prometheus والمصدرون المخصصون

\n

المعيار الفعلي الحديث لجمع المقاييس هو Prometheus مع نموذج السحب (pull). تطبيق PHP ليس ملزمًا بتقديم المقاييس مباشرة على منفذ /metrics. بدلاً من ذلك، نستخدم مصدرًا مخصصًا (custom exporter) - وهو سكريبت منفصل يستعلم التطبيق (عبر Redis أو قاعدة البيانات أو ملف) ويشكل استجابة بتنسيق Prometheus.

\n\n

1.1. تثبيت عميل Prometheus لـ PHP

\n

المكتبة الموصى بها هي promphp/prometheus_client_php. التثبيت عبر Composer:

\n
composer require promphp/prometheus_client_php
\n\n

1.2. مثال لمصدر المقاييس (metrics.php)

\n

لننشئ سكريبتًا يعيد المقاييس بتنسيق Prometheus. للتخزين، نستخدم Redis (العلم PERSISTENT للإنتاج).

\n
<?php\nrequire 'vendor/autoload.php';\n\nuse Prometheus\\CollectorRegistry;\nuse Prometheus\\Storage\\Redis;\nuse Prometheus\\RenderTextFormat;\n\n// الاتصال بـ Redis\nRedis::setDefaultOptions(['host' => '127.0.0.1', 'port' => 6379]);\n$registry = new CollectorRegistry(new Redis());\n\n// تسجيل مدرج تكراري لوقت الاستجابة\n$histogram = $registry->getOrRegisterHistogram(\n    'app_http_request_duration_seconds',\n    'HTTP request duration in seconds',\n    ['method', 'endpoint', 'status']\n);\n\n// تسجيل عداد لمقياس الأعمال\n$counter = $registry->getOrRegisterCounter(\n    'app_orders_total',\n    'Total number of orders processed',\n    ['status'] // success, failed\n);\n\n// محاكاة البيانات (في الواقع، نقرأ من قاعدة البيانات أو السجلات)\n$histogram->observe(0.12, ['GET', '/api/orders', '200']);\n$counter->incBy(1, ['success']);\n\n// إخراج المقاييس\n$renderer = new RenderTextFormat();\nheader('Content-Type: text/plain');\necho $renderer->render($registry->getMetricFamilySamples());\n
\n

ثم نقوم بإعداد Nginx أو Apache لجعل هذا السكريبت متاحًا عبر المسار /metrics، ونضيف الهدف (target) في Prometheus.

\n\n

2. مقاييس الأعمال: مراقبة ما هو مهم حقًا

\n

المقاييس التقنية (زمن الاستجابة، معدل الأخطاء) هي الأساس، لكن مقاييس الأعمال تعطي فهمًا لصحة المنتج. أمثلة على هذه المقاييس:

\n
    \n
  • عدد الطلبات الناجحة في الدقيقة - الانخفاض يشير إلى مشاكل في بوابة الدفع.
  • \n
  • متوسط وقت تنفيذ سلة التسوق - الزيادة قد تشير إلى تراجع في الأداء في الكود.
  • \n
  • نسبة التخلي عن التسجيل - إذا ارتفعت فجأة، فربما تعطل النموذج.
  • \n
\n\n

2.1. دمج مقاييس الأعمال في كود التطبيق

\n

نستخدم نفس prometheus_client_php، لكن نغلف الاستدعاءات في middleware أو طبقة الخدمة. مثال لـ Laravel:

\n
<?php\nnamespace App\\Http\\Middleware;\n\nuse Closure;\nuse Prometheus\\CollectorRegistry;\n\nclass MetricsMiddleware\n{\n    protected $registry;\n\n    public function __construct(CollectorRegistry $registry)\n    {\n        $this->registry = $registry;\n    }\n\n    publi                

المدونات

توصيات الكتب