مقاييس Prometheus في C# (.NET): دليل شامل للتكامل
\n\nPrometheus هو نظام مراقبة مفتوح المصدر يقوم بجمع وتخزين المقاييس على شكل سلاسل زمنية. بالنسبة لمطوري C# (.NET)، يفتح التكامل مع Prometheus إمكانية تتبع أداء التطبيقات، مؤشرات الأعمال، وحالة النظام في الوقت الفعلي. في هذه المقالة، سنشرح كيفية ربط Prometheus بتطبيق .NET، والمكتبات التي يجب استخدامها، وكيفية إعداد المقاييس بشكل صحيح.
\n\nلماذا نحتاج مقاييس Prometheus في .NET؟
\nتتيح المراقبة باستخدام Prometheus ما يلي:
\n- \n
- تتبع عدد الطلبات، الأخطاء، ووقت الاستجابة. \n
- جمع مقاييس الأداء (وحدة المعالجة المركزية، الذاكرة، جامع القمامة). \n
- إنشاء مقاييس أعمال مخصصة (المستخدمون النشطون، الطلبات).
- التكامل مع Grafana لتصور لوحات المعلومات.
- إعداد التنبيهات بناءً على قيم العتبة.
مكتبة prometheus-net
\nالمكتبة الرئيسية للعمل مع Prometheus في .NET هي prometheus-net. وهي تدعم ASP.NET Core، .NET Core، .NET Framework و gRPC. التثبيت عبر NuGet:
\ndotnet add package prometheus-net\nلـ ASP.NET Core، قم بتثبيت الحزمة الإضافية:
\ndotnet add package prometheus-net.AspNetCore\n\nأنواع المقاييس في Prometheus
\nتدعم المكتبة جميع أنواع المقاييس القياسية:
\n- \n
- Counter — عداد يزداد فقط (عدد الطلبات).
- Gauge — قيمة يمكن أن تزيد وتنقص (درجة الحرارة الحالية).
- Histogram — رسم بياني لقياس توزيع القيم (وقت الاستجابة).
- Summary — كميات مئوية لتجميع البيانات (p95، p99).
مثال: Counter أساسي
\nلننشئ مقياسًا يحسب عدد الطلبات إلى نقطة النهاية:
\nusing Prometheus;\n\npublic class MetricsService\n{\n private static readonly Counter RequestCount = Metrics\n .CreateCounter("app_requests_total", "إجمالي عدد الطلبات", new CounterConfiguration\n {\n LabelNames = new[] { "method", "endpoint" }\n });\n\n public void RecordRequest(string method, string endpoint)\n {\n RequestCount.WithLabels(method, endpoint).Inc();\n }\n}\nفي وحدة التحكم ASP.NET Core، سيكون الاستدعاء كالتالي:
\n[ApiController]\n[Route("api/order")]\npublic class OrderController : ControllerBase\n{\n private readonly MetricsService _metrics;\n\n public OrderController(MetricsService metrics) => _metrics = metrics;\n\n [HttpGet]\n public IActionResult GetOrders()\n {\n _metrics.RecordRequest("GET", "/api/order");\n return Ok(new { orders = new[] { "order1", "order2" } });\n }\n}\n\nمثال: Gauge للمستخدمين النشطين
\nprivate static readonly Gauge ActiveUsers = Metrics\n .CreateGauge("app_active_users", "عدد المستخدمين النشطين");\n\npublic void UserLoggedIn() => ActiveUsers.Inc();\npublic void UserLoggedOut() => ActiveUsers.Dec();\n\nمثال: Histogram لوقت الاستجابة
\nprivate static readonly Histogram RequestDuration = Metrics\n .CreateHistogram("app_request_duration_seconds", "مدة الطلب بالثواني",\n new HistogramConfiguration\n {\n Buckets = Histogram.ExponentialBuckets(0.001, 2, 10) // من 1 مللي ثانية إلى ~1 ثانية\n });\n\npublic void RecordRequestDuration(double seconds)\n{\n RequestDuration.Observe(seconds);\n}\n\nتصدير المقاييس في ASP.NET Core
\nلكي يتمكن Prometheus من جمع المقاييس، يجب إضافة نقطة نهاية /metrics. في Program.cs:
using Prometheus;\n\nvar builder = WebApplication.CreateBuilder(args);\nbuilder.Services.AddCont