مقدمة: لماذا تعتبر المراقبة أمرًا حيويًا لتطبيقات C#
\n\nفي تطوير البرمجيات الحديثة، كتابة الكود ليست سوى نصف المهمة. لكي يعمل التطبيق بشكل مستقر وسريع وقابل للتنبؤ، هناك حاجة إلى مراقبة مستمرة. بالنسبة لتطبيقات C# (.NET)، التي تُستخدم غالبًا في الأنظمة المؤسسية عالية التحميل والقطاع المصرفي والتجارة الإلكترونية والخدمات السحابية، تصبح المراقبة ليست مجرد خيار بل متطلبًا إلزاميًا.
\n\nبدون مراقبة، أنت تعمل بشكل أعمى: تظل تسريبات الذاكرة غير مكتشفة حتى تعطل الخادم، وتتراكم الطلبات البطيئة، ويغادر المستخدمون إلى المنافسين. في هذه المقالة، سنشرح دورة كاملة لإعداد قابلية المراقبة (observability) لتطبيقات C#: من جمع المقاييس الأساسية إلى إعداد التنبيهات الذكية في الوقت الفعلي.
\n\n1. أساسيات المراقبة: ما المقاييس التي يجب جمعها في .NET
\n\nقبل إعداد الأدوات، من المهم فهم المقاييس المهمة حقًا لتطبيقات C#. سنقسمها إلى ثلاث مجموعات:
\n\n1.1. مقاييس النظام (مستوى البنية التحتية)
\n- \n
- CPU و Memory — تحميل المعالج واستهلاك الذاكرة العشوائية لعملية dotnet. \n
- GC (Garbage Collection) — تكرار ومدة عمليات جمع القمامة، حجم الأكوام (Gen0, Gen1, Gen2, LOH). \n
- Thread Pool — عدد الخيوط النشطة والحرة والمنتظرة. \n
- Disk I/O و Network — القراءة/الكتابة على القرص، الاتصالات الشبكية. \n
1.2. مقاييس الأعمال (مستوى التطبيق)
\n- \n
- Request Rate — عدد الطلبات في الثانية (RPS). \n
- Latency — وقت الاستجابة (النسب المئوية p50, p95, p99). \n
- Error Rate — نسبة أخطاء 4xx و 5xx. \n
- Active Users — عدد المستخدمين النشطين في وقت واحد. \n
1.3. مقاييس .NET Runtime
\n- \n
- JIT Compilation — وقت ترجمة الطرق. \n
- Assembly Loading — عدد التجميعات المحملة. \n
- Exceptions — عدد الاستثناءات الملقاة في الثانية. \n
لجمع هذه المقاييس في .NET، تُستخدم أداة قوية — System.Diagnostics.Metrics (API مدمج منذ .NET 6+) ومكتبة OpenTelemetry.
\n\n2. إعداد جمع المقاييس باستخدام OpenTelemetry و Prometheus
\n\nأفضل طريقة لتنظيم مراقبة تطبيق C# هي استخدام مجموعة OpenTelemetry (جمع المقاييس) + Prometheus (التخزين) + Grafana (التصور). دعنا نستعرض الإعداد خطوة بخطوة.
\n\n2.1. تثبيت حزم NuGet
\nأضف الحزم التالية إلى المشروع:
\ndotnet add package OpenTelemetry.Extensions.Hosting\ndotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore\ndotnet add package OpenTelemetry.Instrumentation.AspNetCore\ndotnet add package OpenTelemetry.Instrumentation.Runtime\n\n2.2. التكوين في Program.cs
\nقم بإعداد OpenTelemetry لجمع مقاييس ASP.NET Core و .NET Runtime تلقائيًا:
\nusing OpenTelemetry.Metrics;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddOpenTelemetry()\n .WithMetrics(metrics => metrics\n .AddAspNetCoreInstrumentation() // مقاييس طلبات HTTP\n .AddRuntimeInstrumentation() // مقاييس GC, JIT, ThreadPool\n .AddPrometheusExporter()); // التصدير إلى Prometheus\n\nvar app = builder.Build();\n\napp.UseOpenTelemetryPrometheusScrapingEndpoint(); // نقطة النهاية /metrics\n\napp.Run();\n\nالآن، سيكون عنوان http://localhost:5000/metrics متاحًا كنقطة نهاية تحتوي على المقاييس بتنسيق Prometheus.
2.3. إنشاء مقاييس مخصصة
\nدعنا نضيف مقياس أعمال — عداد للطلبات المعالجة:
\npublic class OrderMetrics\