مراقبة تطبيقات C#: المقاييس والتنبيهات على مستوى متقدم
\n\nفي التطوير الحديث باستخدام C# (.NET)، لم يعد مجرد تطبيق "يعمل" معيارًا كافيًا للجودة. تتطلب أنظمة الإنتاج مراقبة مستمرة: تحتاج إلى معرفة مقدار الذاكرة التي يستهلكها الخدمة، ومدى سرعة معالجة الطلبات، وما إذا كان قائمة انتظار وسيط الرسائل في ازدياد. بدون نظام مراقبة وتنبيهات، فإنك تخاطر بمعرفة المشكلة فقط من المستخدمين. في هذه المقالة، سنستعرض التقنيات المتقدمة لجمع المقاييس وتصورها وإعداد التنبيهات لتطبيقات C# باستخدام أدوات حديثة مثل Prometheus و Grafana و OpenTelemetry.
\n\nلماذا نحتاج إلى مراقبة متقدمة؟
\nالمراقبة الأساسية (CPU، RAM، القرص) لا تعطي صورة كاملة. بالنسبة لتطبيقات C#، تعتبر المقاييس المحددة حاسمة: عدد عمليات جمع القمامة (GC)، وقت حظر الخيوط، حجم مجموعة اتصالات قاعدة البيانات. تتيح التنبيهات على هذه المقاييس الاستجابة قبل حدوث الفشل. يتضمن النهج المتقدم ثلاثة مستويات:
\n- \n
- مستوى البنية التحتية — المقاييس القياسية للخادم. \n
- مستوى التطبيق — مقاييس منطق الأعمال (التأخيرات، الأخطاء، تكرار الاستدعاءات). \n
- مستوى الأعمال — المقاييس المرتبطة بالمجال (عدد الطلبات، معدل التحويل). \n
سنركز على مستوى التطبيق، الذي يعطي أكبر تأثير لمطوري C#.
\n\nجمع المقاييس باستخدام OpenTelemetry و Prometheus
\nOpenTelemetry (OTel) هو المعيار الفعلي لأدوات تطبيقات .NET. يتيح جمع المقاييس والتتبعات والسجلات عبر واجهة برمجة تطبيقات موحدة. لنلق نظرة على مثال للتكامل مع Prometheus.
\n\nقم بتثبيت حزم NuGet:
\ndotnet add package OpenTelemetry.Extensions.Hosting\ndotnet add package OpenTelemetry.Exporter.Prometheus.AspNetCore\ndotnet add package OpenTelemetry.Instrumentation.AspNetCore\n\nالإعداد في Program.cs:
using OpenTelemetry.Metrics;\n\nvar builder = WebApplication.CreateBuilder(args);\n\nbuilder.Services.AddOpenTelemetry()\n .WithMetrics(metrics => metrics\n .AddAspNetCoreInstrumentation()\n .AddRuntimeInstrumentation()\n .AddPrometheusExporter());\n\nvar app = builder.Build();\n\napp.MapPrometheusScrapingEndpoint(); // نقطة نهاية لـ Prometheus\n\napp.Run();\n\nالآن على العنوان /metrics، سيوفر خدمتك المقاييس بتنسيق Prometheus. من بينها: عدد طلبات HTTP، وقت معالجتها، مقاييس GC والذاكرة.
المقاييس المخصصة
\nللمقاييس التجارية، استخدم Meter و Counter:
using System.Diagnostics.Metrics;\n\npublic class OrderMetrics\n{\n private readonly Counter<int> _ordersCreated;\n\n public OrderMetrics(IMeterFactory meterFactory)\n {\n var meter = meterFactory.Create("MyApp.Orders");\n _ordersCreated = meter.CreateCounter<int>("orders.created.count");\n }\n\n public void OrderCreated() => _ordersCreated.Add(1);\n}\n\n// التسجيل في DI:\nbuilder.Services.AddSingleton<OrderMetrics>();\n\nسيتم تضمين هذه المقاييس تلقائيًا في Prometheus وستكون متاحة لبناء لوحات المعلومات في Grafana.
\n\nإعداد التنبيهات: من القواعد البسيطة إلى النظام متعدد المستويات
\nالمقاييس وحدها عديمة الفائدة بدون تنبيهات. في Prometheus، يتم إعداد التنبيهات عبر Alertmanager. لنلق نظرة على سيناريو متقدم: تنبيه لوقت استجابة API غير طبيعي.
قاعدة في Prometheus (alert.rules.yml)
\ngroups:\n - name: csharp_app_alerts\n rules:\n - alert: HighRequestLatency\n expr: |\n histogram_quantile(0.95, \n rate(http_server_duration_seconds_bucket[5m])\n ) > 2\n for: 2m\n labels:\n severity: critical\n annotations:\n summary: "زمن استجابة الطلبات مرتفع ({{ $value }}s)"\n descr