مقاييس Prometheus في TypeScript: دليل شامل
\n\nPrometheus هو نظام مفتوح المصدر للمراقبة والتنبيه، يقوم بجمع المقاييس من تطبيقاتك في الوقت الفعلي. في هذه المقالة، سنستعرض كيفية دمج مقاييس Prometheus في تطبيقات TypeScript باستخدام مكتبة prom-client. ستتعلم كيفية إنشاء المقاييس وتسجيلها وتصديرها، بالإضافة إلى إعداد نقطة نهاية لجمع البيانات.
ما هي مقاييس Prometheus؟
\n\nيعمل Prometheus وفق نموذج السحب (pull-model): حيث يقوم بشكل دوري باستقصاء (scrape) نقاط النهاية في تطبيقك للحصول على المقاييس. تنقسم المقاييس إلى عدة أنواع رئيسية:
\n\n- \n
- Counter (عداد) — يزداد فقط (مثل عدد الطلبات). \n
- Gauge (مقياس) — يمكن أن يزداد وينخفض (مثل عدد المستخدمين النشطين حاليًا). \n
- Histogram (مدرج تكراري) — يقيس توزيع القيم (مثل وقت الاستجابة). \n
- Summary (ملخص) — يشبه المدرج التكراري، لكنه يحسب الشرائح المئوية (quantiles) من جانب العميل. \n
تثبيت prom-client في TypeScript
\n\nللعمل مع Prometheus في TypeScript، سنستخدم المكتبة الرسمية prom-client. قم بتثبيتها عبر npm:
npm install prom-client\n\nقم أيضًا بتثبيت الأنواع الخاصة بـ TypeScript:
\n\nnpm install @types/prom-client --save-dev\n\nإنشاء وتسجيل المقاييس
\n\nلننظر إلى مثال أساسي لإنشاء المقاييس. قم بإنشاء ملف metrics.ts:
import client from 'prom-client';\n\n// إنشاء سجل للمقاييس (يتم استخدام السجل العام افتراضيًا)\nconst register = new client.Registry();\n\n// إضافة المقاييس الافتراضية (مثل الذاكرة، وحدة المعالجة المركزية)\nclient.collectDefaultMetrics({ register });\n\n// إنشاء عداد (Counter) لحساب الطلبات\nconst httpRequestsTotal = new client.Counter({\n name: 'http_requests_total',\n help: 'Total number of HTTP requests',\n labelNames: ['method', 'status', 'path'],\n registers: [register],\n});\n\n// إنشاء مقياس (Gauge) للاتصالات النشطة\nconst activeConnections = new client.Gauge({\n name: 'active_connections',\n help: 'Number of active connections',\n registers: [register],\n});\n\n// إنشاء مدرج تكراري (Histogram) لوقت الاستجابة\nconst httpRequestDuration = new client.Histogram({\n name: 'http_request_duration_seconds',\n help: 'Duration of HTTP requests in seconds',\n labelNames: ['method', 'path'],\n buckets: [0.01, 0.05, 0.1, 0.5, 1, 5],\n registers: [register],\n});\n\nexport { register, httpRequestsTotal, activeConnections, httpRequestDuration };\n\nاستخدام المقاييس في تطبيق Express
\n\nالآن، لننشئ تطبيق Express بسيطًا بلغة TypeScript يستخدم مقاييسنا:
\n\nimport express from 'express';\nimport { register, httpRequestsTotal, activeConnections, httpRequestDuration } from './metrics';\n\nconst app = express();\nconst port = 3000;\n\n// Middleware لحساب وقت الطلب\napp.use((req, res, next) => {\n const end = httpRequestDuration.startTimer({ method: req.method, path: req.path });\n activeConnections.inc();\n\n res.on('finish', () => {\n httpRequestsTotal.inc({ method: req.method, status: res.statusCode.toString(), path: req.path });\n activeConnections.dec();\n end();\n });\n\n next();\n});\n\n// نقطة نهاية لـ Prometheus\napp.get('/metrics', async (req, res) => {\n res.set('Content-Type', register.contentType);\n res.end(await register.metrics());\n});\n\n// مثال لنقطة نهاية\napp.get('/', (req, res) => {\n res.send('Hello, Prometheus!');\n});\n\napp.listen(port, () => {\n console.log(`Server running at http://localhost:${port}`);\n});\n\nالتشغيل والتحقق
\n\nقم بتشغيل التطبيق:
\n\nnpx ts-node app.ts\n\nافتح في