مقاييس Prometheus في Swift (iOS/macOS): مراقبة التطبيقات المحمولة وسطح المكتب
\n\nPrometheus هو نظام مراقبة وتنبيه مفتوح المصدر يجمع المقاييس في شكل سلاسل زمنية. في نظام Apple البيئي (iOS وmacOS)، يتيح استخدام Prometheus تتبع أداء التطبيقات، سلوك المستخدمين، حالة الشبكة، والمؤشرات الهامة الأخرى. في هذه المقالة، سننظر في كيفية دمج مقاييس Prometheus في مشاريع Swift، وما هي المكتبات المتاحة لذلك، وكيفية إعداد تصدير البيانات.
\n\nلماذا نحتاج مقاييس Prometheus في التطبيقات المحمولة؟
\n\nغالبًا ما تعمل التطبيقات المحمولة وسطح المكتب في ظروف موارد محدودة واتصال غير مستقر. يساعد جمع المقاييس في:
\n- \n
- تحديد نقاط الضعف في الأداء (تأخيرات واجهة المستخدم، تسرب الذاكرة) \n
- تتبع تكرار وأنواع الأخطاء (الأعطال، أخطاء الشبكة) \n
- تحليل سلوك المستخدم (مدة الجلسة، الشاشات) \n
- إعداد التنبيهات للقيم الحرجة (مثل وقت استجابة API > 5 ثوانٍ) \n
الأنواع الرئيسية لمقاييس Prometheus
\n\nيدعم Prometheus أربعة أنواع رئيسية من المقاييس التي يمكن تنفيذها في Swift:
\n\n- \n
- Counter (عداد) — قيمة متزايدة بشكل رتيب (عدد الطلبات، الأخطاء) \n
- Gauge (مقياس) — قيمة عشوائية يمكن أن تزيد وتنقص (الذاكرة الحالية، المستخدمون النشطون) \n
- Histogram (رسم بياني) — توزيع القيم عبر فترات زمنية محددة (وقت تنفيذ الدوال) \n
- Summary (ملخص) — توزيع مع الشرائح المئوية (التأخيرات) \n
مكتبات Swift
\n\nحاليًا، المكتبة الأكثر شيوعًا للعمل مع Prometheus في Swift هي SwiftPrometheus. توفر واجهة برمجة تطبيقات بسيطة لإنشاء وتسجيل المقاييس، كما تدعم التصدير بتنسيق متوافق مع Prometheus.
\n\nالتثبيت عبر Swift Package Manager:
\n// Package.swift\ndependencies: [\n .package(url: "https://github.com/reddavis/SwiftPrometheus.git", from: "1.0.0")\n]\n\nأمثلة على الكود في Swift
\n\n1. إنشاء عداد لطلبات API
\n\nimport SwiftPrometheus\n\nlet prometheus = Prometheus()\nlet apiRequests = prometheus.createCounter(\n named: "api_requests_total",\n help: "Total number of API requests",\n labels: ["endpoint"]\n)\n\n// الزيادة عند كل طلب\napiRequests.inc(["endpoint": "/users"])\napiRequests.inc(["endpoint": "/posts"])\n\n2. Gauge لتتبع الذاكرة
\n\nlet memoryGauge = prometheus.createGauge(\n named: "app_memory_bytes",\n help: "Current memory usage in bytes"\n)\n\n// التحديث عند تغير الذاكرة\nmemoryGauge.set(Double(reportMemoryUsage()))\n\n3. رسم بياني لوقت تحميل البيانات
\n\nlet loadDuration = prometheus.createHistogram(\n named: "data_load_duration_seconds",\n help: "Histogram of data loading time",\n buckets: [0.1, 0.5, 1.0, 2.0, 5.0]\n)\n\nlet start = CFAbsoluteTimeGetCurrent()\n// ... تحميل البيانات\nlet elapsed = CFAbsoluteTimeGetCurrent() - start\nloadDuration.observe(elapsed)\n\nتصدير المقاييس إلى Prometheus
\n\nلكي يتمكن Prometheus من جمع المقاييس، يجب أن يوفر تطبيقك نقطة نهاية تعيد البيانات بتنسيق نصي (plain text exposition format). بالنسبة لـ iOS/macOS، يمكن القيام بذلك عبر خادم HTTP محلي (على سبيل المثال، باستخدام Network.framework أو مكتبات خارجية).
مثال على خادم HTTP بسيط للتصدير:
\n\nimport SwiftPrometheus\nimport Network\n\nclass MetricsServer {\n let prometheus: Prometheus\n var listener: NWListener?\n \n init(prometheus: Prometheus, port: UInt16 = 9090) {\n self.prometheus = prometheus\n startServer(port: p