المراقبة المتقدمة لتطبيقات TypeScript: المقاييس والتنبيهات
\nفي التطوير الحديث، تجاوزت المراقبة مجرد التحقق البسيط من "هل الخادم حي؟". بالنسبة لتطبيقات TypeScript التي تعمل في بيئات موزعة معقدة، هناك حاجة إلى نظام متقدم لقابلية الملاحظة. لا يكفي مجرد تسجيل الأخطاء - بل يجب جمع مقاييس أداء مخصصة، وإعداد تنبيهات ذكية، وبناء لوحات معلومات للتحليل التنبؤي. في هذه المقالة، سننظر في كيفية تنفيذ مراقبة احترافية لتطبيقات TypeScript باستخدام الأدوات الحديثة وأفضل الممارسات.
\n\n1. جمع مقاييس الأداء المخصصة
\nغالبًا لا تعطي المقاييس الأساسية (وحدة المعالجة المركزية، الذاكرة) صورة كاملة. بالنسبة لتطبيقات TypeScript، تعتبر مقاييس الأعمال ومقاييس وقت التشغيل بالغة الأهمية. سننظر في إعداد جمع المقاييس المخصصة باستخدام مكتبة prom-client (عميل Prometheus لـ Node.js).
أنواع المقاييس المخصصة
\n- \n
- Counter (عداد) - لحساب الأحداث (الطلبات، الأخطاء). \n
- Gauge (مقياس) - للقيم التي يمكن أن تزيد وتنقص (عدد الاتصالات النشطة). \n
- Histogram (مدرج تكراري) - لتوزيع القيم (وقت الاستجابة). \n
- Summary (ملخص) - للكميات المئوية لوقت التنفيذ. \n
مثال: تسجيل المقاييس المخصصة في TypeScript
\nimport client from 'prom-client';\nimport express, { Request, Response } from 'express';\n\n// إنشاء سجل المقاييس\nconst register = new client.Registry();\nclient.collectDefaultMetrics({ register });\n\n// عداد الأخطاء المخصص\nconst errorCounter = new client.Counter({\n name: 'app_errors_total',\n help: 'Total number of application errors',\n labelNames: ['type', 'code'],\n registers: [register],\n});\n\n// مدرج تكراري لوقت الاستجابة\nconst httpRequestDuration = new client.Histogram({\n name: 'http_request_duration_seconds',\n help: 'Duration of HTTP requests in seconds',\n labelNames: ['method', 'route', 'status'],\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 2, 5],\n registers: [register],\n});\n\n// مقياس المستخدمين النشطين\nconst activeUsers = new client.Gauge({\n name: 'active_users_count',\n help: 'Number of currently active users',\n labelNames: ['user_type'],\n registers: [register],\n});\n\nconst app = express();\n\n// Middleware لقياس وقت الطلبات\napp.use((req: Request, res: Response, next) => {\n const end = httpRequestDuration.startTimer();\n res.on('finish', () => {\n end({ method: req.method, route: req.path, status: res.statusCode });\n });\n next();\n});\n\n// نقطة نهاية للمقاييس\napp.get('/metrics', async (req: Request, res: Response) => {\n res.set('Content-Type', register.contentType);\n res.end(await register.metrics());\n});\n\n// محاكاة خطأ\napp.get('/error', (req: Request, res: Response) => {\n errorCounter.inc({ type: 'validation', code: '400' });\n res.status(400).send('Bad Request');\n});\n\napp.listen(3000, () => console.log('Server on port 3000'));\n\n2. التكامل مع Prometheus و Grafana
\nيجب تصدير المقاييس المجمعة وتصورها. سيقوم Prometheus باستقصاء نقطة النهاية /metrics الخاصة بنا، بينما ستعرض Grafana البيانات على لوحات المعلومات.
تكوين Prometheus لتطبيق TypeScript
\n# prometheus.yml\nglobal:\n scrape_interval: 15s\nscrape_configs:\n - job_name: 'typescript-app'\n static_configs:\n - targets: ['localhost:3000']\n metrics_path: '/metrics'\n # إضافة تسميات البيئة\n relabel_configs:\n - source_labels: [__address__]\n target_label: instance\n regex: '([^:]+):.*'\n replacement: '${1}'\n\nاستعلامات PromQL المتقدمة للتحليل
\n- \n
rate(app_errors_total[5m])- معدل الأخطاء خلال 5 دقائق. \nhistogram_quantile(0.95, rate(http_request_durati