مقدمة: من الفحص الصحي الأساسي إلى المراقبة العميقة
\nالمراقبة الأساسية لتطبيقات PHP، والتي تشمل التحقق من التوفر (healthcheck) وحمل وحدة المعالجة المركزية (CPU)، هي الحد الأدنى الذي يجب إعداده أولاً. ومع ذلك، بالنسبة لأنظمة الإنتاج ذات الأحمال العالية والمنطق التجاري المعقد، فإن هذا غير كافٍ. المراقبة المتقدمة تحول التركيز من "حي/ميت" إلى المراقبة العميقة (observability) وتسمح بالإجابة على أسئلة مثل: "لماذا انخفض معدل التحويل؟"، "أي نقطة نهاية تحديدًا تسببت في التباطؤ؟"، "كم عدد المستخدمين الذين لم يتمكنوا من إتمام عملية الدفع؟".
\nفي هذه المقالة، سنناقش بنية المراقبة المتقدمة لتطبيقات PHP، ونتعلم كيفية جمع المقاييس المخصصة (بما في ذلك مقاييس الأعمال)، وإعداد التنبيهات بناءً على الحالات الشاذة، ودمج كل شيء في لوحة Grafana واحدة. جميع أمثلة الكود مكتوبة بلغة PHP وجاهزة للتطبيق.
\n\n1. بنية جمع المقاييس: Prometheus والمصدرون المخصصون
\nالمعيار الفعلي الحديث لجمع المقاييس هو Prometheus مع نموذج السحب (pull). تطبيق PHP ليس ملزمًا بتقديم المقاييس مباشرة على منفذ /metrics. بدلاً من ذلك، نستخدم مصدرًا مخصصًا (custom exporter) - وهو سكريبت منفصل يستعلم التطبيق (عبر Redis أو قاعدة البيانات أو ملف) ويشكل استجابة بتنسيق Prometheus.
\n\n1.1. تثبيت عميل Prometheus لـ PHP
\nالمكتبة الموصى بها هي promphp/prometheus_client_php. التثبيت عبر Composer:
composer require promphp/prometheus_client_php\n\n1.2. مثال لمصدر المقاييس (metrics.php)
\nلننشئ سكريبتًا يعيد المقاييس بتنسيق Prometheus. للتخزين، نستخدم Redis (العلم PERSISTENT للإنتاج).
<?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.
2. مقاييس الأعمال: مراقبة ما هو مهم حقًا
\nالمقاييس التقنية (زمن الاستجابة، معدل الأخطاء) هي الأساس، لكن مقاييس الأعمال تعطي فهمًا لصحة المنتج. أمثلة على هذه المقاييس:
\n- \n
- عدد الطلبات الناجحة في الدقيقة - الانخفاض يشير إلى مشاكل في بوابة الدفع. \n
- متوسط وقت تنفيذ سلة التسوق - الزيادة قد تشير إلى تراجع في الأداء في الكود. \n
- نسبة التخلي عن التسجيل - إذا ارتفعت فجأة، فربما تعطل النموذج. \n
2.1. دمج مقاييس الأعمال في كود التطبيق
\nنستخدم نفس prometheus_client_php، لكن نغلف الاستدعاءات في middleware أو طبقة الخدمة. مثال لـ Laravel:
<?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