مراقبة تطبيقات TypeScript: من الأخطاء إلى الأداء
مراقبة تطبيقات TypeScript هي مجموعة من الممارسات والأدوات التي تضمن مراقبة (observability) النظام في الوقت الفعلي. على عكس التسجيل البسيط، تتضمن المراقبة الاحترافية جمع المقاييس، تتبع الطلبات، تجميع الأخطاء والتنبيه التلقائي. بالنسبة لـ TypeScript، الذي يعمل على الخادم (Node.js) وفي المتصفح، من المهم جداً وجود نظام مراقبة موحد. في هذه المقالة، سنستعرض الأدوات الرئيسية وأمثلة على دمجها.
لماذا مراقبة تطبيقات TypeScript؟
يتم تجميع TypeScript إلى JavaScript، مما يفرض خصائص معينة على التصحيح. يتحول الكود المصدري مع الأنواع إلى JS ديناميكي، وقد تظهر أخطاء الأنواع فقط في وقت التشغيل. بدون مراقبة، فإنك تخاطر بـ:
- تفويت
TypeErrorأوReferenceErrorفي بيئة الإنتاج - عدم ملاحظة تدهور الأداء (طلبات بطيئة، تسرب الذاكرة)
- فقدان سياق الخطأ (تتبع المكدس، بيانات المستخدم، البيئة)
المكونات الرئيسية لنظام المراقبة
يعتمد نظام المراقبة الحديث على ثلاث ركائز: السجلات (logs)، المقاييس (metrics)، والتتبعات (traces). بالنسبة لتطبيقات TypeScript، سننظر في مكتبات محددة:
1. Sentry — ملك تتبع الأخطاء
Sentry هي منصة SaaS لمراقبة الأخطاء والأداء. بالنسبة لـ TypeScript، تتوفر الحزمة الرسمية @sentry/node و @sentry/react. تقوم تلقائياً باعتراض الاستثناءات، وجمع تتبعات المكدس والسياق.
التثبيت:
npm install @sentry/node @sentry/tracingالتهيئة الأساسية في Node.js:
import * as Sentry from '@sentry/node';import { ProfilingIntegration } from '@sentry/profiling-node';
Sentry.init({ dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0', integrations: [new ProfilingIntegration()], tracesSampleRate: 1.0, // معدل جمع التتبعات (0-1) profilesSampleRate: 1.0, // تحليل الأداء});
// استدعاء يدوي عند حدوث خطأapp.get('/api/users', async (req, res) => { try { const users = await getUsers(); res.json(users); } catch (error) { Sentry.captureException(error); res.status(500).send('Internal Server Error'); }});المزايا:
- ربط تلقائي للأخطاء بالإصدارات
- دعم خرائط المصدر (source maps) لـ TypeScript
- الأداء: مراقبة المعاملات البطيئة
2. OpenTelemetry — معيار المراقبة
OpenTelemetry (OTel) هو معيار مفتوح لجمع القياسات عن بعد. بالنسبة لـ TypeScript، يتم استخدام الحزمة @opentelemetry/sdk-node. يسمح OTel بجمع التتبعات والمقاييس، ثم إرسالها إلى أي نظام (Jaeger، Prometheus، Datadog).
مثال على الدمج مع Express:
import { NodeSDK } from '@opentelemetry/sdk-node';import { getNodeAutoInstrumentations } from '@opentelemetry/instrumentation-node';
const sdk = new NodeSDK({ instrumentations: [getNodeAutoInstrumentations()], // يمكن تكوين المُصدّر على OTLP أو وحدة التحكم});
sdk.start();
// يتم تتبع منطق Express تلقائياًimport express from 'express';const app = express();app.get('/data', (req, res) => { res.json({ status: 'ok' });});يقوم OpenTelemetry تلقائياً بأتمتة المكتبات الشائعة: Express، MongoDB، Redis، gRPC. وهذا يعطي صورة كاملة لمسار الطلب عبر الخدمات.
3. Prometheus + Grafana — المقاييس والتصور
لجمع المقاييس (RPS، زمن الاستجابة، الأخطاء) في TypeScript، يتم استخدام مكتبة