مقاييس Prometheus في TypeScript: دليل شامل للمراقبة

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

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

ابدأ الدورة

مقاييس Prometheus في TypeScript: دليل شامل

\n\n

Prometheus هو نظام مفتوح المصدر للمراقبة والتنبيه، يقوم بجمع المقاييس من تطبيقاتك في الوقت الفعلي. في هذه المقالة، سنستعرض كيفية دمج مقاييس Prometheus في تطبيقات TypeScript باستخدام مكتبة prom-client. ستتعلم كيفية إنشاء المقاييس وتسجيلها وتصديرها، بالإضافة إلى إعداد نقطة نهاية لجمع البيانات.

\n\n

ما هي مقاييس Prometheus؟

\n\n

يعمل Prometheus وفق نموذج السحب (pull-model): حيث يقوم بشكل دوري باستقصاء (scrape) نقاط النهاية في تطبيقك للحصول على المقاييس. تنقسم المقاييس إلى عدة أنواع رئيسية:

\n\n
    \n
  • Counter (عداد) — يزداد فقط (مثل عدد الطلبات).
  • \n
  • Gauge (مقياس) — يمكن أن يزداد وينخفض (مثل عدد المستخدمين النشطين حاليًا).
  • \n
  • Histogram (مدرج تكراري) — يقيس توزيع القيم (مثل وقت الاستجابة).
  • \n
  • Summary (ملخص) — يشبه المدرج التكراري، لكنه يحسب الشرائح المئوية (quantiles) من جانب العميل.
  • \n
\n\n

تثبيت prom-client في TypeScript

\n\n

للعمل مع Prometheus في TypeScript، سنستخدم المكتبة الرسمية prom-client. قم بتثبيتها عبر npm:

\n\n
npm install prom-client
\n\n

قم أيضًا بتثبيت الأنواع الخاصة بـ TypeScript:

\n\n
npm install @types/prom-client --save-dev
\n\n

إنشاء وتسجيل المقاييس

\n\n

لننظر إلى مثال أساسي لإنشاء المقاييس. قم بإنشاء ملف metrics.ts:

\n\n
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\n
import 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\n
npx ts-node app.ts
\n\n

افتح في

توصيات