ما هي المراقبة (Observability) ولماذا يحتاجها مطور Swift؟
\n\nهل سبق لك أن حاولت فهم سبب بطء تطبيق Swift الخاص بك على iOS في شاشة الملف الشخصي تحديدًا، أو سبب استجابة الجزء الخادم (Vapor) بتأخير 3 ثوانٍ فقط للمستخدمين في أوروبا؟ إذا كان الأمر كذلك، فقد واجهت المشكلة التي يحلها المراقبة (Observability).
\n\nالمراقبة ليست مجرد "تسجيل". إنها القدرة على طرح أي أسئلة على النظام حول حالته دون الحاجة إلى كتابة كود جديد. الركائز الثلاث للمراقبة هي: التتبع (Tracing)، المقاييس (Metrics)، والسجلات (Logs). معًا، يعطون صورة كاملة عما يحدث: من طلب المستخدم إلى التنفيذ داخل قاعدة البيانات.
\n\nفي هذه المقالة، سنشرح كيفية تطبيق المراقبة في مشاريع Swift - سواء على العميل (iOS) أو على الخادم (Vapor / Hummingbird). ستتعرف على المكتبات التي يجب استخدامها، وكيفية كتابة تتبعات ومقاييس فعالة، وكيف لا تغرق في السجلات.
\n\nلماذا Swift مرشح مثالي للمراقبة؟
\n\nSwift هي لغة ذات كتابة قوية، وأداء بمستوى لغة C، ونظام بيئي متزايد لتطوير الخوادم. ولكن هناك فارق بسيط: مجتمع Swift بدأ للتو في تبني المراقبة بنشاط. على عكس Java أو Go، حيث أصبح OpenTelemetry معيارًا، فإن عالم المراقبة في Swift هو اتجاه جديد يمنح المتبنين الأوائل ميزة هائلة.
\n\nالتحديات الرئيسية لمطور Swift:
\n- \n
- التزامن غير المتزامن: async/await و Structured Concurrency يغيران قواعد اللعبة للتتبع. \n
- تعدد المنصات: يمكن تشغيل كود Swift على iOS و macOS والخادم وحتى الأنظمة المضمنة. \n
- غياب معيار موحد: لا يوجد "حل سحري" حتى الآن كما في عالم Java. \n
لكن الخبر السار هو أن Swift يوفر جميع الأدوات اللازمة لبناء مراقبة موثوقة - ما عليك سوى معرفة أين تبحث.
\n\nالتتبع (Tracing) في Swift: من الطلب إلى الاستجابة
\n\nما هو التتبع ولماذا هو مطلوب؟
\nالتتبع (أو التتبع الموزع) يسمح بتتبع مسار طلب واحد عبر جميع الخدمات والوظائف في التطبيق. في عالم الخدمات المصغرة، هذا لا غنى عنه. ولكن حتى في تطبيق iOS المتجانس، يساعد التتبع في فهم أي جزء من الكود هو سبب البطء.
\n\nOpenTelemetry Swift: أداتك الرئيسية
\nOpenTelemetry هو معيار مفتوح للمراقبة. بالنسبة لـ Swift، توجد حزمة opentelemetry-swift. وهي تدعم التتبع والمقاييس والسجلات، بالإضافة إلى تصدير البيانات إلى أي نظام خلفي (Jaeger, Prometheus, Grafana).
التثبيت عبر Swift Package Manager:
\n// Package.swift\n.package(url: "https://github.com/open-telemetry/opentelemetry-swift.git", from: "1.10.0")\n\nكتابة أول تتبع (Trace) في Swift
\nتخيل أن لديك وظيفة لتحميل ملف المستخدم الشخصي. بدون تتبع، ترى فقط وقت التنفيذ الإجمالي. مع التتبع، ترى كل خطوة:
\n\nimport OpenTelemetryApi\nimport OpenTelemetrySdk\n\nlet tracer = OpenTelemetry.instance.tracerProvider.get(\n instrumentationName: "ProfileModule",\n instrumentationVersion: "1.0.0"\n)\n\nfunc loadUserProfile(userId: String) async throws -> UserProfile {\n let span = tracer.spanBuilder(spanName: "loadUserProfile")\n .setAttribute(key: "user.id", value: userId)\n .startSpan()\n \n defer {\n span.end()\n }\n \n // الخطوة 1: التحقق من الذاكرة المخبأة\n let cacheSpan = tracer.spanBuilder(spanName: "checkCache").startSpan()\n let cached = checkCache(for: userId)\n cacheSpan.end()\n \n if let cachedProfile = cached {\n span.setAttribute(key: "cache.hit", value: true)\n return cachedProfile\n }\n \n // الخطوة 2: طلب API\n let apiSpan = tracer.spanBuilder(spanName: "fetchFromAPI").startSpan()\n let profile = try await api.fetchPro